以kubelet为例使用strace命令分析进程系统调用

本文介绍了如何使用strace工具监控和分析Linux进程,特别是kubelet的系统调用。通过strace,我们可以观察到进程与内核交互的细节,包括系统调用、信号传递等,这对于故障排查和运维工作非常有帮助。文章详细讲解了strace的使用方法,如跟踪已运行的进程,控制输出信息的详细程度,并展示了如何统计系统调用的次数和耗时。

4125f6ab2490a8c59f7ba3177059f42d.gif

1

strace是什么

strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。

在运维的日常工作中,有些故障和问题未能排查出原因时,使用strace分析一下进程在进行哪些系统调用,也许能提供一些排查的思路与方向。熟悉常用系统调用,能够更好地理解和使用strace。

2

strace如何使用

strace的使用方式之一,就是直接在原本的命令前加上strace即可。比如我们要跟踪 "ls /" 命令执行时的系统调用,可以直接:

strace ls  /
# 如果没有strace命令,需要先进行安装
yum install -y strace

输出非常复杂,可见一条简单的 ls 命令操作系统为我们封装了许多系统调用。

c326d5ef72943a89e146418933320d92.png

同样,执行进程时直接在进程的启动命令前加上strace命令即可。

strace sh a.sh

strace的另外一种运行模式,是在不中断进程执行的情况下跟踪已经在运行的进程。

这种情况,给strace传递个-p pid 参数。

strace -p 967

完成跟踪时,按ctrl + C 结束strace即可。这里用 kubelet 进程作为例子。

fef4bc446025570c798c2db19bf80e49.png

下面看一个例子,了解strace的各种参数。

strace -tt -T -v -f -e trace=read -o ~/strace.log -s 4 -p 967

-t 在每行输出的前面,显示秒级别的时间

-tt 在每行输出的前面,显示毫秒级别的时间

-ttt 在每行输出的前面,显示微秒级别的时间

-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称

-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,read,write表示只跟踪这四个系统调用.默认的为set=all.

-e trace=file 只跟踪有关文件操作的系统调用.

-e trace=process 只跟踪有关进程管理的系统调用.

-e trace=network 跟踪与网络有关的所有系统调用,比如socket/sendto/connect

-e trace=signal 跟踪所有与系统信号有关的系统调用,比如kill/sigaction

-e trace=ipc 跟踪所有与进程通讯有关的系统调用.

-e trace=desc  和文件描述符相关,比如write/read/select/epoll等

-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。

-d 输出strace关于标准错误的调试信息.

2a7476a4115dcaa53335d220c89121ec.png

因为使用了 -f 参数追踪了所有子进程,可见 kubelet 有多个子进程。再看输出 strace.log 文件的内容。

73b91401524f2951d66a8f3a3036fbd3.png

输出中,第一列显示的是进程的 pid, 接着是毫秒级别的时间,这个是-tt 选项的效果。

每一行的最后一列,显示了该调用所花的时间,是-T选项的结果。

这里的输出只显示 read 系统调用有关的内容,这是因为我们通过-e trace=read 选项指定了。同样,我们可以根据需要指定需要关注的系统调用,不指定就是输出所有。

3

系统调用统计

除了打印系统调用,strace还可以通过 -c 参数来分别统计各种的系统调用情况和其所花的时间(使用-f同时统计子进程的情况)。例如:

strace -f -c  -p 967

f2566e6cea2d0d92e9fe1588324fd32e.png

a7ec64dff08e0ca1d3ad74c5728a821c.png

从统计结果可以清楚地看出,在这一段时间中调用了哪些系统函数,调用了多少次,消耗了多少时间等信息,这对我们分析一个程序是很有帮助的。各项含义如下:

- % time:执行耗时占总时间百分比
- seconds:执行总时间
- usecs/call:单个命令执行时间
- calls:调用次数
- errors: 出错次数
- syscall: 系统调用

图中说明统计的这段时间中,kubelet及其子进程有60%的时间花费在了 futex 系统调用上,总共调用了1582次,总花费1秒,单次调用花费668微秒。其他系统调用花费时间也都比较短,说明 kubelet 处于正常运行状态。

点个赞

3871a94332e22e9bc288f35953dc87dd.gif

再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值