设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

运维利器:万能的strace(3)

发布时间:2021-01-04 17:34 所属栏目:53 来源:网络整理
导读:如果人工输入每一个具体的系统调用名称,可能容易遗漏.于是strace提供了几类常用的系统调用组合名字. -e trace=file ? ? 跟踪和文件访问相关的调用(参数中有文件名) -e trace=process ?和进程管理相关的调用,比如for

如果人工输入每一个具体的系统调用名称,可能容易遗漏.于是strace提供了几类常用的系统调用组合名字.

-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等

绝大多数情况,我们使用上面的组合名字就够了.实在需要跟踪具体的系统调用时,可能需要注意C库实现的差异.

比如我们知道创建进程使用的是fork系统调用,但在glibc里面,fork的调用实际上映射到了更底层的clone系统调用.使用strace时,得指定-e trace=clone,指定-e trace=fork什么也匹配不上.

3、 性能分析

假如有个需求,统计Linux 4.5.4 版本内核中的代码行数(包含汇编和C代码).这里提供两个Shell脚本实现:

poor_script.sh:

!/bin/bash

total_line=0
while read filename; do
line=$(wc -l $filename | awk ‘{print $1}’)
(( total_line += line ))
done < <( find linux-4.5.4 -type f ?( -iname ‘.c’ -o -iname ‘.h’ -o -iname ‘*.S’ ) )
echo “total line: $total_line”

good_script.sh:

!/bin/bash

find linux-4.5.4 -type f ?( -iname ‘.c’ -o -iname ‘.h’ -o -iname ‘*.S’ ) –

print0 \
| wc -l —files0-from – | tail -n 1

两段代码实现的目的是一样的. 我们通过strace的-c选项来分别统计两种版本的系统调用情况和其所花的时间(使用-f同时统计子进程的情况)

从两个输出可以看出,good_script.sh 只需要2秒就可以得到结果:19613114行.它大部分的调用(calls)开销是文件操作(read/open/write/close)等,统计代码行数本来就是干这些事情.

而poor_script.sh完成同样的任务则花了539秒.它大部分的调用开销都在进程和内存管理上(wait4/mmap/getpid…).

实际上,从两个图中clone系统调用的次数,我们可以看出good_script.sh只需要启动3个进程,而poor_script.sh完成整个任务居然启动了126335个进程!

而进程创建和销毁的代价是相当高的,性能不差才怪.

总结

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

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

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

怎么让运维更具逼格?

运维发展至今,早已不是刀耕火种的时代,不应该仍然是“背黑锅侠”,“背服务器侠”.运维可以更高逼格、更高价值,运维明天可以更美好!

“重新定义运维”让这些成为可能

汇聚整个行业的力量,集合海内外专家的智慧,我们在路上!

以“重新定义运维”为主题的GOPS2016全球运维大会·上海站,已正式启动.您可扫描下方二维码,或点击文末“阅读原文”链接,以了解详情:

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读