今天在測試DPDK性能的時候,發現發包工具的發包速率無法提升上去,千兆網卡設置速率70W qps,只能發出1W的速率。
抓包發現有大量的PAUSE流控幀。
一、PAUSE幀介紹
PAUSE幀是以太網在全雙工模式下,MAC控制子層發出的流量控制幀。IEEE802.3協議為MAC控制子層提供了一個全雙工流量控制結構框架,MAC控制子層是介於邏輯鏈路控制子層和介質訪問控制子層間的可選功能。
交換控制電路要防止緩沖區溢出,可以利用MAC控制子層來控制以太網介質訪問控制子層的操作。當已用緩沖區容量達到一個預先設定的閾值時,端口向全雙工鏈路對方發出停止發送數據的請求,這個請求通過MAC控制子層產生的控制幀實現。
同樣,端口可以接收由其他站點MAC控制子層產生的控制幀,控制幀夾在客戶數據幀流中發送,接收方會根據幀的內容將控制幀分離出來,提交到MAC控制子層中的流量控制模塊,流量控制模塊解析控制幀的內容,提取幀中的控制參數,根據控制參數決定暫停發送的時間。
PAUSE幀中攜帶了時間參數。收到PAUSE幀的設備通過簡單的解析,就可以確定停止發送的時長。對端設備出現擁塞的通常情況下,本端端口通常會連續收到多個PAUSE幀。只要對端設備的擁塞狀態沒有解除,相關的端口就會一直發送PAUSE.
二、PAUSE幀格式
PAUSE幀的幀長為64字節,結構非常簡單。如下所示:
PAUSE幀的目的MAC地址是保留的MAC地址0180-C200-0001,源MAC則是發送PAUSE幀的設備的MAC地址。
Length/Type域是十六進制數0x8808.
MAC Control Opcode域的值是0x0001.其實,PAUSE幀是MAC控制幀的一種,其他類型的MAC控制幀使用不同的opcode值,此處不做詳細說明。后面會談到和PAUSE類似的PFC幀,PFC幀中該域的取值是0x0101.
MAC Control Parameters域需要根據MAC Control Opcode的類型來解析。對於PAUSE幀而言,該域是個2字節的無符號數,取值范圍是0~65535.該域的時間單位是pause_quanta,每個pause_quanta相當於512比特時間。
三、其他流控技術
在半雙工模式下,主要采用Back-Pressure技術,也叫背壓技術。端口向外發送一些信號來占用鏈路,對端也就沒有機會發送報文。這樣,可以間接達到和流控類似的效果。
四、以太網卡流控的開啟/關閉
大多數的網卡,都有流控的開關命令。Linux系統中,可通過ethtool工具控制。