2014-01-28 39 views
0

作家程序發送幾個MB(幾乎沒有延遲)使用多個寫入固定緩衝區。處理程序註冊了EPOLLOUT | EPOLLET標誌。EPOLLOUT | EPOLLET,虛假wakups和MTU

  1. MTU = 16KB,寫入緩衝器= 4KB或更多。從調用write(...)(寫入在下一個事件中重新啓動)和〜30僞EPOLLOUT(在所有寫入完成並認爲數據被髮送後)返回幾個〜3 EAGAIN。
  2. MTU = 16KB,寫入緩衝器= 2KB。幾個~5 EAGAIN和一些(2-5)假EPOLLOUT事件 - 日誌表明作者和讀者在這種情況下同時進行。
  3. MTU = 16KB,寫入緩衝器< 1KB。幾〜5 EAGAIN和一個沒有僞造的EPOLLOUT事件。
  4. MTU = 1-5KB,寫入緩衝器= 4KB。幾個〜5 EAGAIN和沒有僞EPOLLOUT事件。
  5. MTU = 50KB(回送) - 99%的事件是僞EPOLLOUT。

看起來很簡單,當緩衝區從完全進入「可用空間」時,EPOLLOUT生成爲 。與MTU大小的相關性很有趣。 問題:

1)使EPOLLOUT禁用,除非最後一次寫入以EAGAIN代碼結束 - 是正確的模式?

2)較大的緩衝區或MTU建議傳輸較大的數據塊,產生較少的TCP/IP緩衝區更新和較少的事件。實踐顯示相反。任何人都可以對此有所瞭解嗎?

+0

您爲什麼認爲EPOLLOUT是虛假的? –

+0

好吧,1)只是我正在學習的一個澄清的epoll接口?怎麼樣2)較大的寫/數據包應該在緩衝區中產生較少的變化,減少EPOLLOUT事件。 – aak

回答

1

EPOLLOUT意味着緩衝區中有空間。這並不意味着從沒有空間過渡到某個空間。你只能在發送EAGAIN後使用它。否則,您只會得到一個無意義的EPOLLOUT事件流,因爲發送緩衝區中幾乎總是有空間。

重新您的(1),是的,這是正確的方式來使用它。直到你獲得EAGAIN爲止,然後使用EPOLLIUT告訴你什麼時候可以再次寫入。

+0

2)呢?看起來大寫/ MTU導致了一些額外的碎片。 – aak

+0

'EPOLLIUT'錯字? – LETs

0

你似乎混淆了epoll兩種用法。關鍵概念是「電平觸發(LT)」和「邊緣觸發(ET)」。

man 7 epoll狀態:

採用該EPOLLET標誌應使用非阻塞文件描述符,以避免讀阻塞或寫餓死正在處理多個文件描述符任務的應用程序。建議使用epoll作爲邊緣觸發(EPOLLET)接口的方式如下:

i帶有非阻塞文件描述符;和
ii只有在讀取(2)或寫入(2)之後等待事件返回EAGAIN。相比之下,當用作電平觸發接口(默認情況下,當未指定EPOLLET時),epoll只是一個更快的輪詢(2),並且可以在任何使用後者的地方使用,因爲它共享相同的語義。

所以我的答案,你的問題是:

  1. 是的,你是正確的。

  2. 現在你知道你觀察到的是大量的LTEPOLLOUT雖然你有ETEPOLLOUT想法,也許你需要改變你的結論。

讓我說明ETLT之間的差異。

Buf=Empty 
V ET 
Buf=Avail LT 
V 
Buf=Avail LT 
V 
Buf=Avail LT 
V 
Buf=Empty 
V ET 
Buf=Avail LT