刚刚定了短期的研究方向:多核环境下软件性能的提高,首先先做实验,用实验数据来证明普通的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上。