Strace 的使用

2023-03-01 13:08:25 阅读:876 评论:0 点赞:0
所属分类: Nginx Linux 常用命令

一、简介

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 进程

19ed149b-69cd-4420-900c-80bd5c3ba9ad

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;

f3592b0c-997a-4bb4-a5d5-b18d24bbdbfc
我们跟踪发现,只有第一次访问文件需要 open 操作,后面再次请求就不需要重复 open 直接将内容 sendfile 就行了。

三、总结

当发现进程或服务异常时,我们可以通过 strace 来跟踪其系统调用,“看看它在干啥”,进而找到异常的原因。熟悉常用系统调用,能够更好地理解和使用strace。

当然,万能的 strace 也不是真正的万能。当目标进程卡死在用户态时,strace 就没有输出了。

这个时候我们需要其他的跟踪手段,比如 gdb / perf / SystemTap 等。
备注:

1、perf 原因 kernel 支持

2、ftrace kernel 支持可编程

3、systemtap 功能强大,RedHat 系统支持,对用户态,内核态逻辑都能探查,使用范围更广。

标签: Linux nginx strace

永不言弃

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:169
好吧,不知道说点什么...

登录逐梦笔记

注册逐梦笔记

已有账号?