1. 程式人生 > >Linux核心追蹤[4.14] 網路報文send的ZERO-COPY(零拷貝)

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),小報文拷貝的時間可能還少於這些操作的時間。        更多的實現待補充......
參考:
LWN文章:https://lwn.net/Articles/726917/ 其它4.14版本特性:http://blog.csdn.net/lovelycheng/article/details/78545789