bcc工具之execsnoop

我们知道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) 	20200823日 	_x86_64_	(4 CPU)

192335秒    proc/s   cswch/s
1923365.00    337.00
1923376.00    285.00
1923389.00    295.00

还有一个问题时 如何找到是那个进程在频繁创建 销毁线程呢?
我目前没有找到比较好的工具方法
我自己做法是 运行后台脚本 一直运行 pstree 保存到 文件里,连续看几组进程就能看出来
不知道 还有没有其他高级方法,麻烦留言告诉我

在 查出 具体是哪个进程在频繁创建销毁线程之后,需要 让业务自己去修改
一般是

1. 业务自己树立场景,是否一致需要创建销毁线程,用timer能否满足要求
2. 使用线程池这种高级特性,避免动态创建销毁大量线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值