Linux下调节CPU使用的几种方法

1.使用taskset充分利用多核cpu,让cpu的使用率均衡到每个cpu上

  • taskset
-p,    设定一个已存在的pid,而不是重新开启一个新任务
-c,    指定一个处理,可以指定多个,以逗号分隔,也可指定范围,如:2,4,5,6-81,切换某个进程到指定的cpu上
taskset -cp 3 13290

2,让某程序运行在指定的cpu上
taskset -c 1,2,4-7 tar jcf test.tar.gz test
  • 需要注意的是,taskset -cp 3 13290在设定一个已经存在的pid时,子进程并不会继承父进程的,
  • 因此像tar zcf xxx.tar.gz xxx这样的命令,最好在启动时指定cpu,如果在已经启动的情况下,则需要指定tar调用的gzip进程。

2.使用nice和renice设置程序执行的优先级

  • 格式:nice [-n 数值] 命令
    nice 指令可以改变程序执行的优先权等级。指令让使用者在执行程序时,指定一个优先等级,称之为 nice 值。
    这个数值从最高优先级的-20到最低优先级的19。负数值只有 root 才有权力使。
    一般使用者,也可使用 nice 指令来做执行程序的优先级管理,但只能将nice值越调越高。

-可以通过二种方式来给某个程序设定nice值:
(1)开始执行程序时给定一个nice值,用nice命令
(2)调整某个运行中程序的PID的nice值,用renice命令
通常通过调高nice值来备份,为的是不占用非常多的系统资源。

  • eg:
nice -n 10 tar zcf test.tar.gz test
由nice启动的程序,其子进程会继承父进程的nice值。

查看nice值
# nice -n -6 vim test.txt &
# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 19427  2637  0  75   016551 wait   pts/6    00:00:00 bash
4 T     0 21654 19427  0  71  -623464 finish pts/6    00:00:00 vim

renice调整运行中程序的nice值
格式:renice [nice值] PID

3.使用ulimit限制cpu占用时间(不推荐)

  • 注意,ulimit 限制的是当前shell进程以及其派生的子进程。因此可以在脚本中调用ulimit来限制cpu使用时间。
  • eg:限制tar的cpu占用时间,单位秒。
# cat limit_cpu.sh
ulimit -SHt 100
tar test.tar.gz test

如果tar占用时间超过了100秒,tar将会退出,这可能会导致打包不完全,因此不推荐使用ulimit对cpu占用时间进行限制。
另外,通过修改系统的/etc/security/limits配置文件,可以针对用户进行限制。

4.使用程序自带的对cpu使用调整的功能

  • 某些程序自带了对cpu使用调整的功能,比如nginx服务器,通过其配置文件,可以为工作进程指定cpu,如下:
worker_processes  3;
worker_cpu_affinity 0001 0010 0100 1000;

这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗cpu核心,这就使得cpu的使用比较平均到每个核心上。

5.CPU优化

  • 应用程序优化
    首先,从应用程序的角度来说,降低 CPU 使用率的最好方法当然是,排除所有不必要的工作,只保留最核心的逻辑。比如减少循环的层次、减少递归、减少动态内存分配等等。除此之外,应用程序的性能优化也包括很多种方法,我在这里列出了最常见的几种,你可以记下来。
    (1)编译器优化:很多编译器都会提供优化选项,适当开启它们,在编译阶段你就可以获得编译器的帮助,来提升性能。比如, gcc 就提供了优化选项 -O2,开启后会自动对应用程序的代码进行优化。
    (2)算法优化:使用复杂度更低的算法,可以显著加快处理速度。比如,在数据比较大的情况下,可以用 O(nlogn) 的排序算法(如快排、归并排序等),代替 O(n^2) 的排序算法(如冒泡、插入排序等)。
    (3)异步处理:使用异步处理,可以避免程序因为等待某个资源而一直阻塞,从而提升程序的并发处理能力。比如,把轮询替换为事件通知,就可以避免轮询耗费 CPU 的问题。
    (4)多线程代替多进程:前面讲过,相对于进程的上下文切换,线程的上下文切换并不切换进程地址空间,因此可以降低上下文切换的成本。
    (5)善用缓存:经常访问的数据或者计算过程中的步骤,可以放到内存中缓存起来,这样在下次用时就能直接从内存中获取,加快程序的处理速度。

  • 系统优化
    从系统的角度来说,优化 CPU 的运行,一方面要充分利用 CPU 缓存的本地性,加速缓存访问;另一方面,就是要控制进程的 CPU 使用情况,减少进程间的相互影响。具体来说,系统层面的 CPU 优化方法也有不少,这里我同样列举了最常见的一些方法,方便你记忆和使用。
    (1)CPU 绑定:把进程绑定到一个或者多个 CPU 上,可以提高 CPU 缓存的命中率,减少跨 CPU 调度带来的上下文切换问题。- - CPU 独占:跟 CPU 绑定类似,进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程。这样,这些 CPU 就由指定的进程独占,换句话说,不允许其他进程再来使用这些 CPU。
    (2)优先级调整:使用 nice 调整进程的优先级,正值调低优先级,负值调高优先级。优先级的数值含义前面我们提到过,忘了的话及时复习一下。在这里,适当降低非核心应用的优先级,增高核心应用的优先级,可以确保核心应用得到优先处理。
    为进程设置资源限制:使用 Linux cgroups 来设置进程的 CPU 使用上限,可以防止由于某个应用自身的问题,而耗尽系统资源。
    (3)NUMA(Non-Uniform Memory Access)优化:支持 NUMA 的处理器会被划分为多个 node,每个 node 都有自己的本地内存空间。NUMA 优化,其实就是让 CPU 尽可能只访问本地内存。
    (4)中断负载均衡:无论是软中断还是硬中断,它们的中断处理程序都可能会耗费大量的 CPU。开启 irqbalance 服务或者配置 smp_affinity,就可以把中断处理过程自动负载均衡到多个 CPU 上。

  • 参考:Linux下调节CPU使用的几种方法Linux性能之CPU优化

要获取Linux系统各个CPU核心使用率,可以使用C语言编写程序,通过读取/proc/stat文件的信息来获取。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MAX_CPU_NUM 8 // 假设最多有8个CPU核心 int main() { int i; long int user1, nice1, sys1, idle1, iowait1, irq1, softirq1, steal1, guest1, guest_nice1; long int user2, nice2, sys2, idle2, iowait2, irq2, softirq2, steal2, guest2, guest_nice2; double usage[MAX_CPU_NUM]; while (1) { // 读取/proc/stat文件,获取CPU使用情况 FILE* fp = fopen("/proc/stat", "r"); if (fp == NULL) { perror("fopen"); exit(1); } fscanf(fp, "cpu %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n", &user1, &nice1, &sys1, &idle1, &iowait1, &irq1, &softirq1, &steal1, &guest1, &guest_nice1); fclose(fp); // 等待一段时间,再次读取/proc/stat文件,获取CPU使用情况 sleep(1); fp = fopen("/proc/stat", "r"); if (fp == NULL) { perror("fopen"); exit(1); } fscanf(fp, "cpu %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n", &user2, &nice2, &sys2, &idle2, &iowait2, &irq2, &softirq2, &steal2, &guest2, &guest_nice2); fclose(fp); // 计算每个CPU核心使用率 for (i = 0; i < MAX_CPU_NUM; i++) { double total1 = user1 + nice1 + sys1 + idle1 + iowait1 + irq1 + softirq1 + steal1 + guest1 + guest_nice1; double total2 = user2 + nice2 + sys2 + idle2 + iowait2 + irq2 + softirq2 + steal2 + guest2 + guest_nice2; double idle_delta = idle2 - idle1; double total_delta = total2 - total1; usage[i] = 100.0 * (1.0 - idle_delta / total_delta); user1 = user2; nice1 = nice2; sys1 = sys2; idle1 = idle2; iowait1 = iowait2; irq1 = irq2; softirq1 = softirq2; steal1 = steal2; guest1 = guest2; guest_nice1 = guest_nice2; } // 输出每个CPU核心使用率 for (i = 0; i < MAX_CPU_NUM; i++) { printf("CPU%d usage: %.2f%%\n", i, usage[i]); } printf("\n"); } return 0; } ``` 这个程序会不断循环读取/proc/stat文件,计算每个CPU核心使用率,并输出结果。注意,程序假设最多有8个CPU核心,如果实际系统CPU核心数不足8个,可以根据实际情况修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值