记录利用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工具能极大提升效率,而且对于排查根因来说是一个相对必备的工具。
追踪系统调用一步步定位问题,而不是靠巧合解决问题,否则下次遇到问题还是容易事倍功半。