linux-性能优化命令
top
我们先来说说top命令用法,这个命令对于我们监控linux性能是至关重要的,我们先来看看展示结果。
top - 15:20:23 up 10 min, 2 users, load average: 0.39, 0.53, 0.35
Tasks: 217 total, 1 running, 216 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
MiB Mem : 3889.8 total, 2242.3 free, 996.8 used, 650.7 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2663.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 166328 11484 8168 S 0.0 0.3 0:02.93 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.32 kworker/0:1H-events_highpri
10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
13 root 20 0 0 0 0 S 0.0 0.0 0:00.22 ksoftirqd/0
14 root 20 0 0 0 0 I 0.0 0.0 0:00.51 rcu_sched
15 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
16 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0
17 root 20 0 0 0 0 I 0.0 0.0 0:01.44 kworker/0:1-pm
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
20 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/1
21 root rt 0 0 0 0 S 0.0 0.0 0:00.70 migration/1
22 root 20 0 0 0 0 S 0.0 0.0 0:00.13 ksoftirqd/1
24 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-events_highpri
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 inet_frag_wq
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd
28 root 20 0 0 0 0 I 0.0 0.0 0:00.97 kworker/0:2-events
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
我们先来看看第一部分内容
1.1,第一行系统整体的统计
- 15:20:23 是当前时间
- up 10 min 运行了多久
- 2 users 当前登录的用户数
- load average: 0.39, 0.53, 0.35 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值
load average:重点说明一下,我们主要观看15min的负载,每个cpu负载应该控制在0-1。如果是0说明cpu在没有任务在执行,
如果是1cpu已经跑满了,而大于1的时候,就有任务等待的请求。
通常如果这个指标长时间大于cpu的核心数,表示cpu很累,需要排查。
1.2,第二行进程数的统计信息
- Tasks: 217 total 进程总数 217
- 1 running 正在运行的进程数 1
- 216 sleeping 睡眠的进程数 216
- 0 stopped 停止的进程数 0
- 0 zombie 僵死进程数 0
1.3,第三行cpu的统计信息
- 0.0 us 用户空间占用CPU百分比
解释:进程在用户地址空间中消耗CPU时间的百分比。像shell程序、各种语言的编译器、数据库应用、web服务器和各种桌面应用都算
是运行在用户地址空间的进程,这些程序如果不是处于idle状态,那么绝大多数的CPU时间都是运行在用户态。
- 0.0 sy 内核空间占用CPU百分比
解释:进程在内核地址空间中消耗CPU时间的百分比。所有进程要使用的系统资源都是由Linux内核处理的。当处于
用户态(用户地址空间)的进程需要使用系统的资源时,比如需要分配一些内存、或是执行IO操作、再或者是去创建一个子进程,
此时就会进入内核态(内核地址空间)运行。事实上,决定进程在下一时刻是否会被运行的进程调度程序就运行在内核态。
对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,
因此在调查IO相关的问题时需要着重关注它。
- 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
解释:ni是nice的缩写,可以通过nice值调整进程用户态的优先级,这里显示的ni表示调整过nice值的进程消耗掉的CPU时间。
如果系统中没有进程被调整过nice值,那么ni就显示为0
- 100.0 id 空闲CPU百分比
- 0.0% wa 等待输入输出的CPU时间百分比
解释:CPU等待磁盘IO操作的时间。和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如:CPU在启动一个磁盘
读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会
把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作
造成的。
- 0.0% hi 硬中断占用百分比
- 0.0% si 软中断占用百分比
解释:这两个值表示系统处理中断消耗的时间。中断分为硬中断和软中断,hi表示处理硬中断消耗的时间,si表示处理软中
断消耗的时间。硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理(消耗CPU时间)。
软中断是由程序发出的中断,最终也会执行相应的处理程序(消耗CPU时间)
1.4最后两行的统计信息如下
-
3889.8 tota 物理内存总量
-
2242.3 free 使用的物理内存总量
-
996.8 used 空闲的内存总量
-
650.7 buff/cache 用作内核缓存的内存量
-
3891.0 total 交换区内存总量
-
3891.0 free 使用的交换区总量
-
0.0 used 空闲的交换区总量
-
2663.3 avail Mem 缓冲的交换区总量
如果在内存充足的情况下,交换内存应该是很小的。
for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{aa=a+$2}END{print '"$i"',a/1024"M"}'
/proc/$i/smaps ;done |sort -k2nr
这个命令可以查看占用交换内存的进程。
2,进程的统计信息
序号 | 列名 | 含义 |
---|---|---|
1 | PID | 进程id |
2 | USER | 进程所有者的用户名 |
3 | PR | 优先级 |
4 | NI | nice值。负值表示高优先级,正值表示低优先级 |
5 | VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
6 | RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
7 | SHR | 共享内存大小,单位kb |
8 | S | 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
9 | %CPU | 进程使用的CPU的百分比 |
10 | %MEM | 进程使用的物理内存百分比 |
11 | TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
12 | COMMAND | 执行的命令 |
3.1,top命令的使用方式
top [选项]
参数选项 | 含义 |
---|---|
-d | 指定每两次屏幕信息刷新之间的时间间隔,如希望每秒刷新一次,则使用:top -d 1 |
-p | 通过指定PID来仅仅监控某个进程的状态 |
-S | 指定累计模式 |
-s | 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险 |
-i | 使top不显示任何闲置或者僵死的进程 |
-c | 显示整个命令行而不只是显示命令名 |
3.2,top命令使用举例
- 3.2.1 top //每隔3秒显式所有进程的资源占用情况
top - 06:57:27 up 4:41, 4 users, load average: 0.02, 0.10, 0.09
Tasks: 223 total, 1 running, 222 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.1 us, 6.6 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 3889.8 total, 1874.0 free, 1035.0 used, 980.8 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2618.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1845 root 20 0 17724 11852 8908 S 4.7 0.3 3:48.73 sshd
181935 root 20 0 17580 11788 8912 S 2.0 0.3 0:00.21 sshd
41828 root 20 0 10912 4208 3336 S 0.7 0.1 1:08.00 top
182120 root 20 0 11320 4436 3052 S 0.7 0.1 0:00.06 top
211 root -51 0 0 0 0 S 0.3 0.0 0:06.72 irq/16-vmwgfx
530 root rt 0 354884 27100 9072 S 0.3 0.7 0:03.39 multipathd
2013 root 20 0 11320 4316 2936 S 0.3 0.1 1:28.70 top
119765 root 20 0 0 0 0 I 0.3 0.0 0:06.08 kworker/0:2-events
180210 root 20 0 0 0 0 I 0.3 0.0 0:00.11 kworker/u256:0-events_power_efficient
182141 root 20 0 10612 4076 3232 R 0.3 0.1 0:00.04 top
-
3.2.2 top -d 1 //每隔1秒显式所有进程的资源占用情况,默认是3s
-
3.2.3 top -c //每隔1秒显式所有进程的资源占用情况
top - 06:57:27 up 4:41, 4 users, load average: 0.02, 0.10, 0.09
Tasks: 223 total, 1 running, 222 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.1 us, 6.6 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 3889.8 total, 1874.0 free, 1035.0 used, 980.8 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2618.3 avail Mem
top - 07:01:09 up 4:45, 4 users, load average: 0.38, 0.22, 0.13
Tasks: 223 total, 1 running, 222 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.7 us, 4.7 sy, 0.0 ni, 93.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1872.6 free, 1036.3 used, 981.0 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2616.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2013 root 20 0 11320 4316 2936 S 1.3 0.1 1:29.82 top
1845 root 20 0 17724 11852 8908 S 1.0 0.3 3:51.78 sshd: root@pts/0,pts/1
181935 root 20 0 17712 11828 8912 S 1.0 0.3 0:03.54 sshd: root@pts/2,pts/3
15240 root 20 0 0 0 0 I 0.3 0.0 0:14.51 [kworker/1:0-events]
119765 root 20 0 0 0 0 I 0.3 0.0 0:06.25 [kworker/0:2-events]
160236 root 20 0 0 0 0 I 0.3 0.0 0:01.05 [kworker/u256:1-events_power_efficient]
182120 root 20 0 11320 4436 3052 S 0.3 0.1 0:01.25 top
1 root 20 0 167692 12840 8080 S 0.0 0.3 0:04.12 /sbin/init
- 3.2.4 top -p 12345 //每隔3秒显示pid是12345进程的资源占用情况
top - 07:03:03 up 4:47, 4 users, load average: 0.08, 0.16, 0.11
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.4 us, 3.9 sy, 0.0 ni, 94.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1868.4 free, 1040.4 used, 981.0 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2612.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8170 root 20 0 3692372 625916 17444 S 0.7 15.7 1:36.95 java
3.3,top的交互命令
-
3.3.1 过滤用户:在top命令显示中,输入u,然后输入用户名,则可以查看相应的用户进程。如按u键,然后输入tiger,按回车则只显示tiger的进程
-
3.3.2 查看各个CPU的使用情况:在top命令下,输入1,可以看到各个CPU的使用情况
top - 07:06:07 up 4:50, 4 users, load average: 0.27, 0.19, 0.12
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.7 us, 3.7 sy, 0.0 ni, 94.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.0 us, 3.3 sy, 0.0 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
MiB Mem : 3889.8 total, 1871.3 free, 1037.4 used, 981.1 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2615.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
181935 root 20 0 17712 11860 8912 S 1.3 0.3 0:07.59 sshd
1845 root 20 0 17724 11868 8908 S 0.7 0.3 3:55.58 sshd
2013 root 20 0 11320 4316 2936 S 0.7 0.1 1:31.30 top
- 3.3.3 隐藏闲置或僵死的进程:在top命令下,输入i,可以隐藏闲置或僵死的进程,效果跟输入top -i是一样的
top - 07:07:31 up 4:51, 4 users, load average: 0.11, 0.16, 0.12
Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie
%Cpu0 : 2.0 us, 4.4 sy, 0.0 ni, 93.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 2.7 us, 5.6 sy, 0.0 ni, 91.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1876.0 free, 1032.6 used, 981.2 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2620.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1845 root 20 0 17724 11868 8908 S 1.3 0.3 3:56.73 sshd
181935 root 20 0 17712 11860 8912 S 1.0 0.3 0:08.66 sshd
2013 root 20 0 11320 4316 2936 S 0.7 0.1 1:31.81 top
182120 root 20 0 11320 4436 3052 S 0.7 0.1 0:03.43 top
8170 root 20 0 3692372 625916 17444 S 0.3 15.7 1:37.83 java
- 3.3.4 切换进程列表中的内存显示单位:在进程列表中,内存的单位默认也是KB,我们可以通过小写字母e来切换单位,下面是mb的单位
top - 07:08:34 up 4:52, 4 users, load average: 0.12, 0.16, 0.12
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.0 us, 3.7 sy, 0.0 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.7 us, 3.0 sy, 0.0 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1882.5 free, 1026.1 used, 981.2 buff/cache
MiB Swap: 3891.0 total, 3891.0 free, 0.0 used. 2627.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1845 root 20 0 17.3m 11.6m 8.7m S 0.7 0.3 3:57.61 sshd
2013 root 20 0 11.1m 4.2m 2.9m S 0.7 0.1 1:32.20 top
41828 root 20 0 10.7m 4.1m 3.3m S 0.7 0.1 1:10.61 top
181935 root 20 0 17.3m 11.6m 8.7m S 0.7 0.3 0:09.54 sshd
769 root 20 0 307.5m 9.1m 7.5m S 0.3 0.2 0:30.60 vmtoolsd
8170 root 20 0 3605.8m 611.2m 17.0m S 0.3 15.7 1:38.09 java
-
3.3.5 粗体显示排序的列:由前文可知,f键可以改变排序的列,但界面中看不出是以哪个列来排序的,可以通过小写字母x来粗体显示当前排序的列
-
3.3.6 快速切换排序的列:虽然可以通过f键来修改排序的列,但还有一些快速切换排序列的方式:比如大写字母M以%MEM列排序,大写字母N以PID列排序,大写字母P以%CPU列排序,大写字母T以TIME+列排序。大写字母R可以将当前的排序结果反转。
-
3.3.7 显示完整的执行命令:默认COMMAND列只显示程序的名字,并不包含程序的路径,可以通过小写字母c来显示完整的执行命令(效果跟top -c相同)
vmstat
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。此命令的基本格式有如下 2 种:
vmstat [-a] [刷新延时 刷新次数]
vmstat [选项]
-a 的含义是用 inact/active(活跃与否) 来取代 buff/cache 的内存输出信息。除此之外,表 1 罗列出了 vmstat 命令的第二种基本格式中常用的选项及各自的含义。
表3 vmstat命令常用选项及含义
选项 | 含义 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。-s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p 分区设备文件名 | 查看硬盘分区的读写情况。 |
vmstat 1 20 ,如下显示
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 1912344 47864 981132 0 0 20 9 155 256 1 3 95 0 0
0 0 0 1911588 47864 981132 0 0 0 0 467 840 2 9 89 0 0
0 0 0 1910832 47864 981132 0 0 0 0 449 615 4 11 86 0 0
0 0 0 1910832 47872 981132 0 0 0 12 273 420 1 3 96 0 0
1 0 0 1910584 47872 981132 0 0 0 0 418 704 2 7 91 0 0
0 0 0 1910836 47872 981132 0 0 0 0 403 711 2 7 91 0 0
0 0 0 1911092 47872 981132 0 0 0 0 233 399 1 1 98 0 0
0 0 0 1910844 47872 981132 0 0 0 0 418 699 2 7 91 0 0
3 0 0 1910848 47872 981132 0 0 0 4 388 610 2 7 92 0 0
0 0 0 1910876 47872 981132 0 0 0 0 323 439 1 4 95 0 0
0 0 0 1910624 47872 981132 0 0 0 0 389 755 3 5 92 0 0
2 0 0 1910876 47872 981132 0 0 0 0 361 1236 4 6 91 0 0
0 0 0 1911388 47872 981132 0 0 0 0 374 614 3 7 91 0 0
0 0 0 1911388 47872 981132 0 0 0 0 440 706 2 6 92 0 0
- procs 进程信息
字段 | 含义 |
---|---|
r | 等待运行的进程数,数量越大,系统越繁忙。 |
b | 不可被唤醒的进程数量,数量越大,系统越繁忙。 |
- memory 内存信息,切换单位 -S mb
字段 | 含义 |
---|---|
swpd | 虚拟内存的使用情况,单位为 KB。 |
free | 空闲的内存容量,单位为 KB。 |
buff | 缓冲的内存容量,单位为 KB。 |
cache | 缓存的内存容量,单位为 KB。 |
- swap 交换分区信息,这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
字段 | 含义 |
---|---|
si | 从磁盘中交换到内存中数据的数量,单位为 KB。 |
so | 从内存中交换到磁盘中数据的数量,单位为 KB。 |
- io 磁盘读/写信息字段,这两个数越大(如超出1024k),代表系统的 I/O 越繁忙。
字段 | 含义 |
---|---|
bi | 从块设备中读入的数据的总量,单位是块。 |
bo | 写到块设备的数据的总量,单位是块。 |
- system 系统信息,这两个数越大,代表系统与接口设备的通信越繁忙。
字段 | 含义 |
---|---|
in | 每秒被中断的进程次数。 |
cs | 每秒进行的事件切换次数。 |
- CPU信息字段
字段 | 含义 |
---|---|
us | 非内核进程消耗 CPU 运算时间的百分比。 |
sy | 内核进程消耗 CPU 运算时间的百分比。 |
id | 空闲 CPU 的百分比。 |
wa | 等待 I/O 所消耗的 CPU 百分比。 |
st | 被虚拟机所盗用的 CPU 百分比。 |