有关使用CPU资源的调优
一、 调整nice值改变进程优先级
1、nice概述:在LINUX系统中,Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在LINUX系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。默认优先级是0
2、在命令运行前,调整进程nice值,让进程使用更多的CPU
语法: nice -n 优先级数字 命令
例:将vim a.txt命令的优先级,从默认的0级别调高到-5级别
[root@xuegod63 ~]# nice -n -5 vim a.txt #先不要退出这个vim命令。
再打开另一个终端窗口执行以下命令:
[root@xuegod63 ~]# ps -axu | grep a.txt
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt
[root@xuegod63 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
2、使用renice修改正在运行的进程的优先级
语法:renice -n 5 PID #修改进程优先级
例:将先前vim 的PID 24318优先级调整为级别6
[root@xuegod63 ~]# renice -n 6 24318
[root@xuegod63 ~]# top -p 24318
。。。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 6 140m 3336 2200 S 0.0 0.3 0:00.08 vim
3、进程优先级不可以超过 -20 到19范围
[root@xuegod63 ~]# renice -n -21 24219 #发现我想给-21级别,但最终只能达到-20级别。
24219: old priority -20, new priority -20
[root@xuegod63 ~]# renice -n 20 24219 #发现我想给20级别,但最终只能达到19级别。
24219: old priority -20, new priority 19
通过这个例子,告诉我们进程优先级不可以超过 -20 到19范围
二、设置进程的CPU亲和力
taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销。
1、安装taskset命令:
[root@xuegod63 ~]# yum install util-linux
2、taskset语法: taskset -cp [CPU ID号] 命令或进程ID
常用参数:
-p, --pid 在已经存在的 pid 上操作
-c, --cpu-list 以列表格式显示和指定CPU
例1:本服务器是4核CPU ,指定vim命令在第一个CPU上运行。
[root@xuegod63 ~]# taskset -c 0 vim a.txt #第一个CPU的 ID是0。
在另一个终端下运行:
[root@xuegod63 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2614 1.3 0.2 143696 3332 pts/0 S+ 18:39 0:00 vim a.txt
[root@xuegod63 ~]# taskset -cp 2614
pid 2614's current affinity list: 0 #affinity [əˈfɪnəti] 密切关系
例2:查sshd进程运行在哪几个CPU上
[root@xuegod63 ~]# ps -axu | grep sshd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2030 0.0 0.0 64068 1140 ? Ss 18:26 0:00 /usr/sbin/sshd
[root@xuegod63 ~]# taskset -cp 1087
pid 1087's current affinity list: 0-3 #0-3说明sshd进程可以使用4个CPU核心处理数据。
注: 我们的CPU是4核心,所以taskset -c后可以跟: 0,1,2,3
例3:指定vim c.txt 程序运行在第2和第4个CPU上
[root@xuegod63 ~]# taskset -c 1,3 vim b.txt
[root@xuegod63 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 6314 1.5 0.2 143612 3280 pts/1 S+ 14:41 0:00 vim b.txt
root 6317 0.0 0.0 103300 848 pts/2 S+ 14:41 0:00 grep vim
[root@xuegod63 ~]# taskset -cp 6314
pid 5069's current affinity list: 1,3
三、使用vmstat找出系统中存在瓶颈
1、CPU 利用率比例分配:
如果一个CPU 被充分使用,利用率分类之间均衡的比例应该是。
65% 70% User Time #用户态(通常指我们运行的服务和程序)。
30% 35% System Time #内核态。
0% 5% Idle Time #空闲。
Context Switches 上下文切换的数目直接关系到CPU 的使用率,如果CPU 利用率保持在上述均衡状态时,有大量的上下文切换是正常的。
上下文切换指的就是cpu中寄存器数据的写入和读出。每个进程在使用cpu时,都需要把自己的数据先写入cpu的缓存(寄存器)中,然后cpu才能根据缓存中的数据来计算。
2、实战使用vmstat找出系统中存在瓶颈
实战场景:一台4核心,8G内存的服务器,根据vmstat运行的结果,来分析系统中存在的问题。大家一定要认真学习这个4核心,8G内存查找系统瓶颈的思路。只要用心学会这个思路,后期就可以很轻松分析出8核心,16G或8核心,32G服务器的瓶颈。
先将虚拟机xuegod63关闭,然后调整cpu和内存为:4核心,8G内存。
扩展:vmstat输出每列字段的意义:
1、Procs(进程):
r: The number of processes waiting for run time.
等待运行的进程数。如果等待运行的进程数越多,意味着CPU非常繁忙。另外,如果该参数长期大于cpu核心数3倍,说明CPU资源可能存在较大的瓶颈。
b: The number of processes in uninterruptible sleep.
处在非中断睡眠状态的进程数。即等待IO的进程数量。
2、Memory(内存):
swpd: the amount of virtual memory used.
已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适的方式来减少物理内存的使用。swapd不为0,并不意味物理内存吃紧,如果swapd没变化,si、so的值长期为0,这也是没有问题的 。
free: the amount of idle memory.
空闲的物理内存的大小
buff: the amount of memory used as buffers.
用来做buffer(缓存,主要用于块设备缓存)的内存数,单位:KB
cache: the amount of memory used as cache.
用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。单位:KB
3、Swap(交换分区)
si: Amount of memory swapped in from disk (/s).
从磁盘写入到swap虚拟内存的交换页数量,单位:KB/秒。如果这个值大于0,表示物理内存不够用或者内存泄露了。
so: Amount of memory swapped to disk (/s).
从swap虚拟内读出的数据。即从swap中的数据写入到磁盘的交换页数量,单位:KB/秒,如果这个值大于0,表示物理内存不够用或者内存泄露了。
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
当看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合si和so。如果free很少,但是si和so是0,那么不用担心,系统性能这时不会受到影响的。
4、IO(这里指Input/Output Memery的数据,即bi:进入内存,bo:从内存中出去)
bi: Blocks received from a block device (blocks/s).
每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。bi通常是读磁盘的数据
bo: Blocks sent to a block device (blocks/s).
每秒发送到块设备的块数,单位:块/秒 也就是写块设备。bo通常是写磁盘的数据
5、System(系统)
in: The number of interrupts per second, including the clock.
每秒的中断数,包括时钟中断。
cs: The number of context switches per second.
每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的cpu资源,这个数值应该越小越好。
6、CPU(使用cpu时间的百分比%,最大100%)
us: Time spent running non-kernel code. (user time, including nice time)
用户CPU时间(非内核进程占用时间)(单位为百分比)。 us的值比较高时,说明用户进程消耗的CPU时间多
sy: Time spent running kernel code. (system time)
系统使用的CPU时间(单位为百分比)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
空闲的CPU的时间(百分比),在Linux 2.5.41之前,这部分包含IO等待时间。
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.
等待IO的CPU时间,这个值为0 .这个指标意味着CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
st: 虚拟机占用cpu时间的百分比。如果centos系统上运行了kvm虚拟机,而kvm虚拟上又运行了几个虚拟机,那么这个值将显示这个几个正在运行的虚拟机从物理机中窃取CPU运行时间的百分比。
例1:当系统刚开机后,一切正常时,vmstat的状态。
[root@xuegod63 ~]# vmstat 1 10
注:根据观察值,我们可以得到以下结论:
1、第1列r(run),有很几个2,很多次是0,说明当前系统中正在运行的进程不多,此值大于cpu核心数3倍时,我们认为是cpu是繁忙的。当前情况下: r > 12,才算忙。
2、第4列free是物理内存剩余数。默认单位是KB,我们现还有6997376KB,大约6831MB的可用内存,一共内存是8192MB,所以内存肯定够用。
3、第7和8列swap是swap内存交换分区使用情况。如果这两列有数据,说明我们已经使用了swap交换分区了,那么系统的内存肯定不够用了,需要加内存。
4、第9和10列io,如果io这组数据中bi比较大,说明从磁盘读进内存的数据比较大,即读磁盘数据多。bo比较大,说明从内存写入到磁盘的数据比较多,即说明写磁盘比较多。
5、第13和15列cpu数据组中的us是用户太进程使用cpu时间的百分比。如果us列数据比较大,说明用户态的进程如apache,mysql等服务使用cpu比较多。 id 这列是cpu空闲时间(%)。此列最大值是100%
6、第16列,即倒数第二列wa(等待IO所消耗的CPU时间百分比),如果此占用cpu的百分比比较大,如到达了40%,说明磁盘读写速度太慢,IO有瓶颈了。具体是bi或bo的问题,可以查看一下bi和bo列的数值。如果bi列值很大,说明进程在等待写入磁盘数据时,占用了大量cpu。