# Linux进程分析
# 目录
[TOC]
ps -ef # 查看所有进程
# 1.命令ps
- 查看用户在执行的命令
ps -aux | grep whoway
1
# 命令ps的使用-建议ps-afx
root@ubuntu:~/huawei/classic-flang-12-version# ps -afx | grep bash
18666 pts/0 Ss 0:00 \_ -bash
23854 pts/0 S 0:00 \_ bash debug-build.sh
23860 pts/0 S 0:00 | \_ bash build-llvm-project.sh -n 32 -t AArch64 -i -p /root/huawei/classic-flang-12-version/install
23940 pts/0 S+ 0:00 \_ grep --color=auto bash
2183 pts/1 Ss 0:00 \_ -bash
2197 pts/2 Ss 0:00 \_ -bash
17467 pts/3 Ss 0:00 \_ -bash
31389 ? S 0:00 bash build-debug.sh
root@ubuntu:~/huawei/classic-flang-12-version# ps -aux | grep bash
root 2183 0.0 0.0 8080 12 pts/1 Ss 2022 0:00 -bash
root 2197 0.0 0.0 8176 12 pts/2 Ss 2022 0:00 -bash
root 17467 0.0 0.0 8180 12 pts/3 Ss Jan08 0:00 -bash
root 18666 0.0 0.0 11168 7964 pts/0 Ss 16:09 0:00 -bash
root 23854 0.0 0.0 6140 2800 pts/0 S 17:34 0:00 bash debug-build.sh
root 23860 0.0 0.0 6140 2788 pts/0 S 17:34 0:00 bash build-llvm-project.sh -n 32 -t AArch64 -i -p /root/huawei/classic-flang-12-version/install
root 23947 0.0 0.0 5664 728 pts/0 S+ 17:38 0:00 grep --color=auto bash
root 31389 0.0 0.0 6140 1452 ? S 13:01 0:00 bash build-debug.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 2.top
- top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。top可以动态显示过程,不断刷新当前状态。top命令提供了实时的对系统处理器的状态监视。它将显示系统中的任务列表,内存使用和执行时间对任务进行排序。
# top的2级按钮
Z:改变颜色;B:加粗
t:显示和隐藏任务/cpu信息;m:内存信息
1:监控每个逻辑CPU的状况;
f:进入字段显示配置模式,可增加或者移除显示字段,按相应的字母新增或去除;o:进入字段顺序设置模式,可配置显示位置顺序,按相应的字母往下移动,按“shift+相应的字母”往上移动
F:进入字段排序配置模式,可设置排序的字段;
R:正常排序/反向排序;
s:设置刷新的时间
u:输入用户,显示用户的任务
i:忽略闲置和僵死进程。这是一个开关式命令。
r:重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
c:切换显示命令名称和完整命令行<Hot>
M:根据驻留内存大小进行排序。<Hot>
P:根据CPU使用百分比大小进行排序<Hot>
H:显示线程, 设置线程模式下:第二行的tasks指的是线程个数<Hot>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
按键 | |
---|---|
f | 可更改==显示的列信息==,f键后显示如下【==还能告诉简写的全单词==】 |
1 | 看cpu多个核心的占比 |
0 | |
2 | |
3 | |
u【user】 | 【过滤用户】在top命令显示中,,然后输入用户名,则可以查看相应的用户进程 |
i【ignore】 | 【隐藏闲置或僵死】 在top命令下,,可以隐藏闲置或僵死的进程,效果跟输入top -i是一样的。 |
大写E【exchange,互换,==由于上方,所以大写==】 | [切换上方-内存信息区域的显示单位]top命令默认以K为单位显示内存大小,可以通过来。 |
小写e【exchange,互换,==由于下方,所以小写==】 | 下方动态的-进程列表中,内存的单位默认也是KB,我们可以通过。来切换单位 |
小写字母m | 可以控制是否显示内存信息 |
小写字母x | 通过来粗体显示==当前排序==的列【比如配合,大写的P(进程CPU,根据CPU使用百分比大小进行排序)和大写的M(内存)】 |
c | 显示完整的执行命令,效果跟top -c相同。 |
h | 来显示帮助信息【各种==命令==】 |
B:加粗 | blod加粗显示or不加粗 |
- 19:40:09: 当前时间
- up 3:54: 系统运行的时间
- 1 user: 当前登录用户数
- load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
- Tasks:276 total: 进程总数
- 2 running: 正在运行的进程数
- 197 sleeping: 睡眠的进程数
- 0 stopped: 停止的进程数
- 0 zombie: 僵尸进程数
扩展:这里列举10个类top工具,可以查看更多的进程网络信息,有了这些工具,你再也不用担心不能查看Linux的进程信息了【都是需要另外装的】
# 排序方式
3、按CPU占用率排序
Shift+p 按CPU排序
4、按内存占用率排序
Shift+m 按内存使用排序
5、按CPU占用时间排序
Shift+t 按CPU用时排序
# Shift+n 按PID排序
# 面试-根据Pid查出消耗Cpu最高的线程号
- 根据Pid查出消耗Cpu最高的线程号
- top -Hp pid ,显示一个进程的线程运行信息列表。按下P,进程按照Cpu使用率排序
top -Hp 2616592
- H表示排序的higher
- p是process进程的意思
top // 每隔3秒显示所有进程的资源占用情况
top -d 1 // 【每隔1秒】显示所有进程的资源占用情况
top -c // 每隔3秒显示进程的资源占用情况,并显示进程的【命令行参数(默认只有进程名)】
top -p 12345 -p 6789 // 【每隔3秒】显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是123456的进程的资源使用情况,并显式该进程启动的命令行参数
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
-I: 忽略失效过程
-s: 保密模式
-S: 累积模式
-i<时间>: 设置间隔时间
-u<用户名>: 指定用户名<Hot>
-p<进程号>: 指定进程号<Hot>
-n<次数>: 循环显示的次数 指定 top 命令的迭代次数
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 面试-腾讯-top和jstack高频面试题:Java程序占用 CPU 过高怎么排查
参考资料:https://cloud.tencent.com/developer/article/1780386
- 第一步,使用 top 找到占用 CPU 最高的 Java 进程
- 第2步,
top -Hp pid
命令查看占用 CPU 最高的线程
可以看到占用 CPU 最高的那个线程 PID 为 13756。
然后将 13756转换为 16 进制的,后面会用到,可以用在线进制转换的网站直接转换,转换结果为 0x35bc
1
2
3
2
3
- 第三步,【根据进程id】保存线程栈信息
- 当前 Java 程序的所有线程信息都可以通过
jstack
命令查看,我们用jstack
命令将第一步找到的 Java 进程的线程栈保存下来。
- 当前 Java 程序的所有线程信息都可以通过
jstack 13731这是进程id > thread_stack.log
1
- 第四步,在线程栈中查找最贵祸首的线程**
第二步已经找到了这个罪魁祸首的线程 PID,并把它转换成了 16 进制的,第三步保存下来的线程栈中有所有线程的 PID 16 进制信息,我们在线程栈中查找这个16进制的线程 id (0x35bc
)
怎么样,现在一目了然了,线程名称、线程状态、以及哪行代码消耗了最多的 CPU 都很清楚了。
# 面试3-百度-top的采样
-b: 以批处理模式运行 top 命令,以便将数据输出到文件或管道中。
-c: 显示【完整的执行命令】
-d: 屏幕刷新画间隔时间<Hot>
1
2
3
4
2
3
4
- 【性能测试】如何用一条命令完全掌握linux系统性能监控
- https://blog.csdn.net/u010521062/article/details/117408732
教会大家如何用一条命令解决大部分性能测试中可能会遇到的场景
以sytemd(进程ID为1即PID=1)作为被测进程为例,来说明如何监控systemd进程的性能使用情况
采样3次,采样间隔为10s;
top -d 10 -p 1 -n 3 -b
1
2
3
2
3
- 表示共采样3次,数字3可以自定义为其他采样次数;
- 也就是执行3次top命令
- -b表示按批次执行,3次采样数据都会显示;如果不加-b,则只展示最新数据,不会同时显示3次的数据
top -d 10 -p 1 -n 3
1
# 常用方式-结合grep之类的获得or重定向到csv之类的
- 下面的加上-b也是一样的!
whoway@dell:~$ top -d 3 -p 2705808 -n 3 | grep 27058
2705808 jiangxi+ 20 0 6159820 356168 13664 S 200.0 0.1 751:48.97 qemu-system-bet
2705808 jiangxi+ 20 0 6159820 356168 13664 S 201.7 0.1 751:55.02 qemu-system-bet
2705808 jiangxi+ 20 0 6159820 356168 13664 S 201.7 0.1 752:01.07 qemu-system-bet
1
2
3
4
2
3
4
- “grep systemd”,表示只输出匹配到的 systemd进程的数据,不需要输出系统的性能数据;
采样2h,采样间隔为10s,性能数据保存到test.csv文件中
top -d 10 -p 1 -n 720 | grep systemd > test.csv
1
# 【总结】我们发现,这些分析,后续都是grep或者awk或者sed去处理!所以那些是重点
# 参考资料
- https://www.11meigui.com/2020/linux-all-top-command.html