Linux top命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
一、任务队列信息
top - 13:26:56 up 0 min, 1 user, load average: 0.09, 0.03, 0.01
第一行,任务队列信息,同 uptime 命令的执行结果
系统时间:13:26:56
运行时间:up 0 min,
当前登录用户: 1 user
负载均衡(uptime) load average: 0.09, 0.03, 0.01
average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
计算公式:load(t) = load(t-1) e^(-5/60) + n (1 - e^(-5/60)),迭代计算,其中n为run-queue length。
为什么采用这个计算公式呢?
由Exponential Smoothing方程有,Y(t)= Y(t-1) + a*[X(t) - Y(t-1)],whereX(t) is the input raw data, Y(t - 1) is the value due to the previoussmoothing iteration and Y(t) is the new smoothed value.
令a=1-b,b为e^(-5/60),就可以得到load average的计算公式
采用此公式的好处:局部的load抖动不会对load average造成重大影响,使其平滑。
https://blog.csdn.net/duzilonglove/article/details/80111753
二、Tasks — 任务(进程)
Tasks: 75 total, 1 running, 74 sleeping, 0 stopped, 0 zombie
总进程:75 total, 运行:1 running, 休眠:74 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie
ps aux
S 进程状态 l 内存中有锁定空间 N 优先级低 < 优先级高 + 前台运行 s 顶级进程
僵尸进程:如果子进程退出,但是父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符pid仍然保存在系统中,那么该子进程叫做僵尸进程
孤儿进程:即父进程退出后,它的一个或多个子进程还在运行,那么这些子进程叫做孤儿进程
处理僵尸进程:找出父进程号,然后kill 父进程,之后子进程(僵尸进程)会被托管到其他进程,如init进程,然后由init进程将子进程的尸体(task_struct)释放掉。
init进程是linux内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
进程:https://www.cnblogs.com/yinbiao/p/11201937.html
僵尸进程处理:https://zhuanlan.zhihu.com/p/42199755
三、cpu状态信息
%Cpu(s): 0.0 us, 16.7 sy, 0.0 ni, 83.3 id, 0.0 wa, 0.0 hi, 0.0 si,
0.0 us【user space】— 用户空间占用CPU的百分比。
16.7 sy【sysctl】— 内核空间占用CPU的百分比。
0.0 ni【nice】— 改变过优先级的进程占用CPU的百分比
83.3 id【idolt】— 空闲CPU百分比
0.0 wa【wait】— IO等待占用CPU的百分比
0.0 hi【Hardware IRQ】— 硬中断占用CPU的百分比
0.0 si【Software Interrupts】— 软中断占用CPU的百分比
us + sy + ni + id + wa + hi + si + st = 100%
hi、si:https://blog.csdn.net/pxz_002/article/details/7327668
四、内存状态
KiB Mem : 999696 total, 756568 free, 104484 used, 138644 buff/c
total : 总内存大小
free : 是未使用内存的大小
used : 是已使用内存的大小,包含了共享内存
buff / cache : 缓存和缓冲区的大小
可用内存=free + buffer + cached
普通机器:total=used+free
虚拟机器:total=used+free+buff/cache
buffer
即写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘。
cache
即读磁盘时,数据从磁盘读出后,暂留在缓冲区(cache),为后续程序的使用做准备。
五、swap交换分区信息
KiB Swap: 1048572 total, 1048572 free, 0 used. 734956 avail
avail:可用交换取总量
如果系统的物理内存用光了,则会用到swap。系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。所以要高度重视。
swap=VIRT-RES
查看哪些进程用了Swap分区:
查看文件:awk '/^Swap:/ {SWAP+=KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲END{print SWAP"…(pid)/smaps
外部命令:iotop
查看哪些进程用了Swap分区:https://www.cnblogs.com/EasonJim/p/8100499.html
六、空行
空行
七、各进程(任务)的状态监控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
NI 是优先值,来是用户层面的概念,源 PR是进程的实际优先级, 是给百内核(kernel)看(用)的。
一般情度况下,PR=NI+20, 如果一个进程知的优先级PR是20, 那么它的NI(nice)值就道是20-20=0
VIRT:virtual memory usage 虚拟内存
进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES:resident memory usage 常驻内存
进程当前使用的内存大小,但不包括swap out
包含其他进程的共享
如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR:shared memory 共享内存
除了自身进程的共享内存,也包括其他进程的共享内存
虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
计算某个进程所占的物理内存大小公式:RES – SHR
swap out后,它将会降下来
DATA
数据占用的内存。如果top没有显示,按f键可以显示出来。
真正的该程序要求的数据空间,是真正在运行中要使用的。
%CPU和cpu(s)的差别:
我们发现Cpu(s)表示的是 所有用户进程占用整个cpu的平均值,由于每个核心占用的百分比不同,所以按平均值来算比较有参考意义。而**%CPU显示的是进程占用一个核的百分比**,而不是整个cpu(12核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100。
%CPU和cpu(s):https://blog.csdn.net/q2519008/article/details/79985673
八、top命令的使用
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期