性能优化工具-strace
概述
使用 strace 查看系统调用统计可以帮助你分析一个进程的行为,特别是它在运行时进行的系统调用
原理
strace 使用 ptrace 系统调用追踪目标进程
当被跟踪的进程
用法
基本用法
- 追踪指定的pid
strace -p 1 |
- 直接启动追踪一个新进程
strace bash |
- -o输出到文件
strace bash -o strace.out |
- -f 追踪子进程
strace -f <command> |
- -t ,-r 显示时间
strace -t <command> # 显示时间戳 |
系统调用统计
-c 计算每个系统调用和报告的时间、调用和错误
# strace -c ls |
- % time:该系统调用占用的时间百分比。
- seconds:该系统调用总共占用的时间。
- usecs/call:每个系统调用平均耗时(微秒)。
- calls:该系统调用被调用的次数。
- errors:该系统调用的错误次数。
- syscall: 系统调用名称
通过这个命令,可以简单排查一些系统系统调用耗时过长,或者频率过高的问题
过滤
-e 一个限定表达式,用于修改要跟踪哪些事件或如何跟踪它们。
trace=set:指定要跟踪的系统调用集。set 可以是以下之一:
none: 不追踪任何系统调用file:所有与文件相关的系统调用。process:所有与进程管理相关的系统调用。network:所有与网络相关的系统调用。signal:所有与信号相关的系统调用。ipc:所有与进程间通信相关的系统调用。desc:所有与文件描述符相关的系统调用。memory:所有与内存管理相关的系统调用。all:所有系统调用。
signal=set:指定要跟踪的信号集。
set可以是信号名称或信号编号的列表,如signal=SIGINT,SIGTERM或signal=2,15。signal=all跟踪所有信号。
status=set:跟踪特定状态的系统调用
status=successful成功的系统调用status=failed失败的系统调用
fault=set:跟踪所有导致错误的系统调用。
fault=open追踪所有open的 错误系统调用
write 过滤写相关的系统调用
read 过滤读相关的系统调用
示例:
- 过滤系统调用
# 追踪open、openat、create系统调用 |
- 只追踪信号
例如这行命令不追踪系统调用,但是追踪所有的信号
# strace -e trace=none -e signal=all bash |
- 只追踪失败的系统调用
# strace -e status=failed ls |
用例
获取进程的网络请求内容
strace -t -e trace=network curl http://example.com -o debug.txt |
上述命令利用过滤network请求,并打印了时间戳, 可以在debug.txt得到下述内容,这个将有助于排查网络问题
19:23:25 socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 |
输出后台进程的标准输出
当使用nohup
可以使用
# strace -e trace=write -p <pid> |
实现对后台进程的输出捕获,可以自行配合脚本得到更可读的内容
总结
- 程序使用任何操作系统的功能,都要通过系统调用进行,
strace就是用来剖析程序内部是怎么使用系统调用的,可以通过指定pid或者直接执行命令的方式进程 strace也可以追踪特定进程收到的信号 使用-e signal=set实现- 可以使用
-e一些常用过滤表达式来优化分析效率, 比如只输出失败的,只看网络的等等 - 可以通过
-c输出系统调用周期内的统计信息分析
性能优化工具-strace