Linux性能分析

Strace诊断问题

技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。

有时候在 CPU 列表中能看到 CPU 主要消耗在内核态「sy」,而不是用户态「us」,和我们的经验不符。Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调用跟踪用「strace」,用户态的函数调用跟踪用「ltrace」,所以这里我们应该用「strace」:

shell> strace -p 

不过如果直接用 strace 跟踪某个进程的话,那么等待你的往往是满屏翻滚的字符,想从这里看出问题的症结并不是一件容易的事情,好在 strace  可以按操作汇总时间:

shell> strace -cp 

通过「c」选项用来汇总各个操作的总耗时

shell> strace -T -e clone -p 

通过「T」选项可以获取操作实际消耗的时间,通过「e」选项可以跟踪某个操作

context switch对性能的影响

如何查看context switch

在Linux下通过vmstat命令可以很方便地查看context switch。vmstat输出如下:

[root@test contrib]# vmstat 5
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 1 2590988 71184 1800 22440 36 53 82 191 343 61 3 0 94 2 0
1 0 2595328 75772 1808 21992 9 873 9 881 1254 844 32 0 65 2 0
3 0 2595300 75516 1944 22000 10 0 34 593 1012 871 21 0 74 4 0
0 0 2595280 75640 1952 22000 0 0 0 10 1136 773 31 0 68 0 0
2 0 2595256 75516 1952 22000 8 0 8 0 1055 859 20 0 79 0 0

其中 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

 

你可能感兴趣的:(linux)