我们在监测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
获得。