Linux上下文切换监控

题外话:每日七点,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 获得。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上下文切换是指当CPU从一个任务切换到另一个任务时,需要保存当前任务的上下文信息,并加载下一个任务的上下文信息。在Linux系统中,可以使用vmstat命令、pidstat命令、/proc/interrupts文件来查看系统的上下文切换情况。 上下文切换的主要原因有几点: 1. 多任务调度:操作系统需要将CPU资源在多个任务之间进行切换,以实现任务的并发执行。 2. 中断处理:当系统接收到硬件中断信号时,需要暂停当前任务的执行,转而处理中断请求。 3. 用户态与内核态的切换:当用户态进程需要调用内核服务时,会触发上下文切换上下文切换涉及到的资源主要有寄存器、内存、页表等。上下文切换次数过多会导致CPU的资源浪费,降低系统的执行效率。 根据引用的分析,上下文切换共分为三种情况: 1. 自愿上下文切换:当一个任务需要等待某个事件的完成时,会主动释放CPU,从而触发自愿上下文切换。 2. 非自愿上下文切换:当一个任务的时间片用完或发生硬件中断等原因时,会被系统强制调度,触发非自愿上下文切换。 3. 中断上下文切换:当系统接收到硬件中断信号时,会从当前任务切换到中断处理程序,进行中断处理。 至于您提到的Linux上下文切换的实战,可以使用vmstat命令、pidstat命令和/proc/interrupts文件来观察系统的上下文切换情况。具体的使用方法可以参考相关文档或在线资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值