前言

Linux下的top命令我相信大家都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。但是top命令的其他输出结果我都没有了解,这些指标都代表什么呢,什么情况下需要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?

演示环境

  1. # uname -a
  2. Linux VM_1_11_centos 3.10.-.el7.x86_64 # SMP Tue Aug :: UTC x86_64 x86_64 x86_64 GNU/Linux

top命令

top命令是Linux下常用的性能分析工具,能够实时(默认是3s刷新一次)的显示系统的资源使用情况,以及各种进程的资源使用情况,类似于Windows的任务管理器。

  1. top - :: up days, :, users, load average: 16.32, 18.75, 21.04
  2. Tasks: total, running, sleeping, stopped, zombie
  3. %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
  4. KiB Mem : total, free, used, buff/cache
  5. KiB Swap: total, free, used. avail Mem
  6.  
  7. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  8. root .6g R 198.0 1.4 :15.26 python
  9. root R 113.0 0.7 :48.49 python
  10. root S 82.4 0.4 :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机器,证明系统是长期处于过载状态在运行。

  1. Tasks: total, running, sleeping, stopped, zombie

第二行的Tasks信息展示的系统运行的整体进程数量和状态信息。214 total 表示系统现在一共有214个用户进程,4 running 表示4个进程正在处于running状态,209 sleeping表示209个进程正处于sleeping状态,0 stopped 表示 0 个进程正处于stopped状态,1 zombie表示 有1个僵尸进程。

僵尸进程

子进程结束时父进程没有调用wait()/waitpid()等待子进程结束,那么就会产生僵尸进程。原因是子进程结束时并没有真正退出,而是留下一个僵尸进程的数据结构在系统进程表中,等待父进程清理,如果父进程已经退出则会由init进程接替父进程进行处理(收尸)。由此可见,如果父进程不作为并且又不退出,就会有大量的僵尸进程,每个僵尸进程会占用进程表的一个位置(slot),如果僵尸进程太多会导致系统无法创建新的进程,因为进程表的容量是有限的。所以当zombie这个指标太大时需要引起我们的注意。下面的进程详细信息中的S列就代表进程的运行状态,Z表示该进程是僵尸进程。

消灭僵尸进程的方法:

1.找到僵尸进程的父进程pid(pstress可以显示进程父子关系),kill -9 pid,父进程退出后init自动会清理僵尸进程。(需要注意的是kill -9并不能杀死僵尸进程)

2.重启系统。

  1. %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使用情况。

  • us user 表示用户态的CPU时间比例
  • sy system 表示内核态的CPU时间比例
  • ni nice 表示运行低优先级进程的CPU时间比例
  • id idle 表示空闲CPU时间比例
  • wa iowait 表示处于IO等待的CPU时间比例
  • hi hard interrupt 表示处理硬中断的CPU时间比例
  • si soft interrupt 表示处理软中断的CPU时间比例
  • st steal 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例。

所以整体的CPU使用率=1-id。当us很高时,证明CPU时间主要消耗在用户代码,需要优化用户代码。sy很高时,说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)。wa很高时,说明有进程在进程频繁的IO操作,有可能是磁盘IO,也有可能是网络IO。si很高时,说明CPU时间消耗在处理软中断,网络收发包会触发系统软中断,所以大量的网络小包会导致软中断的频繁触发,典型的SYN Floor会导致si很高。

  1. KiB Mem : total, free, used, buff/cache
  2. KiB Swap: total, free, used. avail Mem

第4,5行显示的是系统内存使用情况。单位是KiB。totol 表示总内存,free 表示没使用过的内容,used是已经使用的内存。buff表示用于读写磁盘缓存的内存,cache表示用于读写文件缓存的内存。avail表示可用的应用内存。

Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用。Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的。这三个值都为0表示系统关闭了swap功能,由于演示环境是一台虚拟机,虚拟机一般都关闭swap功能。

第6行开始往后表示的是具体的每个进程状态:

  1. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  • PID 进程ID
  • USER 进程所有者的用户名,例如root
  • PR 进程调度优先级
  • NI 进程nice值(优先级),越小的值代表越高的优先级
  • VIRT 进程使用的虚拟内存
  • RES 进程使用的物理内存(不包括共享内存)
  • SHR 进程使用的共享内存
  • CPU 进程使用的CPU占比
  • MEM 进程使用的内存占比
  • TIME 进程启动后到现在所用的全部CPU时间
  • COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)

计算原理

在介绍top命令的各项指标计算原理之前,有必要先介绍下Linux下的proc文件系统,因为top命令的各项数据来源于proc文件系统。proc文件系统是一个虚拟的文件系统,是Linux内核和用户的一种通信方式,Linux内核会通过proc文件系统告诉用户现在内核的状态信息,用户也可以通过写proc的方式设置内核的一些行为。与普通文件不同的是,这些proc文件是动态创建的,也是动态修改的,因为内核的状态时刻都在变化。

top显示的CPU指标都是来源于/proc/stat文件信息:

  1. # cat /proc/stat
  2. cpu
  3. cpu0
  4. cpu1
  5. cpu2
  6. cpu3
  7. cpu4
  8. cpu5
  9. cpu6
  10. cpu7

第一行代表的总的CPU信息,后面的是一个CPU的详细信息。

但是这些具体的后面的列都是什么信息呢,我们可以通过man proc找到答案:

  1. user () Time spent in user mode.
  2.  
  3. nice () Time spent in user mode with low priority (nice).
  4.  
  5. system () Time spent in system mode.
  6.  
  7. idle () Time spent in the idle task. This value should be USER_HZ times the second entry in the
  8. /proc/uptime pseudo-file.
  9. iowait (since Linux 2.5.)
  10.  
  11. (5) Time waiting for I/O to complete.
  12.  
  13. irq (since Linux 2.6.-test4)
  14. () Time servicing interrupts.
  15.  
  16. softirq (since Linux 2.6.-test4)
  17. () Time servicing softirqs.
  18.  
  19. steal (since Linux 2.6.)
  20. () Stolen time, which is the time spent in other operating systems when running in a virtual
  21. ized environment
  22.  
  23. guest (since Linux 2.6.)
  24. () Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.
  25.  
  26. guest_nice (since Linux 2.6.)
  27. () Time spent running a niced guest (virtual CPU for guest operating systems under the con
  28. 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文件的对应字段:

  1. # cat /proc/meminfo
  2. MemTotal: kB
  3. MemFree: kB
  4. MemAvailable: kB
  5. Buffers: kB
  6. Cached: kB
  7. SwapCached: kB
  8. Active: kB
  9. Inactive: kB
  10. Active(anon): kB
  11. Inactive(anon): kB
  12. Active(file): kB
  13. Inactive(file): kB
  14. Unevictable: kB
  15. Mlocked: kB
  16. SwapTotal: kB
  17. SwapFree: kB
  18. Dirty: kB
  19. Writeback: kB
  20. AnonPages: kB
  21. Mapped: kB
  22. Shmem: kB
  23. Slab: kB
  24. SReclaimable: kB
  25. SUnreclaim: kB
  26. KernelStack: kB
  27. PageTables: kB
  28. NFS_Unstable: kB
  29. Bounce: kB
  30. WritebackTmp: kB
  31. CommitLimit: kB
  32. Committed_AS: kB
  33. VmallocTotal: kB
  34. VmallocUsed: kB
  35. VmallocChunk: kB
  36. HardwareCorrupted: kB
  37. AnonHugePages: kB
  38. HugePages_Total:
  39. HugePages_Free:
  40. HugePages_Rsvd:
  41. HugePages_Surp:
  42. Hugepagesize: kB
  43. DirectMap4k: kB
  44. DirectMap2M: kB
  45. DirectMap1G: kB

其中total对应于MemTotal,free 对应于MemFree,avail 对应于MemAailable。

总结

文章从top命令的输出结果开始,说明哪些指标的异常值需要我们关注,最后介绍了top命令的cpu计算原理和mem的数据来源。

top命令输出详解的更多相关文章

  1. mysql命令 show slave status\G;命令输出详解

    show slave status\G; 命令输出详解 mysql> show slave status\G; *************************** . row ******* ...

  2. top命令信息详解

    top详解 [root@localhost ~]# top top - 09:36:38 up 17:59, 3 users, load average: 0.00, 0.03, 0.00 Tasks ...

  3. linux的top命令参数详解

    简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...

  4. top命令使用详解

    1.top命令查看服务器负载情况,CPU使用率,进程数等信息. 0.0% wa IO等待占用CPU的百分比 86.9% id  表示空闲的CPU占比 load average数据是每隔5秒钟检查一次活 ...

  5. top命令用法详解

    top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具.通过top命令所提供的互动式界面,用热键可以管理. 语法 top(选项) 选项 -b:以批处理模式 ...

  6. nvidia-smi命令输出详解

    nvidia-smi命令输出如下: +-----------------------------------------------------------------------------+ | ...

  7. linux下top命令参数详解

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. 内存信息.内容如下: Mem: 191272k to ...

  8. linux系统下top命令参数详解

    简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...

  9. Linux中top命令参数详解

    此文摘自(https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html) 简介 top命令是Linux下常用的性能分析工具,能够实 ...

随机推荐

  1. ASP .NET DropDownList多级联动事件

    思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...

  2. 解压压缩文件报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

    压缩包是直接weget 后面加官网上的tar包地址获取的  [root@xuegod43 ~]# tar -zxvf /home/hadoop/hadoop-2.6.5-src.tar.gz gzip ...

  3. C#正则表达式的完全匹配、部分匹配及忽略大小写的问题

    原文:C#正则表达式的完全匹配.部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方.开方等,分别以类似ABS(表达式),Sin(表达式),AS ...

  4. MVC 异步调用

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  5. 修改window.external使JS可调用Delphi方法

    原文地址:http://hi.baidu.com/rarnu/blog/item/4ec80608022766d663d986ea.html 在js中,有一个比较特殊的对象,即window.exter ...

  6. .net core api 跨域

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: h ...

  7. vs2017 cordova调试ios app

    https://docs.microsoft.com/en-us/visualstudio/cross-platform/tools-for-cordova/first-steps/ios-guide ...

  8. Java Web系列:Spring Boot 基础 Spring Security基本使用

    @OneToOne or @ManyToOne Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com ...

  9. CNN(卷积神经网络)、RNN(循环神经网络)和DNN(深度神经网络)

    本文转载修改自:知乎-科言君 感知机(perceptron) 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perceptron),拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换达 ...

  10. windows和linux双系统,重新分区后修复grub

    我电脑里装的是 windows 7 profressional 和 fedora 12 ,本来给 C 盘分了 50G ,原本以为够了,结果50G 瞬间用完,于是乎开始重新分区. PQ 是不能用了,上网 ...