2017-05-11 35 views
0

我的應用程序可作爲系統上運行的其他應用程序的高性能服務器。在開發過程中,我測量了大約30%的核心僅用於調用eventfd_write(),因此試圖使用libaio使用單個系統調用編寫多個evenfd。然後我發現AIO不支持eventfd。使用Linux AIO寫入eventfd

有沒有明顯的障礙沒有實現AIO的eventfd或只是沒有人需要這個呢?

您是否知道嘗試爲eventfd實現AIO的任何現有工作?

+2

讀/寫從/向eventfd只處理讀取或寫入RAM中的8字節整數。我想通過AIO做同樣的事情會增加不成比例的開銷。因此,使用AIO沒有任何好處。 – user803422

+0

是的,我知道,但是當每秒發出1M eventfd_writes到大約30或更多不同的eventfd時,它會在每個系統調用都會啓動metter,這就是爲什麼要通過一次性發出幾個寫入來減少系統調用次數的原因。 – BeginEnd

+1

「1M eventfd_writes per second」←有你的問題。你真的有1M個不同的活動嗎?還是他們經常閱讀? –

回答

0

儘管寫入eventfd只是寫入內存,寫入本身卻是一個系統調用。因此,您必須切換上下文,跳轉到內核,快速寫入,然後切換回用戶空間應用程序。

上下文切換花費很多,更多的只是一個64位寫入。

我們有什麼選擇?

  1. 不要使用eventfd,在共享存儲器中使用的原子標記。您將消除系統調用,並且您的性能將顯着提高。

  2. 不要寫入eventfd每個事件:

    • 考慮,以便將事件批次,每批次只有一次寫。
    • 考慮在有一個非空的事件隊列後切換到輪詢模式,然後在隊列再次爲空時切換回來。
  3. 將eventfd寫入單獨的線程(如果它在上下文中有意義)。

我相信你知道你的應用程序更好,這樣你會拿出一些更優化...如果沒有 - 只是要求在StackOverflow上;)