有多less上下文切换是“正常的”(作为CPU核心(或其他)的function)?

您好Linux / UNIX的霸主,

你们中的任何一个人都有一个经验法则,就是在Linux服务器上有多less上下文切换(每个处理器核心)是正常的

我的大学在这里提出了,他在8核x86_64机器上看到了16K。

以下是过去几天sarface的一些数据

替代文字http://src.autonomy.net.au/imagebin/81895e338fae67d3d205c09db44a81e6-Picture_10.png

要查看进程创build统计信息,请使用同一图表的对数视图。

替代文字http://src.autonomy.net.au/imagebin/7481f7e52bead4effc90248fc23c72fe-Picture_11.png

而8核心无聊死了…

替代文字http://src.autonomy.net.au/imagebin/0e94326652e977fd74edcd840f94200f-Picture_12.png

CS vs IOwait(x10000比例)

替代文字http://src.autonomy.net.au/imagebin/a52a2a8a120394849c0da4045933e306-Picture_13.png

更有用的信息,以防万一有人问。

  • 服务器工作的存储是通过FC的0.5TB SAN
  • 有8GB的内存,主要是caching – 没有交换。

这很大程度上取决于您运行的应用程序的types。 如果你的应用程序是非常容易触发的WRT系统调用,你可以期望看到大量的上下文切换。 如果大部分应用程序都处于闲置状态,并且只有在套接字上发生问题时才会唤醒,则可能会看到较低的上下文切换速率。

系统调用

系统调用通过它们自身的性质导致上下文切换。 当一个进程进行一个系统调用时,它基本上告诉内核从当前的时间点和内存中接pipe这个进程没有权限做的事情,当它完成时返回到同一个地方。

当我们从Linux中查看write(2)系统调用的定义时,这变得非常清楚:

名称
       写入 - 写入文件描述符

概要
        #包括 

        ssize_t write(int fd,const void * buf,size_t count);

描述
        write()写入从缓冲区指向的buf到文件的字节数
       由文件描述符fd引用。  [..]

返回值
       成功时,将返回写入的字节数(零表示
       什么都没有写)。 出错时,返回-1,并设置errno
       适当。
        [..]

这基本上告诉内核从进程中接pipe操作,从*buf的内存地址开始到当前进程的文件描述符fd开始count字节,然后返回到进程并告诉他如何去。

一个很好的例子来显示这是基于Valve Source游戏的专用游戏服务器hlds 。 http://nopaste.narf.at/f1b22dbc9显示了一个游戏服务器的单个实例所完成的系统调用,其中没有玩家。 这个过程在Xeon X3220(2.4Ghz)上花费了大约3%的CPU时间,只是为了让你感觉这是多么昂贵。

多任务

上下文切换的另一个来源可能是不执行系统调用的进程,但是需要从给定的CPU移出来为其他进程腾出空间。

一个很好的方式来形象化这是cpuburn 。 cpuburn本身并不执行任何系统调用,它只是遍历它自己的内存,所以它不应该引起任何上下文切换。

取一个空闲的机器,启动vmstat,然后为系统所有的CPU核心运行burnMMX(或者cpuburn软件包中的任何其他testing)。 到那时你应该有完整的系统利用率,但几乎没有增加的上下文切换。 然后尝试启动一些更多的进程。 您会看到,上下文切换速率随着进程开始与CPU核心竞争而增加。 切换量取决于内核的进程/内核比率和多任务分辨率。

进一步阅读

linfo.org对上下文切换和系统调用有很好的写法。 维基百科在系统调用中具有通用信息和不错的链接集合。

我的中等负载的Web服务器坐在大约100-150切换秒的大部分时间与山峰成千上万。

高的上下文切换率本身并不是一个问题,但是它们可能会指出一个更重要的问题。

编辑:上下文切换是一个症状,而不是一个原因。 你想在服务器上运行什么? 如果你有一个多处理器机器,你可能想尝试为你的主服务器进程设置cpu关系。

或者,如果您正在运行X,请尝试放下控制台模式。

再次编辑:每秒16k cs,每个cpu平均每毫秒两个开关 – 这是正常时间片的一半到六分之一。 他可以运行大量的IO绑定线程吗?

再次编辑post图:当然看起来IO的限制。 当上下文切换很高时,系统是否花费大部分时间在SYS上?

再次编辑:在最后一个图表中的高iowait和系统 – 彻底摧毁用户空间。 你有IO问题。
你用什么FC卡?

编辑:嗯。 在死亡期间有没有可能通过Bonnie ++或dbench获得一些基准testing结果? 我会有兴趣看看他们是否有类似的结果。

编辑:一直在思考这个周末,我看过类似的使用模式,当邦尼做“一次写字节”的通行证。 这可能解释大量的开关正在进行,因为每个写需要一个单独的系统调用。

没有经验法则。 上下文切换只是CPU从处理一个线程移动到另一个线程。 如果你运行很多进程(或者一些高度线程的进程),你会看到更多的开关。 幸运的是,你不必担心有多less上下文切换 – 成本很小,或多或less是不可避免的。

我更倾向于关注系统状态的CPU占用率。 如果接近10%或更高,这意味着你的操作系统花费了太多的时间来执行上下文切换。尽pipe将某些进程移动到另一台机器上慢得多,但是值得这样做。

像这样的事情是为什么你应该尝试和保持服务器的性能基准。 这样,你可以把你突然注意到的事情与过去logging的事情进行比较。

也就是说,我有服务器运行(主要不是很忙的Oracle服务器),这些服务器稳定在2k左右,有4k个峰值。 对于我的服务器,这是正常的,对于其他人的服务器可能太低或太高。

你能回到你的数据有多远?

你可以给我们什么样的CPU信息?