strace工具案例

2023-05-11

记录利用strace排查问题的案例

1. 前言

当系统命令或者第三方工具执行有异常,尝试排查后无明确原因又无从下手时,不妨用strace跟踪下系统调用过程。或者最开始就尝试这个思路,问题可能一目了然。

此处记录几个strace排查问题的实际案例。

2. 排查案例

2.1. ssh时需要等待10s才跳出密码输入界面

  • 现象描述:

    有两台用作相同用途的服务器,ssh登录时其中有一台每次都要等待很久才跳出密码输入的界面。

  • 定位过程

    定位过程中倒腾检查了一通防火墙、selinux、NetworkManager,尝试过抓包对比和ssh -vvv查看详细记录,靠巧合解决了问题。。

    网上查找类似问题,找到一篇文章,基本就是跟着作者的思路和方法排查定位。

    链接:Tutorial: Troubleshooting Linux SSH Login Delay - Why does logging in always take 10 seconds?

  • 原因和链接完全一致:域名解析超时

    • 跟踪过程中可以看到有等待5s的调用,查看上下文,是进程去读取/etc/resolv.conf中的域名,而后去域名服务器解析域名,超时了
    • ssh超时时间5s,抓包看域名解析应答是7.3s返回失败,重试2次均失败,所以导致有10s的等待时间
    • strace看服务器A就没有该步骤。关闭服务器B的sshd配置里的域名解析相关配置,均为内部服务器,不需要解析域名,关闭后正常。
    • 所以跟防火墙等无关,某个策略开启了sshd的域名解析,进行显式关闭后解决问题,也知道了为何会等待10s的原因。
  • 小结

    问题排查方法和思路通用的,排查其他问题也可借鉴。

    核心手段就是:strace -f -p 服务端的sshd进程号 进行attach跟踪,而后进行客户端ssh连接

  • strace常用选项如下,基本都用得到:

1
2
3
4
5
6
7
8
strace -fT -tt -yy [-p sshd进程号]
    -f 跟踪子进程
    -T 系统调用执行耗时,行尾展示
    -tt 开始执行时间,精度ms,行首展示
    -r 打印相对耗时
    -yy 打印fd信息,对于文件会打印/文件名,对于socket会打印四元组
    -o 打印记录到文件
    -ff 搭配-o时使用,同时记录子进程跟踪结果

2.2. 第三方工具在两台服务器表现不一致

  • 现象描述:

    一个内部公共加密解密工具,对其了解仅限bin工具功能和脚本中使用。在平时用的公共服务器A使用正常,但是在新服务器B上执行错误(echo $?返回1),工具执行成功或失败都无打印和日志。

  • 排查方式

    strace -f执行工具,同时跟踪子进程,不跟踪子进程看不出问题。

  • 原因

    和上面类似,这个工具会读取/etc/resolv.conf中的域名服务器,而后去解析域名(一直以为是简单的本地工具,坑。。),而新服务器B上未配置DNS导致poll一直等待结果,超时后失败,配置后使用正常。

2.3. 存储系统写分片失败

  • 现象描述:

    分布式存储系统向某个数据节点写数据分片时,写过程中分片存在且变大,写完后文件丢失。

  • 排查方式

    strace -e trace=file -f -ff -p 进程 -o strace_file.log 跟踪对文件的操作。

    发现由于目的目录不存在导致最后的rename失败,分片文件未按规则分布,导致整体文件不可读。

  • 原因

    早期程序版本的bug导致磁盘写爆,删除部分老数据腾出空间后程序貌似正常,但实际缺少上述目的目录。虽然后续版本不会写爆,该目录可检查优化。

3. 小结

列举了几个实际排查问题的案例,通过strace工具能极大提升效率,而且对于排查根因来说是一个相对必备的工具。

追踪系统调用一步步定位问题,而不是靠巧合解决问题,否则下次遇到问题还是容易事倍功半。


  • 本文作者: xiaodongQ
  • 本文链接: /2023/05/11/strace-case/
  • 版权声明: 本文可以自由拷贝,转载,请注明出处,谢谢! 🤝

Comments