linux下的RPS及其應用(軟中斷)

myownstars發表於2013-02-06

RPS

什麼是RPS

全稱receive packet steering,由GoogleTom Herbert編寫,而linux2.6.35開始引入;

此功能可解決網路軟中斷的負載均衡,即單個網路卡的軟中斷分散到多個CPU處理,避免單個CPU負載過大導致效能瓶頸;

該功能主要針對單佇列網路卡多CPU環境,如網路卡支援多佇列則可使用SMP irq affinity直接繫結硬中斷,軟中斷預設同硬中斷執行在同一個CPU

一般如果開啟了SMP irq affinity,就不必使用RPS,但須視具體情況而定(兩者可並存);

 

有必要先搞清楚網路卡/CPU如何處理網路中斷的:

如下圖,可分為4個階段

1 硬體接收

網路卡透過線路接收到幀,將其儲存至buffer queue,高階網路卡可以有多個queue

2 硬中斷

網路卡向CPU傳送中斷通知新幀的到來,併為下一步的軟中斷做準備

3 軟中斷

此階段核心將資料幀從網路卡buffer queue取出放入網路棧中處理,此過程網路卡與CPU相互協同工作,直到網路卡buffer溢位或達到dev_weight(一次軟中斷處理的幀數)

4 應用接收

應用程式透過POSIX呼叫(read/recv/recvfrom)接收幀資料並將其從socket移出

 

RPS最佳化了第3個階段,由網路卡根據資料包的IP/port資訊計算一個hash值,然將其對映到一個CPU id,這樣既分散到多個CPU又確保同一資料來源的包由同一CPU處理;

 

如何使用

可透過配置檔案為網路卡繫結到特定CPU/sys/class/net//queues/rx-目錄,其中n代表該網路卡的多個佇列,如果不支援多佇列就設定第一個佇列rx-0

_$ pwd

/sys/class/net/eth0/queues/rx-0

_$ ls

rps_cpus  rps_flow_cnt

_$ more rps_cpus

00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000

--設定CPU掩碼,類似於SMP IRQ affinity

 

可透過/proc/softirqs檢視系統軟中斷資訊

                      CPU0       CPU1       CPU2       CPU3

            HI:          0          0          0          0

         TIMER:      27166      27120      27097      27034

        NET_TX:          0          0          0         17

        NET_RX:         42          0          0         39

         BLOCK:          0          0        107       1121

       TASKLET:          0          0          0        290

         SCHED:      27035      26983      26971      26746

       HRTIMER:          0          0          0          0

           RCU:       1678       1769       2178       2250

 

另外mpstat也有軟中斷統計資訊soft%

 

http://blog.yufeng.info/archives/2037/comment-page-1#comment-6249  

https://github.com/torvalds/linux/blob/master/Documentation/networking/scaling.txt

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-753982/,如需轉載,請註明出處,否則將追究法律責任。

相關文章