Linux內核追蹤[4.14] 網絡報文send的ZERO-COPY(零拷貝)

需求:

       ZERO-COPY對於有性能要求的大數據報文的網絡應用來說是一個比較好的優化思路。在之前的內核中,ZERO-COPY只發生在sendfile、splice接口中。send接口無法做到ZERO-COPY。因此通用send 接口進行大報文發送的應用性能仍然有提升空間。

功能:

       4.14內核,Google工程師Willem de Bruijn實現了一個網絡報文的通用發送接口(send)的報文ZERO-COPY功能
       經patch作者驗證,採用netperf大包發送測試,發送性能提升了39%,實際產品提升了5%~8%。可以看到對於大包發送還是有一定效果的。

接口

       首先,進程需要調用 setsockopt() 接口(傳遞新的SOCK_ZEROCOPY option)。
       其次,發送接口  send(socket, buffer, length, MSG_ZEROCOPY); 需要傳入一個新的MSG_ZEROCOPY flag。
       最後,Userspace App需要hold住上述buffer,不能釋放。直到採用  status = recvmsg(socket, &message, MSG_ERRORQUEUE); 接口進行狀態判斷之後,通過message的內容得知之前的 ZERO-COPY的buffer已經發送完畢了,buffer才能釋放。
       之所以需要兩步,是因爲目前有一些應用會隨機的傳遞一些錯誤的flag,比如(MSG_ZEROCOPY)。(不過我覺得這個做法有點土,居然需要兩步)。

約束
     
       對於需要在內核進行加密或者計算checksum的報文,雖然傳遞了新參數,內核仍然會有一次拷貝。
       當前只支持發送ZERO-COPY,不支持報文的接收ZERO-COPY。

實現

       在傳入的報文length太小時,內核會選擇性地拷貝,因爲建立ZEROCOPY所需要的頁表映射、lock等操作也是需要時間(即使傳遞了新的ZEROCOPY的flag),小報文拷貝的時間可能還少於這些操作的時間。
       更多的實現待補充......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章