麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 服務(wù)器 > Linux服務(wù)器 > 正文

如何測(cè)試Linux下tcp最大連接數(shù)限制詳解

2024-09-05 23:05:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

關(guān)于TCP服務(wù)器最大并發(fā)連接數(shù)有一種誤解就是“因?yàn)槎丝谔?hào)上限為65535,所以TCP服務(wù)器理論上的可承載的最大并發(fā)連接數(shù)也是65535”。

先說(shuō)結(jié)論:對(duì)于TCP服務(wù)端進(jìn)程來(lái)說(shuō),他可以同時(shí)連接的客戶(hù)端數(shù)量并不受限于可用端口號(hào)。并發(fā)連接數(shù)受限于linux可打開(kāi)文件數(shù),這個(gè)數(shù)是可以配置的,可以非常大,所以實(shí)際上受限于系統(tǒng)性能。

現(xiàn)在做服務(wù)器開(kāi)發(fā)不加上高并發(fā)根本沒(méi)臉出門(mén),所以為了以后吹水被別人懟“天天提高并發(fā),你自己實(shí)現(xiàn)的最高并發(fā)是多少”的時(shí)候能義正言辭的懟回去,趁著元旦在家沒(méi)事決定自己寫(xiě)個(gè)demo搞一搞。

這個(gè)測(cè)試主要是想搞明白Linux下哪些參數(shù)配置限制了連接數(shù)的最大值,上限是多少。

一、先說(shuō)下demo的思路:

服務(wù)端用epoll實(shí)現(xiàn),就是簡(jiǎn)簡(jiǎn)單單的接收連接,然后客戶(hù)端用go的goroutine,每個(gè)goroutine就是簡(jiǎn)單的建立連接,然后什么也不做。

上代碼:

server:

/* * g++ -o test_epoll ./test_epoll.c */#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/epoll.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>int SetReuseAddr(int fd){ int optval = 1; socklen_t optlen = sizeof(optval); return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);}int main(){ int fd = socket(AF_INET, SOCK_STREAM, 0); int iRet = SetReuseAddr(fd); if (iRet != 0) { printf("setsockopt for SO_REUSEADDR failed, error:%s/n", strerror(iRet)); return iRet; } 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) { printf("bind failed, error:%s/n", strerror(errno)); return errno; } if (listen(fd, 5) == -1) { printf("listen failed, error:%s/n", strerror(errno)); return errno; } printf("Listening on 8080.../n"); int epfd = epoll_create(102400); struct epoll_event event; event.events = EPOLLIN; event.data.fd = fd; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); struct epoll_event revents[102400]; int iOnline = 0; while (1) { int num = epoll_wait(epfd, revents, 102400, 60 * 1000); printf("epoll_wait return %d/n", num); if (num > 0) {  for (int i = 0; i < num; i++)  {  if (revents[i].data.fd == fd)  {   int client;   struct sockaddr_in cli_addr;   socklen_t cli_addr_len = sizeof(cli_addr);   client = accept(fd, (struct sockaddr*)&cli_addr, &cli_addr_len);   if (client == -1)   {   printf("accept failed, error:%s/n", strerror(errno));   if (errno == EMFILE)   {    printf("per-process limit reached/n");    exit(errno);   }   if (errno == ENFILE)   {    printf("system-wide limit reached/n");    exit(errno);   }   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 mainimport ( "net" "fmt" "time" "strconv" "runtime")func Connect(host string, port int) { _, err := net.Dial("tcp", host+":"+strconv.Itoa(port)) if err != nil { fmt.Printf("Dial to %s:%d failed/n", host, port) return } for { time.Sleep(30 * 1000 * time.Millisecond) }}func main() { count := 0 for { go Connect("192.168.63.128", 8080) count++; fmt.Printf("Gorutue num:%d/n", runtime.NumGoroutine()) time.Sleep(100 * time.Millisecond) }}

二、開(kāi)始測(cè)試

第一次:

先說(shuō)結(jié)果,連接數(shù)達(dá)到1031時(shí)accept失敗了,當(dāng)時(shí)還沒(méi)有對(duì)errno做判斷,所以只打印輸出了accept失敗。

Linux,tcp,最大連接數(shù)限制

然后首先想到的是ulimit -n的限制,查看了一下,默認(rèn)值1024,然后就是修改這個(gè)值,在/etc/security/limits.conf中添加一下內(nèi)容:

1 * soft nofile 1024002 * hard nofile 102400

然后關(guān)閉當(dāng)前xshell連接,重新連接即生效,現(xiàn)在看ulimit -n就是102400了。

這兩行的意思就是將每個(gè)進(jìn)程能打開(kāi)的文件描述符個(gè)數(shù)的soft、hard限制調(diào)整為102400,

注:ulimit -n 102400也可以生效,但是這個(gè)修改是臨時(shí)的。

然后進(jìn)行第二次測(cè)試。

第二次:

逗比了,其實(shí)連接數(shù)只有2000+,我之前還在奇怪為啥Windows的默認(rèn)連接數(shù)能有這么高呢,原來(lái)有些連接已經(jīng)斷了,但是因?yàn)槲覜](méi)有做處理,所以以為還在呢,看來(lái)我得再安裝一個(gè)虛擬機(jī)了[二哈]

待繼續(xù)。。。

安裝虛擬機(jī)去,

時(shí)間:2017-12-31 00:09:00

虛擬機(jī)安裝好了,接著搞,

這次是真的超過(guò)10K了。

Linux,tcp,最大連接數(shù)限制

Linux,tcp,最大連接數(shù)限制

連接數(shù)還在增加,不知道能不能最終達(dá)到10萬(wàn)呢,小小的期待ing

時(shí)間:2017-12-31 00:41:00,最終上限卡在28232,golang一直報(bào)dial失敗,由于忘了打印出具體錯(cuò)誤信息了,所以無(wú)從知道為什么dial失敗,所以只能再跑一次T_T

Linux,tcp,最大連接數(shù)限制

 時(shí)間:2017-12-31 01:01:00,添加打印dial失敗的錯(cuò)誤信息的,又跑了一遍,還是在28232時(shí)出現(xiàn)dial失敗,錯(cuò)誤信息:

Linux,tcp,最大連接數(shù)限制

golang的標(biāo)準(zhǔn)庫(kù)文檔中么有對(duì)錯(cuò)誤信息的解釋?zhuān)瑥腻e(cuò)誤信息來(lái)看,是分配地址失敗,于是想是不是端口地址范圍限制了。

Linux,tcp,最大連接數(shù)限制

查看了一下端口地址范圍,確認(rèn)就是這個(gè)限制,由于端口地址是16位,所以,就算把這個(gè)端口地址范圍修改為1024--65535,也最多能開(kāi)啟64521個(gè)連接,而我現(xiàn)在只有一臺(tái)虛擬機(jī)作為客戶(hù)端,所以想要實(shí)現(xiàn)10萬(wàn)連接是不可能了,但是通過(guò)這次測(cè)試,也讓我搞明白了,到底哪些參數(shù)會(huì)限制連接的上限,這就是我想要的。

最后,感謝Linux內(nèi)核團(tuán)隊(duì)的大神們推出了epoll這么牛逼的機(jī)制,才使得我們現(xiàn)在想實(shí)現(xiàn)高并發(fā)是如此的容易,希望自己有一天也能這么牛逼,哈哈。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到服務(wù)器教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日本网站在线看 | 草莓福利视频在线观看 | 一级黄色毛片播放 | 成人情欲视频在线看免费 | 午夜精品福利视频 | 欧美三级欧美成人高清www | 国产精品白嫩白嫩大学美女 | 中文字幕精品在线观看 | 成人 日韩 | 国产大片全部免费看 | 最新91在线视频 | 成人免费观看毛片 | 中文字幕免费播放 | 久久精品视频免费观看 | 高潮娇喘嗯啊~文字 | 精品久久久久久久久久中文字幕 | 国产午夜精品久久久久婷 | 福利在线小视频 | 精品久久久久久久久久久久久 | 成人在线精品视频 | 欧美无限资源 | 97精品国产高清在线看入口 | 国产精品av久久久久久网址 | 综合网日日天干夜夜久久 | 日本在线播放一区二区三区 | 国产精品一区免费在线观看 | 成人资源在线 | 美女视频黄a视频免费全过程 | 国产老师做www爽爽爽视频 | 国产精品免费麻豆入口 | 黄色高清视频网站 | 毛片免费观看完整版 | 色屁屁xxxxⅹ在线视频 | 九九热精品免费视频 | 日本aaaa片毛片免费观蜜桃 | 亚洲第一页综合 | 超碰一区| 国产亚洲精品一区二区三区 | 欧美日韩大片在线观看 | 奶子吧naiziba.cc免费午夜片在线观看 | 一级免费 |