# 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.top

  • top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。top可以动态显示过程,不断刷新当前状态。top命令提供了实时的对系统处理器的状态监视。它将显示系统中的任务列表,内存使用和执行时间对任务进行排序。

# top的2级按钮

image-20230727230803001

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
按键
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

-I: 忽略失效过程
-s: 保密模式
-S: 累积模式

-i<时间>: 设置间隔时间

-u<用户名>: 指定用户名<Hot>
-p<进程号>: 指定进程号<Hot>

-n<次数>: 循环显示的次数   指定 top 命令的迭代次数
1
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
  • 第三步,【根据进程id】保存线程栈信息
    • 当前 Java 程序的所有线程信息都可以通过 jstack命令查看,我们用jstack命令将第一步找到的 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
  • 【性能测试】如何用一条命令完全掌握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
  • 表示共采样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
  • “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