現在做伺服器開發不加上高併發根本沒臉出門,所以為了以後吹水被別人懟「天天提高併發,你自己實現的最高併發是多少」的時候能義正言辭的懟回去,趁著元旦在家沒事決定自己寫個demo搞一搞。
這個測試主要是想搞明白linux下哪些引數配置限制了連線數的最大值,上限是多少。
服務端用epoll實現,就是簡簡單單的接收連線,然後客戶端用go的goroutine,每個goroutine就是簡單的建立連線,然後什麼也不做。
上**:
server:
1/*2client:* g++ -o test_epoll ./test_epoll.c3*/
4 #include 5 #include 6 #include 7 #include 8 #include in.h>
9 #include 10
11 #include 12 #include 13 #include
14 #include 15
16int setreuseaddr(int
fd)17
2223
intmain()
2432
33struct
sockaddr_in addr;
34 memset(&addr, 0, sizeof
(addr));
35 addr.sin_family =af_inet;
36 addr.sin_port = htons(8080
);37 addr.sin_addr.s_addr =inaddr_any;
38if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1)39
4344
if (listen(fd, 5) == -1)45
49 printf("
listening on 8080...\n");
5051
int epfd = epoll_create(102400
);52
struct epoll_event event;53
event.events =epollin;
54event.data.fd =fd;
55 epoll_ctl(epfd, epoll_ctl_add, fd, &event
);56
57struct epoll_event revents[102400
];58
int ionline = 0;59
while (1)60
81if (errno ==enfile)
8286
continue;87
}8889 ionline++;
90 printf("
receive a new connection from %s:%d\n
", inet_ntoa(cli_addr.sin_addr), cli_addr.sin_port);
91event.events =epollin;
92event.data.fd =client;
93 epoll_ctl(epfd, epoll_ctl_add, fd, &event
);94}95
}96}97 printf("
online number:%d\n
", ionline);98}
99100
return0;
101 }
1先說結果,連線數達到1031時accept失敗了,當時還沒有對errno做判斷,所以只列印輸出了accept失敗。package main23
import (4"
net"5"
fmt"6"
time"7
"strconv"8
"runtime"9
)1011 func connect(host string, port int
) 17
18for21}
2223
func main()
31 }
然後首先想到的是ulimit -n的限制,檢視了一下,預設值1024,然後就是修改這個值,在/etc/security/limits.conf中新增一下內容:
1 * soft nofile 102400然後關閉當前xshell連線,重新連線即生效,現在看ulimit -n就是102400了。2 * hard nofile 102400
這兩行的意思就是將每個程序能開啟的檔案描述符個數的soft、hard限制調整為102400,
注:ulimit -n 102400也可以生效,但是這個修改是臨時的。
然後進行第二次測試。
待繼續。。。
安裝虛擬機器去,
虛擬機器安裝好了,接著搞,
這次是真的超過10k了。
連線數還在增加,不知道能不能最終達到10萬呢,小小的期待ing
golang的標準庫文件中麼有對錯誤資訊的解釋,從錯誤資訊來看,是分配位址失敗,於是想是不是埠位址範圍限制了。
檢視了一下埠位址範圍,確認就是這個限制,由於埠位址是16位,所以,就算把這個埠位址範圍修改為1024--65535,也最多能開啟64521個連線,而我現在只有一台虛擬機器作為客戶端,所以想要實現10萬連線是不可能了,但是通過這次測試,也讓我搞明白了,到底哪些引數會限制連線的上限,這就是我想要的。
最後,感謝linux核心團隊的大神們推出了epoll這麼牛逼的機制,才使得我們現在想實現高併發是如此的容易,希望自己有一天也能這麼牛逼,哈哈。
如何測試Linux下tcp最大連線數限制詳解
前言 關於tcp伺服器最大併發連線數有一種誤解就是 因為埠號上限為65535,所以tcp伺服器理論上的可承載的最大併發連線數也是65535 先說結論 對於tcp服務端程序來說,他可以同時連線的客戶端數量並不受限於可用埠號。併發連線數受限於linux可開啟檔案數,這個數是可以配置的,可以非常大,所以實...
windows 下TCP最大連線數
在做socket 程式設計時,我們經常會要問,單機最多可以建立多少個 tcp 連線,本文將介紹如何調整系統引數來調整單機的最大tcp連線數。windows 下單機的tcp連線數有多個引數共同決定,下面一一介紹 hkey local machine system currentcontrolset s...
最大連線數 Linux的檔案最大連線數
too many open files 檢視當前作業系統連線數設定 ulimit a修改伺服器最大連線數 vim etc security limits.conf新增 soft nofile 65535 hard nofile 65535 soft nproc 65535 hard nproc 65...