刚刚定了短期的研究方向:多核环境下软件性能的提高,首先先做实验,用实验数据来证明普通的web应用在核不断扩展的情况下,性能提升并非线性而成下降趋势,理论上是因为核之间的通信,缓存迁移代价增大。

现在遇到的一个问题是在windows下,应用可以选择指定的核来运行,可是linux下的web应用虽然使用命令行指定了特定的cpu,但是最终运行的还是全部的核,结论是tomcat中含有线程池,操作系统以线程为调度单位,最终还是把线程分配到多个核上,放弃tomcat。另外一个是应用服务器是apache,同样是多线程,也不行,最终只能想办法禁用CPU,查了资料,linux已经提供了禁用逻辑cpu的方法。

Q:如何在逻辑上禁用一个CPU?

A:     执行如下操作。

                  #echo 0 > /sys/devices/system/cpu/cpuX/online

         如果逻辑上的禁用成功,检查

         #cat /proc/interrupts

         在此文件中,将看不到被移除的CPU对应的列了。当CPU被移除后,它的online文件为0,否则为1.

         #To display the current cpu state.

         #cat /sys/devices/system/cpu/cpuX/online

Q:当一个CPU在逻辑上被移除时,会发生什么?

A:将会发生下面的事情,排列是无序的 J。

-          内核中的模块会接收到一个通知[notification],对应的事件是CPU_DOWN_PREPARE 或者CPU_DOWN_PREPARE_FROZEN,具体是哪个事件则依赖于CPU被移除时,是否有任务被“冷冻”,任务被冷冻的原因是正在执行挂起操作。

-          此CPU上的所有进程都被迁移到新的CPU上。新CPU通过每个进程的当前处理器设置(cpuset)进行选择,这些设置可能是所有在用CPU的子集。

-          所有定向到此CPU上的中断都被迁移到新的CPU上。

-          定时器/BH/task lets也将被迁移到新的CPU上。

-          一旦所有的服务都被迁移了,内核便调用一个体系结构相关[arch specific]的例程__cpu_disable()来执行体系结构相关的清理工作。

-          如果上面的工作也完成了,一个代表清理成功的事件将被发送,此事件为CPU_DEAD。(如果存在冰冻任务,相应的事件则为CPU_DEAD_FROZEN。也就是说在移除CPU时,系统正在执行挂起操作。)

当CPU_DOWN_PREPARE通知链被调用时,所有服务都应该被清除。当CPU_DEAD被调用时,不应在有任何东西运行于被移除的CPU上。