Linux上下文切换监控

我们在监测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
[root@abc smallnest]# vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 3126192 31692 1521612 0 0 176 325 166 258 1 1 96 3 0

但是如何知道那些进程/线程做切换能,淘宝褚霸有篇文章: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]# pidstat -w
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获得。