今天我值班,发现一个生产环境有一个用户的查询脚本一直在运行,大概有2个小时的运行时间了。
大概看了看,这个查询涉及6年的MBS数据,属于大数据查询,一般会比较慢,但不应该慢到这个地步。
其他用户的查询早就结束了,而这个用户的却不仅有在runnning的,还有一个在pending,于是怀疑是否需要停掉这个脚本,以免环境的使用。
CTO看了看,说根据调试信息我应该可以找到原因的。过了一分钟,我没有找到,他找到了。我问,要不要停到这个脚本,他又看看了strace得输出,说没事,这个脚本还在继续进行计算,反正其他用户还没有涌上来(这个用户起得比较早),先让他跑着。
strace是一个轻量级的调试工具,可以快速查看程序、进程的系统调用情况,查看程序的运行状态,类似的有lsof命令。
使用方法:
strace [option] -p PIDstrace [option] command
基本选项:
-p pid
: 查看PID的系统调用情况-o file
: 将调试信息保存到文件,而不是打印到屏幕-f
: 也查看子进程的调用信息,否则,只查看该进程本身的调用-ff
: 一旦有 -o filename
选项,则每个子进程文件保存为 filename.pid
时间相关选项:
-r
: 打印相对时间-t
: 打印绝对时间-tt
: 打印时间,精确到秒-T
: 打印每个系统调用花费的时间
调试信息外观:
-v
: 详细模式,打印完整argv,stat,termio[s]等-x
: 以十六进制打印非ASCII字符-xx
: 以十六进制打印所有字符-a column
: 设置打印的列数,默认是40-s strsize
: 限制打印字符串的长度(默认32)-S sortby
: 对系统调用排序,选择: time, calls, name, nothing (default time)
调试内容定制:
-O overhead
: 设置查看系统调用的开销时间时间overhead秒-e expr
: 使用一个表达式,如 option=[!]all
, option=[!]var
来定义查看的系统调用, option:trace,abbrev,verbose,raw,signal,read,write
-D
: 以子孙进程的形式运行strace,而不是以父进程的形式-c
: 统计每个系统调用的时间、调用、错误等总结信息,最后会打印统计信息
辅助选项:
-q
: 省去attaching、 detaching等信息,如果是调试命令或者输出到文件时候,则自动去除;只有调试现有进程时才需要显式去除-i
: 打印每个系统调用的指令指针-u username
: 以用户的uid/gid运行调试命令,只有root才有此权限-E var=val
: 为执行的调试命令添加环境变量,形式是 var=val
-E var
: 为执行的调试命令删除环境变量,形式是 var=
常用举例:
strace -tfp PIDstrace -o output.txt cmdstrace -o output.txt -fp PID
作者简介:
朱春来(Leslie Zhu),金融工程师,毕业于西安电子科技大学, 喜欢历史,喜欢编程. 日常在GNU/Linux环境下进行C/C++、Python开发,对Common Lisp、Node.js、金融等感兴趣。可以通过邮箱(pythonisland@gmail.com)联系他,或者直接在他的个人主页上留言.
访问朱春来(Leslie Zhu)的个人主页(http://lesliezhu.github.com)