文章目录
一、调整 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