题外话:每日七点,QQ群大家分享技术相关文章,睡什么睡起来嗨!
QQ群号:630300475
正文:转发自(http://www.open-open.com/lib/view/open1460464385883.html http://blog.csdn.net/mba16c35/article/details/43382737 http://www.cnblogs.com/zhiranok/archive/2012/08/13/context_switch_1.html)
我们在监测Linux的应用的时候,当CPU的利用率非常高,但是系统的性能却上不去的时候,不妨监控一下线程/进程的切换,看看是不是context switching导致的overhead过高。
上下文切换(以下简称CSW)的定义,http://www.linfo.org/context_switch.html 此文中已做了详细的说明:)
*) context(这里我觉得叫process context更合适)是指CPU寄存器和程序计数器在任何时间点的内容
*)CSW可以描述为kernel执行下面的操作
1. 挂起一个进程,并储存该进程当时在内存中所反映出的状态
2. 从内存中恢复下一个要执行的进程,恢复该进程原来的状态到寄存器,返回到其上次暂停的执行代码然后继
续执行
线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。
一般我使用 dstat 工具用来监控,比如 dstat -y :
---system--
intcsw
367561
274439
279363
(int 系统中断次数 csw 上下文切换)
或者 vmstat 3 :
[root@colobusmallnest]#vmstat3
procs-----------memory-------------swap-------io------system-------cpu-----
rbswpdfreebuffcachesisobiboincsussyidwast
000312619231692152161200176325166258119630
但是如何知道那些进程/线程做切换能,淘宝褚霸有篇文章: latencytop深度了解你的Linux系统的延迟 介绍了一种方法。事实上,有一个工具 pidstat ,可以用来监控上下文切换。 它是 sysstat 包其中的一个工具,sysstat包含好几个很棒的工具,比如sar、iostat等。
执行 pidstat -w
root@abcsmallnest]# pidstat -w
Linux2.6.32-358.el6.x86_64 (abc)04/11/2016_x86_64_(2CPU)
11:25:00PMPIDcswch/s nvcswch/sCommand
11:25:00PM10.600.03init
11:25:00PM20.040.00kthreadd
11:25:00PM30.360.00migration/0
11:25:00PM40.580.00ksoftirqd/0
11:25:00PM50.010.00migration/0
11:25:00PM60.080.00watchdog/0
11:25:00PM70.390.00migration/1
11:25:00PM80.010.00migration/1
11:25:00PM90.520.00ksoftirqd/1
……
cswch/s 是主动地上下文切换, nvcswch/s 是被动执行上下文切换的次数。
如要要显示线程的上下文切换统计,可以执行``:
[root@abc allnest]# pidstat -wt
Linux 2.6.32-358.el6.x86_64 (abc)04/11/2016_x86_64_ (2CPU)
11:27:57PM TGID TID cswch/s nvcswch/s Command
11:27:57PM1-0.560.03init
11:27:57PM -10.560.03|__init
11:27:57PM2-0.030.00kthreadd
11:27:57PM -20.030.00|__kthreadd
11:27:57PM3-0.340.00migration/0
11:27:57PM -30.340.00|__migration/0
11:27:57PM4-0.570.00ksoftirqd/0
11:27:57PM -40.570.00|__ksoftirqd/0
11:27:57PM5-0.010.00migration/0
……
更多的参数可以 man pidstat 获得。