Linux监控之top

各位2018圣诞节快乐

##只执行top命令
直接执行top命令后,会产生一个全面的结果,可以将它先分为两个大部分进行解析

###系统概况
上半部分为系统的概况,如下所示,下面单独分析每一行

1
2
3
4
5
top - 12:16:08 up  407 days, 44 min, 25 users, load average: 4.11, 3.93, 3.91
Tasks: 289 total, 10 running, 279 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.4%us, 48.9%sy, 0.0%ni, 44.1%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Mem: 16466620k total, 16232988k used, 233632k free, 271984k buffers
Swap: 0k total, 0k used, 0k free, 5806704k cached

####top行
四个输出内容,从左到右分别为:最后更新时间、系统运行时间、当前登录用户数、系统1分钟,5分钟,15分钟平衡负载

前三个指标基本上没有什么用了,需要简单关注系统平均负载,load average描述的是特定时间间隔内运行队列的平均进程数。
进程如果没有自己调用wait进入等待状态、或者没有等待IO操作结果、或者没有被停止,就会被统计到次指标中,系统毫无压力的运行,这个指标在0~0.7之间;
系统正常运行,但是以及接近满负荷,这个指标在0.7~1之间;系统已经不堪重负,这个指标在1~5;系统随时可能崩溃,这个指标在5以上,此次观测中这个指标已经严重超标,原因是这是一台测试服务器,因为机器不足索引部署服务比较紧凑,实际运行起来也是很慢

####进程信息
五个输出内容,从左到右分别为:总进程数、正在运行进程数、睡眠进程数、停止的进程数、僵尸进程数

一般来说,这里不会出现太多可以暴露的问题,不再多说

####CPU信息
八个输出内容,从左到右分别为:用户空间CPU占用率、内核空间CPU占用率、用户进程空间改变过优先级的进程CPU占用率、空闲CPU占用率、等待输入输出的CPU时间百分比、硬件中断请求、软件中断请求、实时

注重查看us、sy、id,从程序设计上来说,一般偏向于提高us,从而尽可能压榨服务器资源,但是过高的us也会造成很多问题,
一个平衡的比例可以是65~70%us,30~35%sy和0~5%id

####内存信息
四个输出内容,从左到右分别为:物理内存总量、已使用的物理内存、空闲物理内存、内核缓冲使用量

使用Mem的free+buffer+Swap的cached,可以预估此服务器目前可以被使用的内存空间,因为buffer和cached是随时可以释放出来的,没有被实际占用
输出用例中233632k+271984k+5806704k≈6G,top查看内存不是很好用,建议使用free代替

####交换区信息
四个输出内容,从左到右分别为:交换区总量、已使用交换区大小、空闲交换区大小、缓冲交换区大小

注重查看used,linux内存不足的时候,会将部分数据交换到swap空间,而避免oom等异常发生,如果swap的used频繁发现变更,那么系统内存已经出现吃紧,需要进行排查

###进程信息
第二部分列举出了详细的进程和部分信息,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                           
25580 root 20 0 5636m 1.4g 6356 S 32.5 8.8 6402:26 java
42 root 20 0 0 0 0 R 19.6 0.0 80201:39 events/7
41 root 20 0 0 0 0 S 18.9 0.0 71351:40 events/6
36 root 20 0 0 0 0 R 15.6 0.0 55991:43 events/1
35 root 20 0 0 0 0 S 9.6 0.0 37713:33 events/0
37 root 20 0 0 0 0 R 9.3 0.0 48160:33 events/2
38 root 20 0 0 0 0 R 5.6 0.0 44525:03 events/3
39 root 20 0 0 0 0 S 4.0 0.0 50919:31 events/4
22132 root 20 0 102m 980 800 R 3.7 0.0 0:00.11 netstat
22120 root 20 0 102m 980 800 R 3.3 0.0 0:00.10 netstat
22121 root 20 0 102m 984 800 R 3.3 0.0 0:00.10 netstat
22141 root 20 0 102m 980 800 R 2.3 0.0 0:00.07 netstat
2913 root 20 0 4938m 815m 6100 S 1.3 5.1 265:35.39 java
2977 tomcat 20 0 15152 1496 1008 R 0.7 0.0 0:03.03 top
3279 root 20 0 2451m 79m 2564 S 0.7 0.5 4120:01 java
17201 root 20 0 3897m 434m 11m S 0.7 2.7 4:44.52 java
25456 root 20 0 135m 15m 5036 S 0.7 0.1 1144:22 AliYunDun
27532 root 20 0 103m 716 468 S 0.7 0.0 1295:37 omj
4 root 20 0 0 0 0 S 0.3 0.0 304:22.08 ksoftirqd/0
7 root RT 0 0 0 0 S 0.3 0.0 470:35.87 migration/1
15 root RT 0 0 0 0 S 0.3 0.0 334:53.54 migration/3
19 root RT 0 0 0 0 S 0.3 0.0 312:38.80 migration/4
25 root 20 0 0 0 0 S 0.3 0.0 99:31.27 ksoftirqd/5
40 root 20 0 0 0 0 S 0.3 0.0 163:19.12 events/5
3277 root 20 0 177m 1056 444 S 0.3 0.0 386:44.16 wrapper
18852 root 20 0 104m 1556 468 S 0.3 0.0 3109:48 omj
22397 root 20 0 30904 3108 2372 S 0.3 0.0 62:45.99 AliYunDunUpdate
31318 root 20 0 8583m 220m 6136 S 0.3 1.4 426:12.60 java
32183 root 20 0 103m 712 468 S 0.3 0.0 1302:04 omj
1 root 20 0 19228 604 328 S 0.0 0.0 0:03.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 195:04.98 migration/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 9:19.11 watchdog/0
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1
9 root 20 0 0 0 0 S 0.0 0.0 65:08.33 ksoftirqd/1

其中可能出现的列和含义如下:

  • CODE:可执行代码占用的物理内存大小,单位KB
  • COMMAND:命令名/命令行
  • DATA:可执行代码之外的部分(数据段+栈)占用的物理内存大小,单位KB
  • Flags:任务标志,参考sched.h
  • GROUP:进程所有者的组名
  • nDRT:最后一次写入到现在,被修改过的页面数
  • nFLT:页面错误次数
  • NI:nice值,负值表示优先级高,争执表示优先级第
  • P:最后使用的CPU,仅在多CPU环境下有意义
  • PID:进程ID
  • PPID:父进程ID
  • PR:优先级
  • PUSER:real user name
  • RES:进程使用的、未被换出的物理内存大小,单位KB,RES=CODE+DATA
  • S:进程状态
    • D:不可中断的睡眠状态
    • R:运行
    • S:睡眠
    • T:跟踪、停止
    • Z:僵尸进程
  • SHR:共享内存大小,单位KB
  • SWAP:进行使用的虚拟内存中被换出的大小,单位KB
  • TIME:进程使用的CPU时间总计,单位秒
  • TIME+:进程使用的CPU时间总计,单位1/100秒
  • TTY:启动进程的终端名,不是从终端启动的进程显示为?
  • UID:进程所有者的用户ID
  • USER:进程所有者的用户名
  • VIRT:进程使用的虚拟内存总量,单位KB,VIRT=SWAP+RES
  • WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
  • %CPU:上次更新到现在的CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比

在运行界面可以执行的指令如下:

  • 1:显示所有CPU负载情况
  • c:切换显示命令名称和完整命令行
  • h:显示帮助信息
  • k:终止一个进程
  • M:根据驻留内存大小进行排序
  • P:根据CPU使用百分比大小进行排序
  • q:退出程序
  • T:根据时间/累计时间进行排序