如何測試Linux下tcp最大連線數限制詳解

2022-09-26 14:24:19 字數 3098 閱讀 1410

前言

關於tcp伺服器最大併發連線數有一種誤解就是「因為埠號上限為65535,所以tcp伺服器理論上的可承載的最大併發連線數也是65535」。

先說結論:對於tcp服務端程序來說,他可以同時連線的客戶端數量並不受限於可用埠號。併發連線數受限於linux可開啟檔案數,這個數是可以配置的,可以非常大,所以實際上受限於系統效能。

現在做伺服器開發不加上高併發根本沒臉出門,所以為了以後吹水被別人懟「天天提高併發,你自己實現的最高併發是多少」的時候能義正言辭的懟回去,趁著元旦在家沒事決定自己寫個demo搞一搞。

這個測試主要是想搞明白linux下哪些引數配置www.cppcns.com限制了連線數的最大值,上限是多少。

一、先說下demo的思路:

服務端用epoll實現,就是簡簡單單的接收連線,然後客戶端用go的goroutine,每個goroutine就是簡單的建立連線,然後什麼也不做。

上**:

server:

/** g++ -o test_epoll ./test_epoll.c

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int setreuseaddr(int fd)

int main()

struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));

addr.sin_family = af_inet;

addr.sin_port = htons(8080);

addr.sin_addr.s_addr = inaddr_any;

if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1)

if (listen(fd, 5) == -1)

printf("listening on 8080...\n");

int epfd = epoll_create(102400);

struct epoll_event event;

event.events = epolldeqonin;

event.data.fd = fd;

epoll_ctl(epfd, epoll_ctl_add, fd, &event);

struct epoll_event revents[102400];

int ionline = 0;

while (1)

if (errno == enfile)

continue;

}ionline++;

printf("receive a new connection from %s:%d\n", inet_ntoa(cli_addr.sin_addr), cli_addr.sin_port);

event.events = epollin;

event.data.fd = client;

epoll_ctl(epfd, epoll_ctl_add, fd, &event);

} }

} printf("online number:%d\n", ionline);

} return 0;

}client:

package main

import (

"net"

"fmt"

"time"

"strconv"

"runtime"

)func connect(host string, port int)

for

}func main()

}二、開始測試

第一次:

先說結果,連線數達到1031時accept失敗了,當時還沒有對errno做判斷,所以只列印輸出了accept失敗。

然後首先想到的是ulimit -n的限制,檢視了一下,預設值1024,然後就是修改這www.cppcns.com個值,在/etc/security/limits.conf中新增一下內容:

1 * soft nofile 102400

2 * hard nofile 102400

然後關閉當前xshell連線,重新連線即生效,現在看ulimit -n就是102400了。

這兩行的意思就是將每個程序能開啟的檔案描述符個數的soft、hard限制調整為102400,

注:ulimit -n 102400也可以生效,但是這個修改是臨時的。

然後進行第二次測試。

第二次:

逗比了,其實連線數只有2000+,我之前還在奇怪為啥windows的預設連線數能有這麼高呢,原來有些連線已經斷了,但是因為我沒有做處理,所以以為還在呢,看來我得再安裝乙個虛擬機器了[二哈]

待繼續。。。

安裝虛擬機器去,

時間:2017-12-31 00:09:00

虛擬機器安裝好了,接著搞,

這次是真的超過10k了。

連線數還在增加,不知道能不能最終達到10萬呢,小小的期待ing

時間:2017-12-31 00:41:00,最終上限卡在28232,golang一直報dial失敗,由於忘了列印出具體錯誤資訊了,所以無從知道為什麼dial失敗,所以只能再跑一次t_t

時間:2017-12-31 01:01:00,新增列印dial失敗的錯誤資訊的,又跑了一遍,還是在28232時出現dial失敗,錯誤資訊:

gola的標準庫文件中麼有對錯誤資訊的解釋,從錯誤資訊來看,是分配位址失敗,於是想是不是埠位址範圍限制了。

檢視了一下埠位址範圍,確認就是這個限制,由於埠位址是16位,所以,就算把這個埠位址範圍修改為1024--65535,也最多能開啟64521個連線,而我現在只有一台虛擬機器作為客戶端,所以想要實現10萬連線是不可能了,但是通過這次測試,也讓我搞明白了,到底哪些引數會限制連線的上限,這就是我想要的。

最後,感謝linux核心團隊的大神們推出了epoll這麼牛逼的機制,才使得我們現在想實現高併發是如此的容易,希望自己有一天也能這麼牛逼,哈哈。

總結本文標題: 如何測試linux下tcp最大連線數限制詳解

本文位址:

測試Linux下tcp最大連線數限制

現在做伺服器開發不加上高併發根本沒臉出門,所以為了以後吹水被別人懟 天天提高併發,你自己實現的最高併發是多少 的時候能義正言辭的懟回去,趁著元旦在家沒事決定自己寫個demo搞一搞。這個測試主要是想搞明白linux下哪些引數配置限制了連線數的最大值,上限是多少。服務端用epoll實現,就是簡簡單單的接...

Linux下的TCP通訊

linux下的tcp通訊 今天我們介紹如何編寫linux下的tcp程式,關於udp程式我還沒學。伺服器端的步驟如下 1.socket 建立乙個socket 2.bind 將這個socket繫結在某個檔案上 af unix 或某個埠上 af inet 我們會分別介紹這兩種。3.listen 開始監聽 ...

Linux測試UDP 和 TCP 埠

1 tcp埠的連通性 tc埠的連通性,一般通過telnet檢測 tcp協議是面向連線的,可以直接通過telnet命令連線 telnet host ip port2 udp埠的連通性 因為公司網路防火牆一般對埠會有一些限制,通過公司網路訪問外部伺服器特定埠時,需要檢測與目標伺服器特定埠的連通性 對於u...