我们知道linux中 创建进程的开销,或者说代价是比较大的。
原因主要是 进程之间 地址空间不共享,资源也不共享,都需要copy一份(不考虑写时复制机制)
而线程之间 共享地址空间,线程间调度的时候地址空间是一样的 tlb cache往往不会大量失效(tlb miss 的代价还是比较大的)
在排查一些系统问题时,往往 top 看到的CPU使用率已经到 100%了,但是看 各个进程的 cpu使用率相加 只有
30% 这种远低于 100%,这是因为 系统快速创建的进程往往没有被显示出来,top更新频率是 1次/s
那么有什么工具可以看到 系统中短时间内有大量进程被创建呢。
可以通过bcc的 execsnoop 工具来查看
sh@ubuntu:~/myspace/work_space/git$ sudo execsnoop-bpfcc
PCOMM PID PPID RET ARGS
ls 24058 23211 0 /usr/bin/ls --color=auto
ls 24059 23211 0 /usr/bin/ls --color=auto
ls 24060 23211 0 /usr/bin/ls --color=auto
ls 24061 23211 0 /usr/bin/ls --color=auto
ls 24062 23211 0 /usr/bin/ls --color=auto
一般可以看到有 大量进程被创建,这种进程一般是 通过shell 脚本 或者 C 语言system 命令直接调用的
一般可以
1. 减少这种方式使用
2. 或者使用 C库里面的C库函数来实现,而不是偷懒使用 system直接调用 shell命令这种
虽然说线程的 创建销毁代价 比较低,但是系统中存在频繁创建销毁的线程,
对系统的压力也是可想而知的。
如何 观察到系统中 是否有大量频繁创建销毁线程的行为呢
可以使用 sar -w 命令来观测 系统动态创建线程的频率和 上下文切换的频率
Linux 5.4.44 (sh) 2020年08月23日 _x86_64_ (4 CPU)
19时23分35秒 proc/s cswch/s
19时23分36秒 5.00 337.00
19时23分37秒 6.00 285.00
19时23分38秒 9.00 295.00
还有一个问题时 如何找到是那个进程在频繁创建 销毁线程呢?
我目前没有找到比较好的工具方法
我自己做法是 运行后台脚本 一直运行 pstree 保存到 文件里,连续看几组进程就能看出来
不知道 还有没有其他高级方法,麻烦留言告诉我
在 查出 具体是哪个进程在频繁创建销毁线程之后,需要 让业务自己去修改
一般是
1. 业务自己树立场景,是否一致需要创建销毁线程,用timer能否满足要求
2. 使用线程池这种高级特性,避免动态创建销毁大量线程