如何充分利用CPU资源提高服务器的性能
基本思路是如何让CPU的超线程或者多核更加均衡和高效的利用起来,我们知道总是有一块cpu去专门响应网卡的中断请求,如果网络请求包非常大,很可能单个CPU就处理不过来,因此,需要激活多核或者超线程,把网卡中断请求分发到多个CPU去执行,从而提高整体服务器的接入性能,也是提高CPU资源利用率的好办法。下面分别进行讨论:
一, 双CPU超线程的服务器
我们知道,在linux下,对于双CPU超线程的服务器而已,如果内核激活了CPU的超线程功能(HT), 则通过cat /proc/cpuinfo 可以识别到4块CPU: CPU0-3,其中CPU0和CPU1是同一真实CPU的本身和它的超线程出的CPU,CPU2和CPU3也是同理一对。
我们可以配置网卡的irq路由,来选择指定的一块CPU来处理对应网卡中断请求,从而使得多块网卡的中断处理分别分摊到2块真实的CPU上,达到充分发挥双CPU的性能。
1, 首先我们可以通过访问/proc/cpuinfo的信息查看到cpu的具体信息。
cat /proc/cpuinfo
cat /proc/cpuinfo | grep processor
cat /proc/cpuinfo | grep processor| wc –l
最后的命令可以得到当前cpu的个数。
2, 分别获取eth0和eth1网卡的中断irq号,并且赋值给shell变量
ETH0_IRQ_NUM =`cat /proc/interrupts | grep eth0 | awk -F ':' '{print $1}'`
ETH1_IRQ_NUM =`cat /proc/interrupts | grep eth1 | awk -F ':' '{print $1}'`
3, 指定CPU来处理对应网卡的中断请求
首先可以查看一下现有的cpu情况(需要root用户):
cat /proc/irq/$ETH0_IRQ_NUM/smp_affinity
cat /proc/irq/$ETH1_IRQ_NUM/smp_affinity
echo 8 > /proc/irq/$ETH0_IRQ_NUM/smp_affinity
(指定CPU3来处理网卡eth0的中断请求)
echo 2 >/proc/irq/$ETH1_IRQ_NUM/smp_affinity
(指定CPU1来处理网卡eth1的中断请求)
4, 查看切换后的效果
watch cat /proc/interrupts
可以看到每隔2s的时间间隔的中断处理效果
二, 双CPU双核的服务器
在linux下,对双CPU双核的服务器来说,若内核没有开启超线程HT选项,则访问cat /proc/cpuinfo可以识别到4块CPU,分别是CPU0-3,其中CPU0和CPU1是同一真实CPU的两个核,同理,CPU2和CPU3是另外一个真实CPU的两个核。并且对同属于真实一个CPU的核共享4M的二级cache,因此,如果我们将一块网卡的中断请求对应到同一真实CPU的2个核上,可以在保证二级cache命中率的前提下,充分发挥双核心CPU的性能优势,从而提高整体服务器的性能。
具体的设置方法,如上说明。
三, 附加说明
注意:对smp_affinity,一个字节(8个bit)本质上对应二进制位:xxxxxxxx,分别表示cpu7,cpu6,cpu5,cpu4,cpu3,cpu2,cpu1,cpu0,对应的位为1, 表示对应的cpu选中状态。
1, echo 8 > /proc/irq/$ETH0_NU/smp_affinity,由于8 = 1000,所以是指定cpu3来响应。
2, echo 2 > /proc/irq/$ETH1_NU/smp_affinity,由于2 = 0010,所以是指定cpu1来响应。
3, echo c > /proc/irq/$ETH0_NU/smp_affinity,由于c = 1100,所以是指定cpu2和cpu3来响应。
4, echo 3 > /proc/irq/$ETH1_NU/smp_affinity,由于3 = 0011,所以是指定cpu0和cpu1来响应。