背景:运维这个活其实是系统偏重的活,鄙人一直没做过运维,干了不到一个月,感觉发现其实也有点打杂的感觉,但都是围绕系统、权限、分配多机器、调度、维修、协调、沟通,特别是strace在启动一些服务时启动不了,用它就能很好的定位问题在哪儿。
下面这个主要是讲常用 的一个命令,如下:
运维利器:万能的strace:(批注:这个哥们写得好,赞一个:跟踪进程启动,跟踪命令的执行,根据进程号跟踪,启动时都访问了哪些文件。)
http://www.yunweipai.com/archives/7334.html?utm_source=tuicool&utm_medium=referral
1)跟踪进程启动,主要是系统调用:
strace -tt -f ./some_server ../conf/some_server.conf
2)通过它启动要跟踪的进程:
strace ls -lh /var/log/messages
3)在运行的some_server服务:
pidof some_server
17553
得到其pid 17553然后就可以用strace跟踪其执行:
strace -p 17553
strace常用选项:
从一个示例命令来看:
strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
实例:跟踪nginx, 看其启动时都访问了哪些文件
strace -tt -T -f -e trace=file -o /data/log/strace.log -s 1024 ./nginx
附录:
使用strace追踪多个进程:
http://www.ttlsa.com/tools/use-strace-to-track-multiple-processes/
如何使用strace+pstack利器分析程序性能:
http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html
strace_pstack]# gcc server.c -g -o server
strace_pstack]# gcc client.c -g -o client
[root@iZ25dcp92ckZ strace_pstack]# ./server
listening...
hello
hello
hello
hello
[root@iZ25dcp92ckZ strace_pstack]# ./client
ps -elf | grep server | grep -v grep
0 S root 2327417130 0 80 0 - 1041 hrtime 14:58 pts/1 00:00:00 ./server
[root@iZ25dcp92ckZ strace_pstack]# strace -o server.strace -Ttt -p 23274
Process 23274 attached
能看到生成的server.strace 脚本里时间相差1;s不对,nanosleep:
用pstack脚本找到是哪儿调用了nanosleep系统函数导致慢了1s:
[root@iZ25dcp92ckZ strace_pstack]# sh pstack.sh 23274
#0 0x00007f75e5bec480 in __nanosleep_nocancel () from /lib64/libc.so.6
#1 0x00007f75e5bec334 in sleep () from /lib64/libc.so.6
#2 0x0000000000400813 in ha_ha ()
#3 0x0000000000400aea in main ()
[root@iZ25dcp92ckZ strace_pstack]# vi pstack.sh
下面这个主要是讲常用 的一个命令,如下:
运维利器:万能的strace:(批注:这个哥们写得好,赞一个:跟踪进程启动,跟踪命令的执行,根据进程号跟踪,启动时都访问了哪些文件。)
http://www.yunweipai.com/archives/7334.html?utm_source=tuicool&utm_medium=referral
1)跟踪进程启动,主要是系统调用:
strace -tt -f ./some_server ../conf/some_server.conf
2)通过它启动要跟踪的进程:
strace ls -lh /var/log/messages
3)在运行的some_server服务:
pidof some_server
17553
得到其pid 17553然后就可以用strace跟踪其执行:
strace -p 17553
strace常用选项:
从一个示例命令来看:
strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
实例:跟踪nginx, 看其启动时都访问了哪些文件
strace -tt -T -f -e trace=file -o /data/log/strace.log -s 1024 ./nginx
附录:
使用strace追踪多个进程:
http://www.ttlsa.com/tools/use-strace-to-track-multiple-processes/
如何使用strace+pstack利器分析程序性能:
http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html
strace_pstack]# gcc server.c -g -o server
strace_pstack]# gcc client.c -g -o client
[root@iZ25dcp92ckZ strace_pstack]# ./server
listening...
hello
hello
hello
hello
[root@iZ25dcp92ckZ strace_pstack]# ./client
ps -elf | grep server | grep -v grep
0 S root 2327417130 0 80 0 - 1041 hrtime 14:58 pts/1 00:00:00 ./server
[root@iZ25dcp92ckZ strace_pstack]# strace -o server.strace -Ttt -p 23274
Process 23274 attached
能看到生成的server.strace 脚本里时间相差1;s不对,nanosleep:
用pstack脚本找到是哪儿调用了nanosleep系统函数导致慢了1s:
[root@iZ25dcp92ckZ strace_pstack]# sh pstack.sh 23274
#0 0x00007f75e5bec480 in __nanosleep_nocancel () from /lib64/libc.so.6
#1 0x00007f75e5bec334 in sleep () from /lib64/libc.so.6
#2 0x0000000000400813 in ha_ha ()
#3 0x0000000000400aea in main ()
[root@iZ25dcp92ckZ strace_pstack]# vi pstack.sh
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/8718/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2016-6-6 15:16
评论列表