top命令输出详解
前言
Linux下的top命令我相信大家都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。但是top命令的其他输出结果我都没有了解,这些指标都代表什么呢,什么情况下需要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?
演示环境
- # uname -a
- 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的任务管理器。
- top - :: up days, :, users, load average: 16.32, 18.75, 21.04
- Tasks: total, running, sleeping, stopped, 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 : total, free, used, buff/cache
- KiB Swap: total, free, used. avail Mem
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- root .6g R 198.0 1.4 :15.26 python
- root R 113.0 0.7 :48.49 python
- 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机器,证明系统是长期处于过载状态在运行。
- 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.重启系统。
- %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很高。
- KiB Mem : total, free, used, buff/cache
- 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行开始往后表示的是具体的每个进程状态:
- 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文件信息:
- # cat /proc/stat
- cpu
- cpu0
- cpu1
- cpu2
- cpu3
- cpu4
- cpu5
- cpu6
- cpu7
第一行代表的总的CPU信息,后面的是一个CPU的详细信息。
但是这些具体的后面的列都是什么信息呢,我们可以通过man proc找到答案:
- user () Time spent in user mode.
- nice () Time spent in user mode with low priority (nice).
- system () Time spent in system mode.
- idle () 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.)
- (5) Time waiting for I/O to complete.
- irq (since Linux 2.6.-test4)
- () Time servicing interrupts.
- softirq (since Linux 2.6.-test4)
- () Time servicing softirqs.
- steal (since Linux 2.6.)
- () Stolen time, which is the time spent in other operating systems when running in a virtual‐
- ized environment
- guest (since Linux 2.6.)
- () Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.
- guest_nice (since Linux 2.6.)
- () 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: kB
- MemFree: kB
- MemAvailable: kB
- Buffers: kB
- Cached: kB
- SwapCached: kB
- Active: kB
- Inactive: kB
- Active(anon): kB
- Inactive(anon): kB
- Active(file): kB
- Inactive(file): kB
- Unevictable: kB
- Mlocked: kB
- SwapTotal: kB
- SwapFree: kB
- Dirty: kB
- Writeback: kB
- AnonPages: kB
- Mapped: kB
- Shmem: kB
- Slab: kB
- SReclaimable: kB
- SUnreclaim: kB
- KernelStack: kB
- PageTables: kB
- NFS_Unstable: kB
- Bounce: kB
- WritebackTmp: kB
- CommitLimit: kB
- Committed_AS: kB
- VmallocTotal: kB
- VmallocUsed: kB
- VmallocChunk: kB
- HardwareCorrupted: kB
- AnonHugePages: kB
- HugePages_Total:
- HugePages_Free:
- HugePages_Rsvd:
- HugePages_Surp:
- Hugepagesize: kB
- DirectMap4k: kB
- DirectMap2M: kB
- DirectMap1G: kB
其中total对应于MemTotal,free 对应于MemFree,avail 对应于MemAailable。
总结
文章从top命令的输出结果开始,说明哪些指标的异常值需要我们关注,最后介绍了top命令的cpu计算原理和mem的数据来源。
top命令输出详解的更多相关文章
- mysql命令 show slave status\G;命令输出详解
show slave status\G; 命令输出详解 mysql> show slave status\G; *************************** . row ******* ...
- top命令信息详解
top详解 [root@localhost ~]# top top - 09:36:38 up 17:59, 3 users, load average: 0.00, 0.03, 0.00 Tasks ...
- linux的top命令参数详解
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- top命令使用详解
1.top命令查看服务器负载情况,CPU使用率,进程数等信息. 0.0% wa IO等待占用CPU的百分比 86.9% id 表示空闲的CPU占比 load average数据是每隔5秒钟检查一次活 ...
- top命令用法详解
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具.通过top命令所提供的互动式界面,用热键可以管理. 语法 top(选项) 选项 -b:以批处理模式 ...
- nvidia-smi命令输出详解
nvidia-smi命令输出如下: +-----------------------------------------------------------------------------+ | ...
- linux下top命令参数详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. 内存信息.内容如下: Mem: 191272k to ...
- linux系统下top命令参数详解
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- Linux中top命令参数详解
此文摘自(https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html) 简介 top命令是Linux下常用的性能分析工具,能够实 ...
随机推荐
- ASP .NET DropDownList多级联动事件
思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...
- 解压压缩文件报错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 ...
- C#正则表达式的完全匹配、部分匹配及忽略大小写的问题
原文:C#正则表达式的完全匹配.部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方.开方等,分别以类似ABS(表达式),Sin(表达式),AS ...
- MVC 异步调用
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- 修改window.external使JS可调用Delphi方法
原文地址:http://hi.baidu.com/rarnu/blog/item/4ec80608022766d663d986ea.html 在js中,有一个比较特殊的对象,即window.exter ...
- .net core api 跨域
什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: h ...
- vs2017 cordova调试ios app
https://docs.microsoft.com/en-us/visualstudio/cross-platform/tools-for-cordova/first-steps/ios-guide ...
- Java Web系列:Spring Boot 基础 Spring Security基本使用
@OneToOne or @ManyToOne Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com ...
- CNN(卷积神经网络)、RNN(循环神经网络)和DNN(深度神经网络)
本文转载修改自:知乎-科言君 感知机(perceptron) 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perceptron),拥有输入层.输出层和一个隐含层.输入的特征向量通过隐含层变换达 ...
- windows和linux双系统,重新分区后修复grub
我电脑里装的是 windows 7 profressional 和 fedora 12 ,本来给 C 盘分了 50G ,原本以为够了,结果50G 瞬间用完,于是乎开始重新分区. PQ 是不能用了,上网 ...