簡體   English   中英

c / c ++ epoll多線程

[英]c/c++ epoll multithreading

我知道對此有很多疑問,但我仍然找不到能幫助我的答案。

讓我們使用帶有epoll的小型tcp服務器,我們希望它利用盡可能多的cpu內核。 我已經考慮過兩種可以完成的方式,但是沒有一種能很好地工作。

1-每個線程都有自己的epoll fd,並且在“ while(1)”循環中使用“ epoll_wait()”並處理請求。

2-只有一個epoll fd,並在處理每個請求時為其創建一個新線程。

在一個單線程中,我可以執行大約25k req / s的速度,因此我假設第一種方法會有所幫助,但實際上,當我使用2個epoll fd時,該應用程序只能處理約10k req / s的速度。 顯然,我什至沒有將第二種方法視為真正的方法,它注定要失敗,所以是的。

因此,基本上我的問題是:我應該如何實現多線程,以便它可以真正利用更多的cpu內核?

套接字是非阻塞的,已設置TCP_NODELAY,TCP_FASTOPEN,並且我也在使用EPOLLET模式。

要使用多個內核,您需要將進程拆分為不同的線程,並讓每個線程在其自己的文件描述符上等待。 但是,在這種情況下,如果僅等待單個文件描述符,則只需對其進行多線程處理並在每個文件描述符上使用阻塞讀取可能會更有效。 您還可以將不同的線程用於不同的內核,因為調度程序通常會嘗試將不同的線程放在同一內核上(因為它們的TLB相同),因此請使用:

  int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

可以幫助您分別仿射事物。 顯然,如果FD的數量超過CPU的數量,則將不得不做出權衡。

這就是我的想法:如果您有兩個線程(如您嘗試過的)不受CPU限制,但是largley在等待I / O,則調度程序會認為“它們都具有相同的TLB占用空間,並且都在等待I / O-因此,我將它們都留在同一CPU上”。 這樣做是合乎邏輯的,它將提供良好的CPU和緩存性能,但是您需要的延遲比這要少(因為大致來說,OPS / sec = 1 / Latency)-因此,使用上述命令將這兩個線程鎖定到不同的內核-最不明白它的作用。

請更具體地說明您使用第一個選項處理數據的方式,fd之間是否存在任何數據同步? 也許這就是降低整體性能的原因。

對於另一個選項,更合理的方法是使用1個epollfd並在多個線程中對其調用epoll_wait。 這有點復雜,但是如果fd之間不存在(或很少)數據相關性,則對於絕對受IO約束的應用程序可能會提供更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM