背景: 之前总是使用top命令,但是总是记不住相关的交互式参数,其实RTFM和STFW这两种方式已经很棒了,但自己还是想总结一下,算作知识积累,也算是重新学习,仅供参考。
top (table of processes) 一般用于实时显示Linux进程的相关信息,包括CPU使用率、内存使用率
1. $ top // 按q退出
2. $ top // 按h键则出现帮助
3. $ top // 按pgup/pgdown 进行翻页
4. $ top // 按s后,然后输入1.0,则改变刷新频率为一秒刷新一次,默认是3秒刷新一次
5. $ top -n [X] // 重复输出X次,然后退出
6. $ top // 按 k 再输入 pid号将杀死这个进程,如果按 r 则设置优先级
7. $ top // 按照列进行排序,默认是按照CPU这一列进行排序。
某列 | %CPU | %MEM | PID | TIME+ |
按键 | P | M | N | T |
例如: 如果按照 内存 进行排序,则按 M 即可
按 m 切换 内存显示方式,同时 显示内存占用率,内存占用率 = (total - avail mem) / total *100%
可用内存大约 6890.5MiB,整体内存 7902.5MiB,上图有一个逗号和点号,用于分隔开了avail Mem
连续按 m 键会有不同的显示:
表示 目前内存占用率在13%
8. $ top //按 u 来输入用户名或用户id,来指定用户来过滤进程
或 直接 $ top -u [user name]
9. $ top
改变界面所显示单元大小
使用 E 来改变上部分的内存值和虚拟内存的单位:
Mem: total,free,used,buff/cache
Swap: total,free,used,buff/cache
使用 e 来挑选下部分的进程列表的显示值的单位:
pid user pr ni virt res shr s %CPU %MEM TIME+ COMMAND
10. $ top // 按 1 则打开或关闭单独CPU的统计或 总体统计
CPU的显示视图:可以 按 t 则打开或关闭CPU的显示视图,包括 竖线或 加粗方块 显示,多次按t将关闭CPU的显示
内存的显示视图:按 m 则打开或关闭内存的显示视图,包括 竖线或 加粗方块 显示,多次按m将关闭内存的显示
按 2 则打开 numa相关信息。
11. $ top // 改变字体颜色:
按 z 进行添加颜色显示,按 Z 进入颜色设置,S/M/H/T 或 1/2/3/4/5/6/7来进行选择
12. $ top // 按 c 显示进程的命令路径:
13. $ top // 按 V 显示显示进程的层级:
14. $ top // 按 l 显示关闭 load avg显示,是l不是竖线
15. $ top // 按 y 进行查看运行的任务:
16. $ top // 按 o 进行过滤,并输入过滤表达式 %MEM>5.0 清除过滤表达式使用 = 进行清除,
17. $ top // 输入F,并选择P选项,查看线程执行过程中是否调度到其它CPU core
F 可用于添加某一列、删除某一列、排序某一列,是交互式的一种,通过选择将某一列带上* 号即可。
查看进程/线程运行在哪个 CPU 核心上
先添加核心显示列
-
按
f
:进入字段选择界面 -
按
j
:向下滚动到P = Last Used Cpu (SMP)
字段 -
按空格键:选中该字段(前方会出现
*
标记) -
按
q
:退出字段选择界面
查看实时核心绑定
-
观察新增的
P
列,显示每个任务最后一次运行的 CPU 核心编号(0-based)
18. $ top // 输入H,由进程显示为线程的方式
或指定某个进程来看其线程 $ top -p $PID -H // 查看某个进程内所有线程的CPU资源占用
19. $ top // 当某一行太长,屏幕无法显示完整,则方向键 上下左右移动即可。
20. $ top //首先按 x b 使其某一列变高亮,然后 shift + > 或 shift + < 可以向右或向左 改变排序的列,这样查看各个列的资源占用最高的情况。
x :用于列高亮的开关,用于提示当前是按照哪一列进行排序的。
y :对于“”运行中“的任务的 行 高亮的开关
b : 只有先按x或y,再按b才会生效。 当cpu(按t)和内存(按m)的条状图被选择的时候,按b也将会受到改变或影响。'b' bold/reverse (only if 'x' or 'y')
21. RES 代表这个进程消耗或占用物理内存的真实大小,%MEM = RES/total
%MEM = 113.4/7902.5 * 100% = 1.434 约等于 1.4
RES代表resident,居住、住户或常驻的。
SHR代表共享内存大小,它是 RES的子集,可用与其他进程的共享内存的大小。关于SHR存储了什么,可以通过 man top 去查看。共享内存的好处是多个进程可以共享一部分内存,节约了内存的使用。
分为四个象限,包括私有的和共享的,匿名的分配内存或基于文件的。
SHR包括 所有的2和4,以及一部分的3,不包括1.
22. total = free + used + buff/cache
如上图所示: total(8092252) = free(6720084) + used(782528) + buff/cache(589640)
内存可用率为 = avail Mem / total ,而不是 free / total ,这一点需要注意,不用手动计算而是通过按m键即可显示当前的占用率,用100%减去即可得到内存可用率。
占用率 + 可用率 = 100%。 同理 使用free命令也是一样,total = free + used + buff/cache:
当使用不同的换算单位时候,可能会出现一些进位的误差,可以使用kb的方式来查看(free 或 free -k),例如:如果使用MB可能得到的数字不一定相等但是会基本保持一致。
而有的比较老的系统可能会显示如下图所示的:
total(Mem)= used(Mem) + free(Mem) 15152 = 14896 + 256
used(Mem) = userd(-/+ buffers) + buffers(Mem) 14896 = 12368 + 2528
free(-/+buffers) = free(Mem) + buffers(Mem) 2784 = 256 + 2528
存在 -/+ buffers/cache这一行数字,这个计算也不同,如上公式。
占用率为 userd(-/+ buffers) / total = 12368/15152*100%
空闲率为 free(-/+buffers) / total = 2784/15152*100%.
无论新系统还是老系统,buffers/cache即使存在使用或占用内存的情况 都认为可以为应用程序进行缩减或减小。
buffers: 存在于内存中,一般是磁盘的块数据,以及文件系统的一些元数据metadata,
cached: 存在于内存中,用于页的缓存,用于缓存一些从硬盘读取的Page,只用于缓存磁盘的数据。
22. 各种窗口,存在 Def、Job、Mem、Usr这四种。
A 打开或关闭4类窗口,toggle
a 顺序切换下一个窗口
w 切换上一个窗口
g 输入数值进行选择
22. VIRT 代表这个进程消耗或占用虚拟内存的大小,包括了代码、数据、共享库和一些页
总结:
1. top -p $PID -H 来查看相关的进程的所有线程的性能情况
2. c 显示命令路径
3. V显示进程层级
4. e/E 切换显示的单位
5. P/M 排序,默认是CPU排序,或者xb然后shift+>
6. 1 打开CPU的各类统计
7. F,P-Last Used Cpu(SMP) ,查看进程/线程运行在哪个 CPU 核心上
8. j 调整显示,对齐等
9. m 显示内存占比或不同的内存显示
10. top -b -n 10 > /tmp/top-report.txt 以batch方式刷新10次并将结果存储在top-report中,因为以交互式的top会不停的刷新结果,不利于后期的处理和分析,而以batch方式可以将结果某个时间的结果快照保存到磁盘中,以支持后续的分析,结合crontab,可以实时记录系统的top状态。
#!/bin/sh
NAME="top_"$(date +%Y-%m-%d)
/usr/bin/top -b -d 1 -n 1 >> $NAME.txt
crontab -e 输入 */1 * * * * /bin/bash /root/test.sh即可。
参考文档:
1. https://man7.org/linux/man-pages/man1/top.1.html
2. https://phoenixnap.com/kb/top-command-in-linux