1.使用taskset設置CPU親和性
taskset搜索並設定運行進程的CPU親和性(根據進程ID)。它還可用於啓動給定CPU親和性的進程,這樣就可將指定的進程與指定的CPU或者一組CPU捆綁
CPU 親和性使用位掩碼錶示。最低位對應第一個邏輯 CPU,且最高位對應最後一個邏輯 CPU。這些掩碼一般是十六進制,所以 0x00000001 表明處理器 1,0x00000003 表明處理器 3 。
要設定運行進程的 CPU 親和性,請執行如下命令,使用處理器或者您要捆綁到的處理器掩碼替換 mask,使用您要更改親和性的進程的進程 ID 替換 pid。
# taskset -p mask pid
要啓動給定親和性的進程,請運行如下命令,使用處理器或者您要捆綁的處理器的掩碼替換 mask,使用程序、選項以及您要運行的程序參數替換 program。
# taskset mask -- program
與其將處理器指定爲位碼,您還可使用 -c 選項提供逗號分開的獨立處理器,或者一組處理器列表,相似以下:
# taskset -c 0,5,7-9 -- myprogram
有關 taskset 的詳情請參考 man page:man taskset。
2.硬件中斷髮生頻繁,是件很消耗 CPU 資源的事情,在多核 CPU 條件下若是有辦法把大量硬件中斷分配給不一樣的 CPU (core) 處理顯然能很好的平衡性能。如今的服務器上動不動就是多 CPU 多核、多網卡、多硬盤,若是能讓網卡中斷獨佔1個 CPU (core)、磁盤 IO 中斷獨佔1個 CPU 的話將會大大減輕單一 CPU 的負擔、提升總體處理效率。
中斷請求(IRQ)是用於服務的請求,在硬件層發出。可以使用專用硬件線路或者跨硬件總線的信息數據包(消息信號中斷,MSI)發出中斷。
啓用中斷後,接收 IRQ 後會提示切換到中斷上下文。內核中斷調度代碼會搜索 IRQ 號碼機器關聯的註冊中斷服務路由(ISR)列表,並按順序調用 ISR。ISR 會確認中斷並忽略來自同一 IRQ 的多餘中斷,而後在延遲的句柄中排隊完成中斷處理,並忽略之後的中斷來結束 ISR。 /proc/interrupts 文件列出每一個 I/O 設備中每一個 CPU 的中斷數,每一個 CPU 核處理的中斷數,中斷類型,以及用逗號分開的註冊爲接收中斷的驅動程序列表。
IRQ 有一個關聯的「相似」屬性 smp_affinity,該參數能夠定義容許爲 IRQ 執行 ISR 的 CPU 核。這個屬性還用來提升程序性能,方法是爲一個或者多個具體 CPU 核分配中斷相似性和程序線程相似性。這可以讓緩存線可在指定的中斷和程序線程之間共享。
具體 IRQ 數的中斷近似性值是保存的相關的 /proc/irq/IRQ_NUMBER/smp_affinity 文件中,您能夠做爲 root 用戶查看並修改該值。保存在這個文件中的值是一個十六進制字節掩碼,表明系統中全部 CPU 核。
例如:要爲四核服務器指定以太網驅動程序,首先要肯定與該以太網驅動程序關聯的 IRQ 數:
# grep eth0 /proc/interrupts
32: 0 140 45 850264 PCI-MSI-edge eth0使用 IRQ 數定位正確的 smp_affinity 文件:
# cat /proc/irq/32/smp_affinity
fsmp_affinity 的默認值爲 f,便可爲系統中任意 CPU 提供 IRQ。將這個值設定爲 1,以下,即表示只有 CPU 0 能夠提供這個中斷:
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
在網絡很是 heavy 的狀況下,對於文件服務器、高流量 Web 服務器這樣的應用來講,把不一樣的網卡 IRQ 均衡綁定到不一樣的 CPU 上將會減輕某個 CPU 的負擔,提升多個 CPU 總體處理中斷的能力;對於數據庫服務器這樣的應用來講,把磁盤控制器綁到一個 CPU、把網卡綁定到另外一個 CPU 將會提升數據庫的響應時間、優化性能。合理的根據本身的生產環境和應用的特色來平衡 IRQ 中斷有助於提升系統的總體吞吐能力和性能。
注意:在手動綁定 IRQ 到 CPU 以前須要先停掉 irqbalance 這個服務,irqbalance 是個服務進程、是用來自動綁定和平衡 IRQ 的:# /etc/init.d/irqbalance stop