一、简介
Strace
是一个可用于诊断、调试和教学的 Linux
用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。strace 底层使用内核的 ptrace 特性来实现其功能。
在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace 作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。
Strace
是用来跟踪我们程序和系统内核的交互过程,方便我们排查程序问题。
二、使用
2.1 安装
yum install -y strace
2.2 跟踪进程
有两种跟踪方式:
1、通过 strace 启动要跟踪的程序,直接在启动命令前加上 strace
执行即可。
strace ls -lh /var/log/messages
2、跟踪正在运行的进程
# 先查对应进程的ID
ps aux | grep nginx
strace -p <进程ID>
2.3 常用参数
参数 | 说明 |
---|---|
-tt |
在每行输出的前面,显示毫秒级别的时间 |
-T |
显示每次系统调用所花费的时间 |
-v |
对于某些相关调用,把完整的环境变量,文件 stat 结构等打出来。 |
-f |
跟踪目标进程,以及目标进程创建的所有子进程 |
-e |
控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称,例如 -e trace=ipc 表示只跟踪与进程通信的相关调用 |
- o |
把 strace 的输出单独写到指定的文件 |
-s |
当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是 32 个字节 |
-p |
指定要跟踪的进程 pid,要同时跟踪多个 pid,重复多次 -p 选项即可。 |
更多
-e trace=file
跟踪和文件访问相关的调用(参数中有文件名)
-e trace=process
和进程管理相关的调用,比如fork/exec/exit_group
-e trace=network
和网络通信相关的调用,比如socket/sendto/connect
-e trace=signal
信号发送和处理相关,比如kill/sigaction
-e trace=desc
和文件描述符相关,比如write/read/select/epoll等
-e trace=ipc
进程见同学相关,比如shmget等
2.4 跟踪 Nginx worker 进程
2.5 优化 nginx 配置
open_file_cache
用于缓存打开的文件的文件描述符等相关信息:
# max 最多缓存文件数 inactive 自动过期时间
open_file_cache max=500 inactive=60s;
# 使用多少次后将被缓存
open_file_cache_min_uses 1;
# 多久检查下文件是否更新
open_file_cache_valid 60s;
# 是否缓存错误信息(例如文件不存在,下次是否重新打开)
open_file_cache_errors on;
我们跟踪发现,只有第一次访问文件需要 open
操作,后面再次请求就不需要重复 open
直接将内容 sendfile
就行了。
三、总结
当发现进程或服务异常时,我们可以通过 strace 来跟踪其系统调用,“看看它在干啥”,进而找到异常的原因。熟悉常用系统调用,能够更好地理解和使用strace。
当然,万能的 strace 也不是真正的万能。当目标进程卡死在用户态时,strace 就没有输出了。
这个时候我们需要其他的跟踪手段,比如 gdb / perf / SystemTap 等。
备注:
1、perf 原因 kernel 支持
2、ftrace kernel 支持可编程
3、systemtap 功能强大,RedHat 系统支持,对用户态,内核态逻辑都能探查,使用范围更广。