
1
strace是什么
strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
在运维的日常工作中,有些故障和问题未能排查出原因时,使用strace分析一下进程在进行哪些系统调用,也许能提供一些排查的思路与方向。熟悉常用系统调用,能够更好地理解和使用strace。
2
strace如何使用
strace的使用方式之一,就是直接在原本的命令前加上strace即可。比如我们要跟踪 "ls /" 命令执行时的系统调用,可以直接:
strace ls /
# 如果没有strace命令,需要先进行安装
yum install -y strace输出非常复杂,可见一条简单的 ls 命令操作系统为我们封装了许多系统调用。

同样,执行进程时直接在进程的启动命令前加上strace命令即可。
strace sh a.shstrace的另外一种运行模式,是在不中断进程执行的情况下跟踪已经在运行的进程。
这种情况,给strace传递个-p pid 参数。
strace -p 967完成跟踪时,按ctrl + C 结束strace即可。这里用 kubelet 进程作为例子。

下面看一个例子,了解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关于标准错误的调试信息.

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

输出中,第一列显示的是进程的 pid, 接着是毫秒级别的时间,这个是-tt 选项的效果。
每一行的最后一列,显示了该调用所花的时间,是-T选项的结果。
这里的输出只显示 read 系统调用有关的内容,这是因为我们通过-e trace=read 选项指定了。同样,我们可以根据需要指定需要关注的系统调用,不指定就是输出所有。
3
系统调用统计
除了打印系统调用,strace还可以通过 -c 参数来分别统计各种的系统调用情况和其所花的时间(使用-f同时统计子进程的情况)。例如:
strace -f -c -p 967

从统计结果可以清楚地看出,在这一段时间中调用了哪些系统函数,调用了多少次,消耗了多少时间等信息,这对我们分析一个程序是很有帮助的。各项含义如下:
- % time:执行耗时占总时间百分比
- seconds:执行总时间
- usecs/call:单个命令执行时间
- calls:调用次数
- errors: 出错次数
- syscall: 系统调用图中说明统计的这段时间中,kubelet及其子进程有60%的时间花费在了 futex 系统调用上,总共调用了1582次,总花费1秒,单次调用花费668微秒。其他系统调用花费时间也都比较短,说明 kubelet 处于正常运行状态。
点个赞

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

被折叠的 条评论
为什么被折叠?



