我们在监测Linux的应用的时候,当CPU的利用率非常高,但是系统的性能却上不去的时候,不妨监控一下线程/进程的切换,看看是不是context switching导致的overhead过高。
一般我使用dstat工具用来监控,比如dstat -y:
1
2
3
4
5
---system --
 int    csw 
 367    561  
 274    439  
 279    363 
 
或者vmstat 3:
1
2
3
4
[  ]   
 - - - - - - - - - - - - - - - - - - - - -  - - - - -  - - - - - - - - -  - - - -  - - - - - - - - - - 
                                       
                                      
 
但是如何知道那些进程/线程做切换能,淘宝褚霸有篇文章:latencytop深度了解你的Linux系统的延迟 介绍了一种方法。事实上,有一个工具pidstat,可以用来监控上下文切换。 它是sysstat 包其中的一个工具,sysstat包含好几个很棒的工具,比如sar、iostat等。
执行pidstat -w
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@abc  smallnest]
Linux  2.6 .32 -358 .el6.x86_64 (abc) 	04 /11 /2016  	_x86_64_ 	(2  CPU )
11 : 25 : 00  PM        PID    cswch/s nvcswch/s  Command 
11 : 25 : 00  PM          1       0 .60       0 .03   init
11 : 25 : 00  PM          2       0 .04       0 .00   kthreadd
11 : 25 : 00  PM          3       0 .36       0 .00   migration/0 
11 : 25 : 00  PM          4       0 .58       0 .00   ksoftirqd/0 
11 : 25 : 00  PM          5       0 .01       0 .00   migration/0 
11 : 25 : 00  PM          6       0 .08      0 .00   watchdog/0 
11 : 25 : 00  PM          7       0 .39       0 .00   migration/1 
11 : 25 : 00  PM          8       0 .01       0 .00   migration/1 
11 : 25 : 00  PM          9       0 .52       0 .00   ksoftirqd/1 
……
 
cswch/s是主动地上下文切换,nvcswch/s是被动执行上下文切换的次数。
如要要显示线程的上下文切换统计,可以执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@abc smallnest]# pidstat -wt 
Linux 2.6 .32 -358 .el6.x86_64 (abc) 	04 /11 /2016  	_x86_64_	(2  CPU)
11 :27 :57  PM      TGID       TID   cswch/s nvcswch/s  Command
11 :27 :57  PM         1          -      0.56       0.03   init
11 :27 :57  PM         -         1       0.56       0.03   |__init 
11 :27 :57  PM         2          -      0.03       0.00   kthreadd
11 :27 :57  PM         -         2       0.03       0.00   |__kthreadd 
11 :27 :57  PM         3          -      0.34       0.00   migration/0 
11 :27 :57  PM         -         3       0.34       0.00   |__migration/0 
11 :27 :57  PM         4          -      0.57       0.00   ksoftirqd/0 
11 :27 :57  PM         -         4       0.57       0.00   |__ksoftirqd/0 
11 :27 :57  PM         5          -      0.01       0.00   migration/0 
……
 
更多的参数可以man pidstat获得。