技术项目 - Linux网卡中断使单个CPU过载
Linux內核在性能方面已經經歷了很長一段時間的考驗,尤其是2.6/3.x內核。然而,在高IO,尤其是網絡方面的情況下,對中斷的處理可能成為問題。我們已經在擁有一個或多個飽和1Gbps網卡的高性能系統(tǒng)上發(fā)現(xiàn)過這個問題,近來在有許多小包并發(fā)(大約10000packets/second)超載的虛擬機上也發(fā)現(xiàn)了這個問題。
原因很清楚:在最簡單的模式中,內核通過硬件中斷的方式來處理每個來自于網卡的包。但是隨著數(shù)據(jù)包速率的增長,帶來的中斷漸漸超過了單個cpu可處理的范圍。單cpu概念很重要,系統(tǒng)管理員對此往往認識不足。在一個普通的4-16核的系統(tǒng)中,因為整體cpu的使用率在6-25%左右并且系統(tǒng)看上去很正常,所以一個過載的內核很難被發(fā)現(xiàn),。但是系統(tǒng)將運行很慢,并且會在沒有告警,沒有dmesg日志,沒有明顯征兆的情況下嚴重丟包。
但是你使用top查看多個cpu模式(運行top,接著鍵入1)時,%si列(系統(tǒng)中斷)或者mpstat命令中 irq列(mpstat -P ALL 1),在一些繁忙的系統(tǒng)中你會發(fā)現(xiàn)中斷明顯很高,通過經進一步mpstat使用,你會看到哪個cpu或者哪個設備存在問題。
你需要一個較新版本的mpstat,可以運行-I 模式,用以列出irq負載,運行如下命令:
mpstat -I SUM -P ALL 1
超過5000/秒 有點繁忙, 1萬-2萬/秒相當高了。
運行如下命令來確認那個設備/項目導致負載:
mpstat -I CPU -P ALL 1
這個輸出很難被閱讀,但是你可以跟蹤正確的列用來確認哪個中斷導致負載,例如:15,19,995. 你也可以定義你想查看的cpu
mpstat -I CPU -P 3 1 # 3 在top,htop中可以定位不同的cpu。(top和mpstat都是從0開始,htop是從1開始計數(shù))
記錄下中斷數(shù),你就可以查看中斷表 ,"cat /proc/interrupts" 找到mpstat's得到的數(shù)字,你可以發(fā)現(xiàn)是哪個設備在使用中斷。這個文件也指示了使用該中斷的#可以告訴你是什么導致過載。
需要做什么呢?
首先,確認你是否運行irqbalance,這個是nice守護進程它會自動在cpu間擴展中斷。在繁忙的系統(tǒng)中很重要,尤其是兩塊網卡,因為默認cpu0將處理所有中斷,系統(tǒng)很容易過載。irqbalance擴散這些中斷用以降低負載。為了性能最大化,你可以手動平衡這些中斷將套接字和超線程共享內核分散,但是通常沒必要這么麻煩。
但是即使擴展了中斷,某塊網卡還是可能導致某一個cpu過載。這取決于你的網卡和驅動,但通常有兩種有效的方法來防止這樣的事情發(fā)生。
第一種是多網卡隊列,有些Intel網卡就可以這么做。如果他們有4個隊列,就可以有四個cpu內核同時處理不同的中斷用以分散負載。通常驅動會自動這么做,你也可以通過mpstat命令來確認。
第二種,并且通常也是更加重要的,網卡驅動選項——'IRQ coalescing',中斷請求合并。這個選項有著強大的功能,允許網卡在調用中斷請求前緩存數(shù)個數(shù)據(jù)包,從而為系統(tǒng)節(jié)約大量的時間和負載。舉個例子:如果網卡緩存10個包,那么cpu負載將大約降低90%。這個功能通常用ethtool工具來控制,使用'-c/-C'參數(shù),但是有些驅動要求在驅動初次加載時就做好相關設置。如何設置需要查看本機文檔。舉個例子,有些網卡,譬如我們使用的Intel網卡,就有automatic模式可以根據(jù)負載自動做到最優(yōu)化。
最后,就像我們在虛擬機中看到的一些驅動,它們不支持多隊列或者中斷請求合并。這種情況下,一旦處理中斷的cpu繁忙,就會產生性能瓶頸,除非你更換設備或者驅動。
這是一個復雜的區(qū)域,并不廣為人知,但有些不錯的技術真的可以提高繁忙系統(tǒng)的性能。此外,一些額外的針對性監(jiān)控,可以幫助到查找和診斷這些難以發(fā)現(xiàn)的問題。
總結
以上是生活随笔為你收集整理的技术项目 - Linux网卡中断使单个CPU过载的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 脐带血单个核
- 下一篇: Flink 中的木桶效应:单个 subt
