2013-05-02 58 views
0

我有一個應用程序,當它有數據要傳輸時,使用epoll來知道給定的TCP套接字是否可以寫入。epoll有指數回退嗎?

我在觀察的是,由於TCP連接的遠端落後,並且TCP套接字的發送緩衝區開始填充,所以epoll返回EPOLLOUT事件的頻率似乎經歷了指數退避。這種行爲發生在從套接字寫入接收EAGAIN之前。

應用程序正在使用EPOLLONESHOT,並在每次出現後重置EPOLL_CTL_MOD調用以重新設置EPOLLOUT事件。但正如我上面提到的那樣,隨後的每一次事件都會以指數形式出現(我有40ms,80ms,160ms,320ms,640ms,1280ms等等),直到EAGAIN最終發生。

這是epoll的一個未記錄的功能嗎?它可以被禁用?這是一個問題,因爲數據越來越陳舊,我寧願放棄它,而不是發送遲到。

在此先感謝。

+0

如果陳舊的數據是一個問題,請使用UDP而不是TCP;這就是爲什麼這兩個協議是發明的。 – msw 2013-05-02 00:26:41

回答

1

不,但TCP確實。 epoll()最多隻能指定超時,並且不會稍微長一點。

+0

是的,超時工作正常。問題在於EPOLLOUT事件受到TCP退避的影響。請記住,我的應用程序尚未從寫入中獲得EAGAIN結果,因此沒有擁塞跡象,但下一次寫入的EPOLLOUT事件正在呈指數級延遲。 – user1715587 2013-05-02 00:28:35

+0

當發送緩衝區未滿時,我不明白你爲什麼使用'epoll()'。只要寫下來。你應該只在* EAGAIN *之後去'epoll()'*,並在停止使用時停止使用它。 – EJP 2013-05-02 07:43:28

+0

是的,我已經考慮過這個改變。這不是微不足道的。而不是一個替代實現,我真的很想理解爲什麼這種行爲首先發生。 – user1715587 2013-05-02 11:19:16