淺談linux效能調優之十七:進程綁定與中斷綁定 淺談linux效能調優之十六:網卡綁定http://www.bkjia.com/os/201307/230472.html 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/interrupts32: 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_affinity1在網路非常 heavy 的情況下,對於檔案伺服器、高流量 Web 服務器這樣的應用來說,把不同的網卡 IRQ 均衡綁定到不同的 CPU 上將會減輕某個 CPU 的負擔,提高多個 CPU 整體處理中斷的能力;對於資料庫伺服器這樣的應用來說,把磁碟控制卡綁到一個 CPU、把網卡綁定到另一個 CPU 將會提高資料庫的回應時間、最佳化效能。合理的根據自己的生產環境和應用的特點來平衡 IRQ 中斷有助於提高系統的整體吞吐能力和效能。注意:在手動綁定 IRQ 到 CPU 之前需要先停掉 irqbalance 這個服務,irqbalance 是個服務進程、是用來自動綁定和平衡 IRQ 的:# /etc/init.d/irqbalance stop