Linux---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@dsj ~]# nice -n -5 vim a.txt	#先不要退出这个 vim 命令。

再打开另一个终端窗口执行以下命令: 
[root@dsj ~]# 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@dsj ~]# 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

3.使用renice 修改正在运行的进程的优先级

语法:renice -n 5 PID	#修改进程优先级
例:将先前 vim 的PID 24318 优先级调整为级别 6 
[root@dsj ~]# renice -n 6 24318 
[root@dsj ~]# 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

4.进程优先级不可以超过 -20 到 19 范围

[root@dsj ~]# renice -n -21 24219	#发现我想给-21   级别,但最终只能达到-20 级别
24219: old priority -20, new priority -20

[root@dsj ~]# renice -n 20 24219	#发现我想给 20 级别,但最终只能达到 19 级别。
24219: old priority -20, new priority 19

#通过这个例子,告诉我们进程优先级不可以超过   -20   到 19 范围

二、设置进程的 CPU 亲和力

  • taskset 作用:
    在多核的情况下,可以认为指定一个进程在哪颗 CPU 上执行程序,减少进程在不同CPU 之前切换的开销。

1. 安装 taskset 命令:

[root@dsj ~]# yum install util-linux

2. taskset 语法:

taskset   -cp [CPU ID 号]   命令或进程 ID 

常用参数:
-p, --pid	在已经存在的 pid 上操作
-c, --cpu-list	以列表格式显示和指定   CPU

2.1 例 1:

  • 本服务器是 4 核CPU ,指定 vim 命令在第一个 CPU 上运行。
[root@dsj ~]# taskset -c 0 vim a.txt	#第一个CPU 的 ID 是 0。


在另一个终端下运行:
[root@dsj ~]# 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@dsj ~]# taskset -cp   2614
pid 2614's   current affinity list: 0	#affinity   [əˈfɪnəti]	密切关系

2.2 例 2:

  • 查 sshd 进程运行在哪几个CPU 上
[root@dsj ~]# 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@dsj ~]# taskset -cp  1087
pid 1087's current affinity list: 0-3	#0-3 说明sshd 进程可以使用 4 个CPU 核心处理数据。

#注:我们的CPU 是 4 核心,所以taskset -c 后可以跟: 0,1,2,3

2.3 例 3:

  • 指定 vim c.txt 程序运行在第 2 和第 4 个CPU 上
[root@dsj ~]# taskset -c 1,3 vim b.txt 
[root@dsj ~]# 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@dsj ~]# taskset -cp 6314 pid 5069's current affinity list: 1,3

三、使用 vm stat 找出系统中存在瓶颈

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 运行的结果,来分析系统中存在的问题。
    先将虚拟机dsj 关闭,然后调整 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@dsj ~]# 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。

例 2:

  • 使用xftp 上传一个比较大的文件到 linux 系统中,分析系统资源使用情况。上传文件是只写磁盘,不读磁盘的。
[root@dsj ~]# vmstat 1 1000  #开始长时间监控系统。
然后使用xftp 开始上传一些文件系统中。上传的文件可以随意找一些文件上传,只要大于 1G 就可以了。大于 1G,可以上传的时间长一些,方便看出来效果。
  • 运行xftp 开始上传数据到Linux 系统中:

在这里插入图片描述

  • 上面上传着数据,下面持续观查 vmstat 运行结果如下(注:整个运行结果比较长,我截取了部分有代表性的数据)
[root@dsj ~]# vmstat 1 1000
procs -----------memory----------	---swap-- -----io----	---system--- ------cpu-----
...
r b	swpd	free	buff cache	si	so	bi	bo	in	cs	us	sy	id   wa	st
1 0	0 5568584	2224 2248604	0	0	0	59	3287	3516	1	11	88 0	0
2 0	0 5546952	2224 2269796	0	0	0	19968	1000	682	0	7	92 0	0
4 0	0 5546784	2224 2269864	0	0	0	20992	820	392	1	5	94 0	0
0	0	0 5546816	2224 2269928	0	0	0	19360 1015 824	1	9 90   0	0


注:根据观察值,我们可以得出结论:
1、因为我们只是上传文件到 linux 系统中,在上传文件过程中没有读磁盘,所以 bi 的值一直为 0; 但是上传文件时会写入磁盘,所以 bo 这列会有大量数据。
2、r 列,free 列,us 列,id 列,wa 列数据不多,说明cpu,内存,io 都还可以,压力不大。

例 3:

  • 将 /lib64 目录复制到 /opt 下,模拟生产环境下备份数据的情景。在复制的过程中查看一下系统的状态。
[root@dsj ~]# du -sh /lib64/ 919M	/lib64/
[root@dsj ~]# cp -r /lib64/ /opt/ 
[root@dsj ~]# vmstat 1 1000
procs -----------memory----------	---swap--	-----io----	-system--	------cpu-----	
r   b	swpd	free	buff cache	si	so	bi	bo	in	cs	us   sy id   wa	st
5	2	0 6582812	2224 1244300	0	0	88 26492	1639	409	1	6	30	63	0
3	1	0 6580092	2224 1245100	0	0	36 6320	1706	222	0	4	42	54	0
3	2	0 6579212	2224 1245988	0	0	256 12896	1063	77	1	2	44	54	0
3	2	0 6577776	2224 1247528	0	0	920 11432	1448	176	1	6	38	56	0
2	2	0 6576340	2224 1249156	0	0	72 32292	1841	364	1	5	27	67	0
3	2	0 6575656	2224 1249772	0	0	48 26264	1689	371	1	4	21	74	0

注:根据观察值,我们可以得出结论:
1、因为我们是复制文件,所以bi 和bo 都会有大量数据。
2、r   列,free   列数据不大,说明正在运行的进程数不多,内存也够用。
3、查看r 列最大数据是 5,r 列超过 12 认为cpu 核心数不够用。所以当前运行的进程不多,cpu 核心数够用。查看 us 列,sy 列使用cpu 不多,但是 wa 列使用cpu 很多。说明当前系统的瓶颈是磁盘读写太慢。因为大量进程都处在等待读写磁盘上这件事上。
总结:通过   wa 列是最容易看出磁盘读写速度是否太慢

例 4:

  • 将 /lib64 目录复制到 /opt 下,模拟生产环境下备份数据的情景。在复制的过程中查看一下系统的状态。
[root@dsj ~]# yum install httpd -y 
[root@dsj ~]# systemctl start httpd
[root@dsj conf]# cp /etc/passwd /var/www/html/index.html 
[root@dsj conf]# ab -n 500000 -c 200 http://192.168.3.11/index.html

[root@dsj ~]# vmstat 1 1000
procs --------	---memory----------	---swap-- -----io----	-system-- ------cpu-----
r   b	swpd	free	buff   cache	si	so	bi	bo	in	cs	us sy   id   wa st
2	0	0 5021552	2224 2653056	0	0	0	0 7753 10260	9	44	47	0	0
13	0	0 5020604	2224 2652136	0	0	0	0 7744 11654	16	44	40	0	0
13	0	0 5021332	2224 2653568	0	0	0	0 7942 11401	15	43	42	0	0
9	0	0 5020252	2224 2654252	0	0	0	0 7653 10626	16	44	40	0	0
22	0	0 5019580	2224 2654560	0	0	0	0 7871 10683	12	45	43	0	0


注:根据观察值,我们可以得出结论:
1、r 列有几个数值已经超过 12 了,说明 cpu 核心数不够用了。wa 列为 0,说明在读写磁盘等待上, 没有占用cpu。这样情况就是服务器上运行了大量进程在消耗 cpu。
可以使用 ps 查看一下有哪个进程, 另外,也可以运行 top 命令再按P,来查看一下哪些进程在大量使用 cpu。
扩展:关于buff 和 cache 内存
BUFFER	inode 节点索引缓存;CACHE block 块/页缓存。buffers #缓存从磁盘读出的内容	,这种理解是片面的cached #缓存需要写入磁盘的内容 ,这种理解是片面的
不过现在在 centos7 下,free 命令已有变化,free 直接给出了可用空余内存 available。增加了-h 选项,支持以人性化的单位(K/M/G)显示各个数值。如下:
[root@dsj ~]# free -h
	total	used	free	shared	buff/cache	available
Mem:	7.8G	374M	7.2G	9.2M	250M	7.1G
Swap:	1.0G	0B	1.0G		



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ps -aux命令用于查看系统的进程信息。在Linux系统中,该命令提供了对进程的一次性快照,可以查看系统中正在运行的进程、结束的进程、僵尸进程以及占用资源过多的进程等信息。 该命令的语法格式为:ps -aux。 其中,-a选项表示显示所有用户的进程信息,不仅仅是当前用户的进程;-u选项表示显示详细的进程信息,包括进程的用户、进程ID、CPU使用率、内存使用情况等等。-x选项表示显示没有控制终端的进程。 通过使用ps -aux命令,我们可以获取到系统中所有进程的详细信息。对于需要进行进程监控的需求,ps命令是一个很有用的工具。通过该命令,我们可以了解到系统中正在运行的进程的状态,以及它们所占用资源情况,方便我们进行系统的调优和管理。 如果需要进一步筛选特定的进程信息,可以使用管道符号(|)将ps命令与其他命令结合使用。例如,ps -aux | grep test.py | grep "python3" | cut -d " " -f 1,6,8,10,11,12,13,21,24,26,27,28,29可以通过grep命令和cut命令来筛选出特定进程的信息,其中"test.py"表示进程名称,"python3"表示进程命令,-d选项表示字段分隔符,-f选项表示需要显示的字段。 总结来说,linux ps -aux命令用于查看系统的进程信息,通过结合其他命令可以进行进一步的筛选和监控。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值