SO REUSEPORT使用示例

2021-07-13 18:38:35 字數 1215 閱讀 7709

linux kernel 3.9之前的版本,乙個ip+port組合,只能被監聽bind一次。這樣在多核環境下,往往只能有乙個執行緒(或者程序)是listener,在高併發情況下,往往這就是效能瓶頸。於是linux kernel 3.9之後,linux推出了埠重用so_reuseport選項。

so_reuseport允許多個執行緒/程序,繫結在同乙個埠上。這樣的話,多個socket可以同時bind同乙個tcp/udp埠(ip+port組合)。同時核心保證多個這樣的socket的負載均衡。其核心實現有一下3點:

使用起來很簡單,無論tcp還是udp,bind之前,通過setsockopt設定一下so_reuseport即可。**可能像下面一樣:

int opt_val = 1;

if(setsockopt(msockfd, sol_socket, so_reuseport, &opt_val, sizeof(opt_val)))

對於伺服器的執行緒模型,用上so_reuseport後,就變得簡單了。直接起n個worker執行緒,每個執行緒建立socket,通過類似以上的**設定so_reuseport後,bind到同乙個ip+port,然後每個worker執行緒收到請求處理請求即可。省掉了單獨的listener執行緒以及執行緒之間的佇列、鎖等邏輯,簡單、乾淨、利落。

乙個簡單的**例子reuseport_example

(1)so_reuseport是允許多個socket繫結到同乙個ip+port上。so_reuseaddr用於對tcp套接字處於time_wait狀態下的socket,才可以重複繫結使用。

(2)兩者使用場景完全不同。so_reuseaddr這個套接字選項通知核心,如果埠忙,但tcp狀態位於time_wait,可以重用埠。這個一般用於當你的程式停止後想立即重啟的時候,如果沒有設定這個選項,會報錯eaddrinuse,需要等到time_wait結束才能重新繫結到同乙個ip+port上。而so_reuseport用於多核環境下,允許多個執行緒或者程序繫結和監聽同乙個ip+port,無論udp、tcp(以及tcp是什麼狀態)。

(3)對於多播,兩者意義相同。

[1] 多個程序繫結相同埠的實現分析[google patch]

[2] so_reuseport學習筆記

[3] tengine & nginx效能測試

SharpZipLib使用示例

sharpziplib使用示例 zipinputstream gzipinputstream用於解壓縮deflate gzip格式流,zipoutputstream gzipoutputstream用於壓縮deflate gzip格式流。streamutil類包含了幾個stream處理輔助方法 co...

ConfigEngine使用示例

configengine使用示例 簡要過程如下 步驟3 編寫你的配置定義檔案 raw.f。步驟4 呼叫confengine裡的genconf.py編譯raw.f,生成raw.h.第一步,定義需要的配置項,儲存在raw.f raw.f檔案的解釋如下 第三列為預設值。注意列是由空白分開的,所以如果預設值...

使用陣列示例

namespace cards public hand south public hand west public hand east public void clear public void returnhandsto pack pack private hand north new hand ...