Linux下的top命令我相信你们都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。可是top命令的其余输出结果我都没有了解,这些指标都表明什么呢,什么状况下须要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?python
# uname -a Linux VM_1_11_centos 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
top命令是Linux下经常使用的性能分析工具,可以实时(默认是3s刷新一次)的显示系统的资源使用状况,以及各类进程的资源使用状况,相似于Windows的任务管理器。centos
top - 11:00:54 up 54 days, 23:35, 6 users, load average: 16.32, 18.75, 21.04 Tasks: 209 total, 3 running, 205 sleeping, 0 stopped, 1 zombie %Cpu(s): 29.7 us, 18.9 sy, 0.0 ni, 49.3 id, 1.7 wa, 0.0 hi, 0.4 si, 0.0 st KiB Mem : 32781216 total, 1506220 free, 6525496 used, 24749500 buff/cache KiB Swap: 0 total, 0 free, 0 used. 25607592 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23444 root 20 0 15.6g 461676 4704 R 198.0 1.4 11:15.26 python 16729 root 20 0 9725596 240028 4672 R 113.0 0.7 7:48.49 python 3388 root 20 0 6878028 143196 4720 S 82.4 0.4 1:35.03 python
第一行数据至关于uptime命令输出。11:00:54是当前时间,up 54 days,23:55 是系统已经运行的时间,6 users表示当前有6个用户在登陆,load average:16.32,18.75,21.04分别表示系统一分钟平均负载,5分钟平均负载,15分钟平均负载。缓存
平均负载网络
平均负载表示的平均活跃进程数,包括正在running的进程数,准备running(就绪态)的进程数,和处于不可中断睡眠状态的进程数。若是平均负载数恰好等于CPU核数,那证实每一个核都能获得很好的利用,若是平均负载数大于核数证实系统处于过载的状态,一般认为是超过核数的70%认为是严重过载,须要关注。还需结合1分钟平均负载,5分钟平均负载,15分钟平均负载看负载的趋势,若是1分钟负载比较高,5分钟和15分钟的平均负载都比较低,则说明是瞬间升高,须要观察。若是三个值都很高则须要关注下是否某个进程在疯狂消耗CPU或者有频繁的IO操做,也有多是系统运行的进程太多,频繁的进程切换致使。好比说上面的演示环境是一台8核的centos机器,证实系统是长期处于过载状态在运行。数据结构
Tasks: 214 total, 4 running, 209 sleeping, 0 stopped, 1 zombie
第二行的Tasks信息展现的系统运行的总体进程数量和状态信息。214 total 表示系统如今一共有214个用户进程,4 running 表示4个进程正在处于running状态,209 sleeping表示209个进程正处于sleeping状态,0 stopped 表示 0 个进程正处于stopped状态,1 zombie表示 有1个僵尸进程。app
僵尸进程工具
子进程结束时父进程没有调用wait()/waitpid()等待子进程结束,那么就会产生僵尸进程。缘由是子进程结束时并无真正退出,而是留下一个僵尸进程的数据结构在系统进程表中,等待父进程清理,若是父进程已经退出则会由init进程接替父进程进行处理(收尸)。因而可知,若是父进程不做为而且又不退出,就会有大量的僵尸进程,每一个僵尸进程会占用进程表的一个位置(slot),若是僵尸进程太多会致使系统没法建立新的进程,由于进程表的容量是有限的。因此当zombie这个指标太大时须要引发咱们的注意。下面的进程详细信息中的S列就表明进程的运行状态,Z表示该进程是僵尸进程。性能
消灭僵尸进程的方法:优化
1.找到僵尸进程的父进程pid(pstress能够显示进程父子关系),kill -9 pid,父进程退出后init自动会清理僵尸进程。(须要注意的是kill -9并不能杀死僵尸进程)spa
2.重启系统。
%Cpu(s): 31.9 us, 30.3 sy, 0.0 ni, 37.0 id, 0.0 wa, 0.0 hi, 0.8 si, 0.0 st
第三行的%Cpu(s)表示的是整体CPU使用状况。
因此总体的CPU使用率=1-id。当us很高时,证实CPU时间主要消耗在用户代码,须要优化用户代码。sy很高时,说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)。wa很高时,说明有进程在进程频繁的IO操做,有多是磁盘IO,也有多是网络IO。si很高时,说明CPU时间消耗在处理软中断,网络收发包会触发系统软中断,因此大量的网络小包会致使软中断的频繁触发,典型的SYN Floor会致使si很高。
KiB Mem : 32781216 total, 663440 free, 7354900 used, 24762876 buff/cache KiB Swap: 0 total, 0 free, 0 used. 24771700 avail Mem
第4,5行显示的是系统内存使用状况。单位是KiB。totol 表示总内存,free 表示没使用过的内容,used是已经使用的内存。buff表示用于读写磁盘缓存的内存,cache表示用于读写文件缓存的内存。avail表示可用的应用内存。
Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用。Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的。这三个值都为0表示系统关闭了swap功能,因为演示环境是一台虚拟机,虚拟机通常都关闭swap功能。
第6行开始日后表示的是具体的每一个进程状态:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
在介绍top命令的各项指标计算原理以前,有必要先介绍下Linux下的proc文件系统,由于top命令的各项数据来源于proc文件系统。proc文件系统是一个虚拟的文件系统,是Linux内核和用户的一种通讯方式,Linux内核会经过proc文件系统告诉用户如今内核的状态信息,用户也能够经过写proc的方式设置内核的一些行为。与普通文件不一样的是,这些proc文件是动态建立的,也是动态修改的,由于内核的状态时刻都在变化。
top显示的CPU指标都是来源于/proc/stat文件信息:
# cat /proc/stat cpu 1151829380 20277 540128095 1909004524 21051740 0 10957596 0 0 0 cpu0 143829475 3918 67658924 235696976 5168514 0 1475030 0 0 0 cpu1 144407338 1966 67616825 236756510 3969110 0 1392212 0 0 0 cpu2 144531920 2287 67567520 238021699 2713175 0 1363460 0 0 0 cpu3 143288938 2366 67474485 239715220 2223739 0 1356698 0 0 0 cpu4 143975390 3159 67394206 239494900 1948424 0 1343261 0 0 0 cpu5 144130685 2212 67538520 239431294 1780756 0 1349882 0 0 0 cpu6 144009592 2175 67536945 239683876 1668203 0 1340087 0 0 0 cpu7 143656038 2193 67340668 240204045 1579816 0 1336963 0 0 0
第一行表明的总的CPU信息,后面的是一个CPU的详细信息。
可是这些具体的后面的列都是什么信息呢,咱们能够经过man proc找到答案:
user (1) Time spent in user mode. nice (2) Time spent in user mode with low priority (nice). system (3) Time spent in system mode. idle (4) Time spent in the idle task. This value should be USER_HZ times the second entry in the /proc/uptime pseudo-file. iowait (since Linux 2.5.41)
(5) Time waiting for I/O to complete. irq (since Linux 2.6.0-test4) (6) Time servicing interrupts. softirq (since Linux 2.6.0-test4) (7) Time servicing softirqs. steal (since Linux 2.6.11) (8) Stolen time, which is the time spent in other operating systems when running in a virtual‐ ized environment guest (since Linux 2.6.24) (9) Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel. guest_nice (since Linux 2.6.33) (10) Time spent running a niced guest (virtual CPU for guest operating systems under the con‐ trol of the Linux kernel).
也就是说从第二列开始日后分别是user,nice,system,idle,iowait,irq(硬中断),softirq(软中断),steal,guest,guest_nice的CPU时间,单位一般是10ms。那么top里面的比例又是怎么算出的呢?
因为CPU时间是一个累加值,因此咱们要求一个时间段差值来反映当前的CPU状况,top默认是3s。例如如今取一个user值user1,和当前的一个总量的CPU时间total1
其中total等于上面各项相加,也就是total=user+nice+system+idle+iowait+irq+softirq+steal+guest+guest_nice。3秒后再去一个user值user2和一个总量total2。
那么这3秒钟的user平均cpu占比就等于((user2-user1)/ (total2-total1))/ 3 * 100%。另外每一个具体的CPU计算方式同理。
top内存相关的指标直接读取/proc/meminfo文件的对应字段:
# cat /proc/meminfo MemTotal: 32781216 kB MemFree: 1043556 kB MemAvailable: 25108920 kB Buffers: 427516 kB Cached: 22084612 kB SwapCached: 0 kB Active: 18640888 kB Inactive: 10534920 kB Active(anon): 6664480 kB Inactive(anon): 412 kB Active(file): 11976408 kB Inactive(file): 10534508 kB Unevictable: 4 kB Mlocked: 4 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 1092 kB Writeback: 0 kB AnonPages: 6663764 kB Mapped: 347808 kB Shmem: 1212 kB Slab: 2201292 kB SReclaimable: 1957344 kB SUnreclaim: 243948 kB KernelStack: 73392 kB PageTables: 57300 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 16390608 kB Committed_AS: 42170784 kB VmallocTotal: 34359738367 kB VmallocUsed: 61924 kB VmallocChunk: 34359625048 kB HardwareCorrupted: 0 kB AnonHugePages: 364544 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 376680 kB DirectMap2M: 26886144 kB DirectMap1G: 8388608 kB
其中total对应于MemTotal,free 对应于MemFree,avail 对应于MemAailable。
文章从top命令的输出结果开始,说明哪些指标的异常值须要咱们关注,最后介绍了top命令的cpu计算原理和mem的数据来源。