2065年7月3日438+09-初稿
閱讀原文-t
將device替換為要配置的網絡設備的名稱(例如eth0),並將rx-queue替換為要配置的接收隊列(例如rx-0)。
將該文件的值設置為rps_sock_flow_entries除以N的值,其中N是設備上接收隊列的數量。例如,如果rps_flow_entries設置為32768,並且配置了16個接收隊列,則rps_flow_cnt應設置為2048。對於單隊列設備,rps_flow_cnt的值與rps_sock_flow_entries的值相同。
從單個發送方接收的數據不會發送到多個CPU。如果從單個發送方接收的數據量大於單個CPU處理的數據量,請配置更大的幀尺寸以減少中斷數量,從而減少CPU的處理工作量。或者,考慮NIC卸載選項或更快的CPU。
考慮將numactl或taskset與RFS結合使用,將應用程序固定到特定的內核、套接字或NUMA節點。這有助於防止數據包被無序處理。
接收數據包是壹個復雜的過程,涉及許多底層技術細節,但通常需要以下步驟:
NIC收到數據包後,首先需要將數據同步到內核中,它們之間的橋梁是rx環形緩沖區。這是網卡和驅動程序* * *共享的區域。事實上,rx環形緩沖區存儲的不是實際的包數據,而是壹個描述符,它指向它的實際存儲地址。具體流程如下:
當驅動的處理速度跟不上網卡的數據包接收速度時,驅動無法分配緩沖區,網卡接收到的數據包無法及時寫入sk_buffer,就會造成堆積。當網卡的內部緩沖區已滿時,壹些數據將被丟棄,從而導致數據包丟失。這部分數據包丟失是rx_fifo_errors,它反映在/proc/net/dev中的fifo字段增長和ifconfig中的溢出索引增長中。
此時,數據包已經傳輸到sk_buffer。如前所述,這是內存中由驅動程序分配的緩沖區,由DMA寫入。這樣,數據直接寫入內存,而不依賴於CPU,這意味著內核實際上不知道內存中有新數據。那麽如何讓內核知道有新數據進來了呢?答案是中斷,它告訴內核有新數據進來了,需要稍後處理。
說到中斷,它涉及到硬中斷和軟中斷。首先,我們需要簡要了解它們的區別:
當網卡通過DMA將數據包復制到內核緩沖區sk_buffer時,網卡會立即發起硬件中斷。CPU接收後,首先進入上層,網卡中斷對應的中斷處理程序是網卡驅動程序的壹部分。然後它發起軟中斷,進入下部,開始消耗sk_buffer中的數據,並將其交給內核協議棧進行處理。
中斷可以快速及時地響應網卡數據請求,但如果數據量很大,就會產生大量的中斷請求,CPU大部分時間都會忙於處理中斷,效率非常低。為了解決這個問題,內核和驅動程序現在使用壹種稱為NAPI(新API)的方法來處理數據。其原理可以簡單理解為中斷+輪詢。當數據量很大時,在中斷後通過輪詢接收壹定數量的數據包,然後返回,以避免多次中斷。
由於接收來自外圍硬件(相對於CPU和內存)的異步信號或來自軟件的同步信號,進行相應的硬件和軟件處理;發送這樣的信號稱為中斷請求。
1 .按數字鍵1。
2.mpstat -P ALL 2
Mpstat用戶介紹和輸出參數的詳細說明-https://wsg Zao . github . io/post/mpstat/