top - 16:38:04 up 53 days, 21:04, 0 users, load average: 72.35, 70.02, 71.65
Tasks: 886 total, 2 running, 883 sleeping, 0 stopped, 1 zombie
%Cpu(s): 68.9 us, 15.2 sy, 0.0 ni, 15.8 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 98833648 total, 12209316 free, 30220856 used, 56403472 buff/cache
KiB Swap: 4194300 total, 4090868 free, 103432 used. 60035444 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24900 root 20 0 27.6g 95844 21544 S 105.1 0.1 0:03.43 java
25028 root 20 0 27.4g 88684 21376 S 101.3 0.1 0:03.15 java
26004 root 20 0 2929492 23272 3540 S 52.7 0.0 24245:31 hcs_shvfs
30444 root 20 0 7699112 39772 18820 S 52.4 0.0 56161:17 mps
3222 root 20 0 11.7g 68088 7452 S 44.7 0.1 24466:39 hcs_vs
17739 root 20 0 17.8g 4.6g 45176 S 44.7 4.9 78:40.45 java
4963 root 20 0 16.2g 183272 13812 S 21.5 0.2 9474:29 das_media
23430 root 20 0 7379000 191428 22620 S 19.9 0.2 5187:15 ncg-gb35114
29940 root 20 0 4100840 200800 11304 S 17.0 0.2 16963:03 hik.opsmgr.moni
5029 root 20 0 11.3g 148652 9228 S 12.2 0.2 9141:19 RegService
1913 root 20 0 3479096 570748 76120 S 11.9 0.6 44:23.91 Web Content
30846 root 20 0 7515652 70476 30020 S 9.3 0.1 8151:32 Probe
top上半段解释:
(1)第一行: 系统时间 + 系统运行时间 + 几个用户 + 1/5/15分钟系统平均负载
(2)第二行:进程总数(total) + 正在运行进程数(running) + 睡眠进程数(sleeping) + 停止的进程数(stopped)+ 僵尸进程数(zombie)
(3)第三行(关键):
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比
(4)第四行:显示内容依次为“物理内存总量”、“已使用的物理内存”、“空闲物理内存”、“内核缓存内存量”。
(5)第五行:显示内容依次为“交换区总量”、“已使用交互区总量”、“空闲交换区总量”、“缓冲的交换区总量”。
top下半段注解:
PID :进程ID
USER :用户名
PR :优先级
NI :负值表示高优先级,正值表示低优先级。
VIRT :虚拟内存
RES : 真实内存
SHR :共享内存
S :进程状态 D=不可中断的睡眠状态; R=运行; S=睡眠 ;T=跟踪/停止; Z=僵尸进程
“上次更新到现在的CPU时间占用百分比”、“进程使用的物理内存百分比”、“进程使用CPU总时间”、“命令名、命令行”。
参数:
top -d 2 :每隔2秒显式所有进程的资源占用情况
top -c :每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789:每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 :每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
定位僵尸进程以及该僵尸进程的父进程
使用命令:ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'
使用Kill -HUP 僵尸进程ID来杀死僵尸进程,往往此种情况无法杀死僵尸进程,此时就需要杀死僵尸进程的父进程
kill -HUP 僵尸进程父ID
参数解读
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'
-A 参数列出所有进程
-o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令)
因为状态为z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
#vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。
#10秒内统计10次
[root@HikvisionOS ~]# vmstat 10 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
35 0 103432 12347228 756072 55675072 0 0 1 125 0 0 16 12 72 0 0
45 0 103432 12357168 756072 55671712 0 0 0 4336 80632 234562 64 16 20 0 0
80 0 103432 12308676 756072 55708188 0 0 0 4288 80557 233907 64 16 19 0 0
76 0 103432 12307848 756072 55704420 0 0 0 4212 80367 233457 64 17 19 0 0
41 0 103432 12311544 756072 55701380 0 0 108 4694 81747 236129 63 16 21 0 0
30 0 103432 12267112 756072 55739932 0 0 0 4440 79537 232021 65 16 19 0 0
34 0 103432 12310188 756072 55695764 0 0 0 4038 80051 231772 64 17 19 0 0
38 0 103432 12344380 756072 55650796 0 0 0 3833 80565 233747 64 16 20 0 0
98 0 103432 12234400 756072 55688820 0 0 0 4235 81235 235143 64 16 20 0 0
44 0 103432 12307036 756072 55684912 0 0 0 4797 80051 230640 64 17 18 0 0
字段解释:
procs
r 列运行队列中进程数量,如果长期大于1,说明cpu不足,需要增加cpu。
b 等待IO的进程数量。
-----cpu-----
us 用户进程执行时间。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 系统进程执行时间。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比
-system--显示采集间隔内发生的中断数
in 每秒中断数,包括时钟中断。
cs 每秒上下文切换数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
----memory-----
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
---swap--
si 每秒从交换区写到内存的大小。
so 每秒写入交换区的内存大小。
---io---
bi 每秒读取的块数(读磁盘)(每秒kb)。
bo 每秒写入的块数(写磁盘)(每秒kb)
#这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
总结:
如果r经常大于4,id经常少于40,表示cpu的负荷很重。
如果bi,bo长期不等于0,表示内存不足。
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。
查看磁盘负载iostat
显示所有设备负载情况
[root@HikvisionOS tmp]# iostat
Linux 3.10.0-957.5.1.el7.x86_64 (HikvisionOS) 07/30/2020 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
16.53 0.00 11.64 0.15 0.00 71.68
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.75 0.73 15.86 3416632 73884217
vdb 0.12 5.98 0.00 27834078 16
vdc 0.11 8.47 14.04 39448987 65401980
vdd 35.14 2.24 2845.00 10424269 13250311520
dm-0 1.72 0.38 15.85 1758836 73824399
dm-1 0.00 0.05 0.00 210741 3525
cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
备注:
如果%iowait的值过高,表示硬盘存在I/O瓶颈
如果%idle值高,表示CPU较空闲
如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。
多次获取对比论证:
# 【-d 显示磁盘使用情况,-x 显示详细信息,-k 以mB为单位显示读写信息】
[root@HikvisionOS tmp]# iostat -x 1 10
#每秒执行一次,执行10次
Linux 3.10.0-957.5.1.el7.x86_64 (HikvisionOS) 07/30/2020 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
16.52 0.00 11.64 0.15 0.00 71.69
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.22 0.08 1.67 0.73 15.86 19.02 0.00 3.21 0.67 3.33 0.42 0.07
vdb 0.00 0.00 0.12 0.00 5.98 0.00 98.58 0.00 0.15 0.15 0.02 0.12 0.00
vdc 0.00 1.13 0.05 0.06 8.47 14.04 406.96 0.00 19.06 0.42 37.14 0.23 0.00
vdd 0.00 644.72 0.03 35.12 2.24 2844.91 162.03 0.52 17.51 27.11 17.51 0.63 2.23
dm-0 0.00 0.00 0.01 1.71 0.38 15.85 18.83 0.01 7.25 1.16 7.30 0.45 0.08
dm-1 0.00 0.00 0.00 0.00 0.05 0.00 70.41 0.00 1.44 1.02 4.94 0.91 0.00
......
字段解释:
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
#同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
负载简单的说是进程队列的长度。
系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
它没有在等待I/O操作的结果
它没有主动进入等待状态(也就是没有调用’wait’)
没有被停止(例如:等待终止)
进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行和准备好运行的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5。load average就是一定时间内的load数量。
什么因素构成了cpu load的大小
衡量CPU 系统负载的指标是load,load 就是对计算机系统能够承担的多少负载的度量,简单的说是进程队列的长度。请求大于当前的处理能力,会出现等待,引起load升高
如何判断系统是否已经Over Load?
对一般的系统来说,根据cpu数量去判断。如果平均负载始终在1.2一下,而你有2颗cup的机器。那么基本不会出现cpu不够用的情况。也就是Load平均要小于Cpu的数量
Load与容量规划(Capacity Planning)
一般是会根据15分钟那个load 平均值为首先。
Load误解:
系统load高一定是性能有问题。
真相:Load高也许是因为在进行cpu密集型的计算
系统Load高一定是CPU能力问题或数量不够。
真相:Load高只是代表需要运行的队列累计过多了。但队列中的任务实际可能是耗Cpu的,也可能是耗i/0及其他因素的。
系统长期Load高,首先增加CPU
真相:Load只是表象,不是实质。增加CPU个别情况下会临时看到Load下降,但治标不治本。
2:在Load average 高的情况下如何鉴别系统瓶颈。
是CPU不足,还是io不够快造成或是内存不足?
如何评估性能需求中合理的Load Average?
一般来说,Load Average是与机器内核数有关的。以一个单核的机器为例,load=0.5表示CPU还有一半的资源可以处理其他的线程请求,load=1表示CPU所有的资源都在处理请求,没有剩余的资源可以利用了,而load=2则表示CPU已经超负荷运作,另外还有一倍的线程正在等待处理。所以,对于单核机器来说,理想状态下,Load Average要小于1。同理,对于双核处理器来说,Load Average要小于2。结论是:多核处理器中,你的Load Average不应该高于处理器核心的总数量。
不同核处理器之间的load值怎样换算?
性能测试中可能遇到这样的问题,你的线上机器是8核的,但是线下性能测试机只有4核的,那么我用4核机器测试得到的load值是4,换算到8核机器上应该是多少呢?
应该是4*4/8=2
查看内存占用前五的进程
命令:ps auxw | head -1;ps auxw|sort -rn -k4|head -5
内存的单位是kb,VSZ是虚拟内存的占用,RSS是真实的内存的占用。
命令分解:
ps auxw显示系统资源占用情况;
head -1表示显示第一列,即标题列;
sort -r 表示反向排序,-n表示按数字排序,-k4表示列的第4个字符
查看CPU占用前三的进程
命令:ps auxw|head -1;ps auxw|sort -rn -k3|head -3
选择的资源占用情况的第3列(即cpu),用“-k3”表示