Strace诊断问题
技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。
有时候在 CPU 列表中能看到 CPU 主要消耗在内核态「sy」,而不是用户态「us」,和我们的经验不符。Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调用跟踪用「strace」,用户态的函数调用跟踪用「ltrace」,所以这里我们应该用「strace」:
shell> strace -p <PID>
不过如果直接用 strace 跟踪某个进程的话,那么等待你的往往是满屏翻滚的字符,想从这里看出问题的症结并不是一件容易的事情,好在 strace 可以按操作汇总时间:
shell> strace -cp <PID>
通过「c」选项用来汇总各个操作的总耗时
shell> strace -T -e clone -p <PID>
通过「T」选项可以获取操作实际消耗的时间,通过「e」选项可以跟踪某个操作
context switch对性能的影响
如何查看context switch
在Linux下通过vmstat命令可以很方便地查看context switch。vmstat输出如下:
[root@test contrib]# vmstat 5 |
其中 system 段的cs就是context switch数,上面系统的context switch不多。如果发现context switch过多时,就需要考虑调整线程数了。
如何查看应用程序的线程数
查看应用程序线程数有2种办法。
top -H 可以以线程的方式查看系统相关信息,但是这种方法的一个缺点是不好统计具体的线程数。
ps -xH 列出整个系统正在运行的线程,配合grep可以轻松查看出某个应用程序使用了多少个线程。
context switch 很高,谁干的
2.6.23 及以上内核可用:
grep voluntary_ctxt_switches /proc/*/status | sort -rnk2 | head
# grep voluntary_ctxt_switches /proc/*/status | sort -rnk2 | head/proc/1570/status:voluntary_ctxt_switches: 1029453/proc/8143/status:voluntary_ctxt_switches: 835492/proc/2463/status:voluntary_ctxt_switches: 710566/proc/12204/status:voluntary_ctxt_switches: 584719/proc/2463/status:nonvoluntary_ctxt_switches: 344170/proc/12204/status:nonvoluntary_ctxt_switches: 252147/proc/9684/status:voluntary_ctxt_switches: 200307/proc/10354/status:voluntary_ctxt_switches: 165276/proc/3/status:voluntary_ctxt_switches: 157927/proc/10337/status:voluntary_ctxt_switches: 105313 |