Linux 如何高併發socket TCP

2021-06-26 21:38:27 字數 1019 閱讀 1641

測試程式是這樣的,在linux環境下,客戶端不斷地向伺服器發起tcp連線, 在系統預設情況下(前提是你的系統沒有問題,並且沒有更該系統配置),當客戶端socket建立了1000多個後,會socket 失敗!

原因在於,具體是說:單一程序同時開啟檔案數量(這裡可以理解乙個套接字就是乙個檔案)是有上限的!要受到系統的開啟檔案數量、棧大小、埠數 這三個的限制。以乙個客戶端向伺服器發起5萬條tcp連線為例, 在linux系統中,系統預設最高可以發起1024個tcp, 這是遠遠不夠的, 具體檢視系統的開啟檔案數量、棧大小、埠數,輸入以下命令

檢視系統預設的開啟檔案數量上限:ulimit -n (一般是1024)

檢視棧大小的上限:ulimit -s (一般是1024)

檢視埠數的上限:cat /proc/sys/net/ipv4/ip_local_port_range(一般是32768 61000)

那麼就需要修改上限,

修改開啟檔案數: ulimit -n 102400

修改棧大小:     ulimit -s 102400

修改埠數:     # echo "1025 65535" > /proc/sys/net/ipv4/ip_local_port_range

關於埠數再補充一點,研究發現,linux對外的隨機分配埠是由一定限制的,理論上單機對外的埠最大值為65535,除去一些保留埠和被占用埠外,也應該在6w左右,但實際上單機建立對外連線時,預設不超過28232個連線。

執行以下命令就很清楚原因了:

$ cat /proc/sys/net/ipv4/ip_local_port_range

輸出結果為:

32768   61000

這就是linux隨機分配埠的範圍,如果在該範圍內有被占用的埠,那麼連線數肯定小於28232.如果想更改這個範圍,本地埠範圍的最小值必須大於或等於1024;而埠範圍的最大值則應小於或等於65535。可以執行以下命令:

# echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range

如何應對高併發?

參照乙個大佬的文章,我也寫一篇高併發的文章,一下這門高階的現象,以及一些解決措施。乙個關於高併發的問題 那位大佬說 如果真的幹過高併發系統的人,面試官是絕對不會對你提出這個問題的,否則就是他太不明智了。至於為嘛這樣說呢,因為如果設計乙個高併發系統,這句話就是錯誤的了,因為在脫離了業務的系統架構中都是...

高併發,如何提高併發量

一 什麼是高併發 高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。高併發相關常用的一些指標有響應時間 response time 吞吐量 throughput 每秒查詢率qps query per se...

Linux高併發概念

高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。吞吐量 throughput 每秒查詢率qps query per second 併發使用者數 user concurrence 單程序最大開啟檔案數限制...