今天在对一个应用程序进行压力测试发现context switch(上下文切换)对于CPU的load影响非常大。在将线程数减为之前的1/3时,load居然降到之前的1/5。通常导致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可以轻松查看出某个应用程序使用了多少个线程。
在今天的压测过程中,当线程数为48个时,context switch一直在90000以上,cpu的load直接上升至15。当把线程数调到18时,context switch稳定在50000,cpu的load降为2了。其实性能调优也挺简单的,挺有趣的,关键是取决于对Linux工作机制的理解。