Linux系统调优——CPU(一)

时间:2021-05-08 16:32:36

(1).系统调优思路

  性能优化就是找到系统处理中的瓶颈以及去除这些的过程,性能优化其实是对OS 各子系统达到一种平衡的定义。具体步骤如下:

  1. 系统的运行状况:  CPU -> MEM  -> DISK->  NETWORK -> application

  2. 分析是否有瓶颈(依据当前应用需求)

  3. 调优(采取一定措施使变得优异)

  这些子系统之间关系是相互彼此依赖的,任何一个高负载都会导致其他子系统出现问题.比如:

    大量的网页调入请求导致内存队列的拥塞;

    网卡的大吞吐量可能导致更多的 CPU 开销;

    大量的 CPU 开销又会尝试更多的内存使用请求;

    大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO 问题;

  所以要对一个系统进行优化,查找瓶颈来自哪个方面是关键,虽然看似是某一个子系统出现问题,其实有可能是别的子系统导致的。调优就像医生看病,因此需要你对服务器所有地方都了解清楚。

(2).查看CPU负载相关工具

 1)uptime

[root@youxi1 ~]# uptime
 14:57:14 up 45 min,  1 user,  load average: 0.00, 0.01, 0.05

  说明如下:

14:57:14 当前系统时间
up 45 min 系统运行时间
1 user 当前登录用户数
load average: 0.00, 0.01, 0.05
平均负载,即任务队列的平均长度。三个数值分别是:1分钟前、5分钟前、15分钟前到现在的平均值

  详细查看:Linux命令之uptime

 2)top

  输入top命令,按下大写的P,可以使输出按照CPU的使用率进行排序。top命令使用在CPU方面时,可以查看到CPU的各种信息,但更多的是用于找出使用CPU最多的程序

Linux系统调优——CPU(一)

  详细查看:Linux命令之top

 3)ps

  按照实际使用CPU,从大到小显示所有进程列表。可以用于找出使用CPU最多的程序

[root@youxi1 ~]# ps aux --sort -pcpu | more  //按CPU降序排序
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 125348  3780 ?        Ss   14:12   0:01 /usr/lib/syste
md/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    14:12   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    14:12   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   14:12   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    14:12   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    14:12   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    14:12   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   14:12   0:00 [lru-add-drain
]
root         11  0.0  0.0      0     0 ?        S    14:12   0:00 [watchdog/0]
root         13  0.0  0.0      0     0 ?        S    14:12   0:00 [kdevtmpfs]
root         14  0.0  0.0      0     0 ?        S<   14:12   0:00 [netns]
root         15  0.0  0.0      0     0 ?        S    14:12   0:00 [khungtaskd]
root         16  0.0  0.0      0     0 ?        S<   14:12   0:00 [writeback]
root         17  0.0  0.0      0     0 ?        S<   14:12   0:00 [kintegrityd]
root         18  0.0  0.0      0     0 ?        S<   14:12   0:00 [bioset]
root         19  0.0  0.0      0     0 ?        S<   14:12   0:00 [kblockd]
root         20  0.0  0.0      0     0 ?        S<   14:12   0:00 [md]
--More--

  注意:pcpu前面有减号是降序,没有减号是升序。

 4)mpstat

  这个命令需要安装,直接yum安装就好。

[root@youxi1 ~]# yum -y install sysstat
[root@youxi1 ~]# mpstat
Linux 3.10.0-862.el7.x86_64 (youxi1) 2019年07月29日 _x86_64_ (1 CPU)

17时01分17秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
17时01分17秒 all 0.13 0.00 0.25 0.05 0.00 0.00 0.00 0.00 0.00 99.56

  说明如下:

CPU 处理器编号,all表示统计信息计算为所有处理器之间的平均值
%usr 显示在用户级(应用程序)执行时发生的CPU利用率百分比。也叫用户态
%nice 显示以优先级较高的用户级别执行时发生的CPU利用率百分比。
%sys

显示在系统级(内核)执行时发生的CPU利用率百分比。也叫内核态

注意:这不包括维护硬件和软件的时间中断。

%iowait 显示系统具有未完成磁盘I / O请求的CPU或CPU空闲的时间百分比。
%irq 显示CPU或CPU用于服务硬件中断的时间百分比。
%soft 显示CPU或CPU用于服务软件中断的时间百分比。
%steal 显示在虚拟机管理程序服务另一个虚拟处理器时虚拟CPU或CPU无意中等待的时间百分比。
%guest 显示CPU或CPU运行虚拟处理器所花费的时间百分比。
%gnice 显示CPU或CPU运行来宾所花费的时间百分比。
%idle 显示CPU或CPU空闲且系统没有未完成的磁盘I / O请求的时间百分比。

  使用mpstat -P ALL查看所有CPU运行状态

[root@youxi1 ~]# mpstat -P ALL
Linux 3.10.0-862.el7.x86_64 (youxi1)    2019年07月30日  _x86_64_        (1 CPU)

11时11分19秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11时11分19秒  all    0.09    0.00    0.23    0.07    0.00    0.00    0.00    0.00    0.00   99.61
11时11分19秒    0    0.09    0.00    0.23    0.07    0.00    0.00    0.00    0.00    0.00   99.61

  使用mpstat 1 10命令查看CPU运行状态,1秒刷新1次,连续刷新10次

[root@youxi1 ~]# mpstat 1 10
Linux 3.10.0-862.el7.x86_64 (youxi1)    2019年07月30日  _x86_64_        (1 CPU)

11时13分39秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11时13分40秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分41秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分42秒  all    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11时13分43秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分44秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分45秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分46秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分47秒  all    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11时13分48秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时13分49秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
平均时间:  all    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80

(3).查看CPU的信息

  cpu的信息存放在/proc/cpuinfo文件中

[root@youxi1 ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 58
model name      : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
stepping        : 9
microcode       : 0x12
cpu MHz         : 3192.819
cache size      : 6144 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm
constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm epb fsgsbase tsc_adjust smep dtherm ida arat pln pts bogomips : 6385.63 clflush size : 64 cache_alignment : 64 address sizes : 42 bits physical, 48 bits virtual power management:

  详细信息查看:https://blog.csdn.net/cuker919/article/details/7635488

(4).CPU资源的简单调优

 1)调整nice值改变进程优先级

  在Linux系统中,nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在Linux系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。默认优先级是0。

  可以在运行命令前,设置进程的nice值,让进程使用更多的CPU。nice -n [nice值] [完整命令]

[root@youxi1 ~]# nice -n -5 vim a.txt
//另外打开一个窗口,查看vim a.txt的nice值
[root@youxi1 ~]# ps aux | grep vim  //先查看vim a.txt的PID
root       1877  0.1  0.5 151560  5028 pts/0    S<+  13:53   0:00 vim a.txt
root       1900  0.0  0.0 112720   980 pts/1    R+   13:53   0:00 grep --color=auto vim
[root@youxi1 ~]# top -p 1877  //然后根据PID查看进程信息
top - 13:54:53 up  4:34,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997956 total,   705368 free,   146968 used,   145620 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   689988 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND     
  1877 root      15  -5  151560   5028   2664 S  0.0  0.5   0:00.07 vim 

  还可以使用renice修改当前进程的nice值。renice -n [nice值] [PID]

[root@youxi1 ~]# renice -n 6 1877
1877 (进程 ID) 旧优先级为 -5,新优先级为 6
[root@youxi1 ~]# top -p 1877     
top - 14:01:33 up  4:41,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997956 total,   705316 free,   146828 used,   145812 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   689964 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND     
  1877 root      26   6  151560   5028   2664 S  0.0  0.5   0:00.07 vim  

 2)设置进程的CPU亲和力(指定进程运行在哪一个CPU上)

  这里我将主机的CPU改为单个4核,内存也调整为4G。

  使用的是taskset命令,安装的是util-linux。taskset在多核的情况下,可以指定进程在那个CPU上运行,减少进程在不同CPU之间切换的开销。

[root@youxi1 ~]# yum -y install util-linux
[root@youxi1 ~]# mpstat -P ALL
Linux 3.10.0-862.el7.x86_64 (youxi1)    2019年07月30日  _x86_64_        (4 CPU)

15时34分33秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
15时34分33秒  all    0.09    0.00    0.19    0.10    0.00    0.00    0.00    0.00    0.00   99.62
15时34分33秒    0    0.08    0.00    0.25    0.10    0.00    0.00    0.00    0.00    0.00   99.57
15时34分33秒    1    0.10    0.00    0.22    0.16    0.00    0.00    0.00    0.00    0.00   99.52
15时34分33秒    2    0.14    0.00    0.18    0.07    0.00    0.00    0.00    0.00    0.00   99.61
15时34分33秒    3    0.05    0.00    0.11    0.08    0.00    0.00    0.00    0.00    0.00   99.76

  指定命令运行在第2个CPU上(CPU编号为1)。taskset -c [CPU编号] [完整命令]

[root@youxi1 ~]# taskset -c 1 vim a.txt
//另外打开一个窗口,查看vim a.txt运行的CPU
[root@youxi1 ~]# ps aux | grep vim
root       1528  0.5  0.1 151548  5048 pts/0    S+   15:49   0:00 vim a.txt
root       1556  0.0  0.0 112720   980 pts/1    S+   15:50   0:00 grep --color=auto vim
[root@youxi1 ~]# taskset -cp 1528
pid 1528's current affinity list: 1

  查看进程运行在哪几个CPU上。taskset -cp [PID]

[root@youxi1 ~]# ps axu | grep sshd
root       1143  0.0  0.1 112796  4288 ?        Ss   14:52   0:00 /usr/sbin/sshd -D
root       1460  0.0  0.1 161396  6016 ?        Ss   15:26   0:00 sshd: root@pts/0
root       1562  0.0  0.0 112720   980 pts/0    S+   15:55   0:00 grep --color=auto sshd
[root@youxi1 ~]# taskset -cp 1143
pid 1143's current affinity list: 0-3
[root@youxi1 ~]# taskset -cp 1460
pid 1460's current affinity list: 0-3

  当然也可以设置命令在多个CPU上运行,CPU编号之间用逗号隔开。

[root@youxi1 ~]# taskset -c 1,3 vim b.txt
//另外打开一个窗口,查看vim b.txt运行的CPU
[root@youxi1 ~]# ps aux | grep vim
root       1566  0.3  0.1 151560  5028 pts/0    S+   15:59   0:00 vim b.txt
root       1589  0.0  0.0 112720   984 pts/1    S+   15:59   0:00 grep --color=auto vim
[root@youxi1 ~]# taskset -cp 1566
pid 1566's current affinity list: 1,3