欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年10月31日 09:55:41   作者:冷冰若水  
這篇文章主要給大家介紹了關(guān)于如何測(cè)試Linux下tcp最大連接數(shù)限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

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

一、先說下demo的思路:

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

上代碼:

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 main

import (
 "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)
 }
}

二、開始測(cè)試

第一次:

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

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

1 * soft nofile 102400
2 * hard nofile 102400

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

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

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

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

第二次:

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

待繼續(xù)。。。

安裝虛擬機(jī)去,

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

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

這次是真的超過10K了。

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • 通過SSH連接本地linux虛擬機(jī)的過程記錄

    通過SSH連接本地linux虛擬機(jī)的過程記錄

    這篇文章主要介紹了通過SSH連接本地linux虛擬機(jī)的過程記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于bash函數(shù)你可能不知道的一些事情(譯)

    關(guān)于bash函數(shù)你可能不知道的一些事情(譯)

    這篇文章主要給大家介紹了關(guān)于bash函數(shù)你可能不知道的一些事情,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 快速自學(xué)Linux命令的4種方法

    快速自學(xué)Linux命令的4種方法

    自學(xué)Linux對(duì)于新手來說是一件非常辛苦的事件,那么有沒有快速成為Linux高手的方法呢,掌握一些Linux常用特殊命令是必不可少的。下面是自學(xué)Linux命令的4種方法,
    2018-10-10
  • Linux如何處理文件已刪除但空間不釋放的問題

    Linux如何處理文件已刪除但空間不釋放的問題

    這篇文章主要介紹了Linux如何處理文件已刪除但空間不釋放的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Ubuntu20.04 VNC 安裝與設(shè)置實(shí)現(xiàn)

    Ubuntu20.04 VNC 安裝與設(shè)置實(shí)現(xiàn)

    這篇文章主要介紹了Ubuntu20.04 VNC 安裝與設(shè)置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • linux如何使用date命令獲取系統(tǒng)時(shí)間

    linux如何使用date命令獲取系統(tǒng)時(shí)間

    這篇文章主要介紹了linux如何使用date命令獲取系統(tǒng)時(shí)間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Linux服務(wù)器操作系統(tǒng)加固方法

    Linux服務(wù)器操作系統(tǒng)加固方法

    本幫助手冊(cè)旨在指導(dǎo)系統(tǒng)管理人員或安全檢查人員進(jìn)行Linux操作系統(tǒng)的安全合規(guī)性檢查和加固,需要的朋友可以參考下
    2018-02-02
  • Linux重置WordPress管理員密碼的方法步驟

    Linux重置WordPress管理員密碼的方法步驟

    重置 WordPress 管理員密碼通??梢酝ㄟ^ WordPress 儀表板完成,然而,在某些情況下,例如忘記管理員密碼且無法訪問電子郵件,或網(wǎng)站崩潰無法進(jìn)入儀表板時(shí),我們可能需要通過命令行來重置,所以本文給大家介紹了Linux環(huán)境如何使用命令重置 WordPress 管理員密碼
    2024-06-06
  • 簡單架設(shè)SSH+Squid代理服務(wù)器的自由上網(wǎng)通道的方法

    簡單架設(shè)SSH+Squid代理服務(wù)器的自由上網(wǎng)通道的方法

    Squid是一個(gè)高性能的代理緩存服務(wù)器,但缺點(diǎn)是網(wǎng)址是以明文的形式發(fā)送的。在我們的特殊互聯(lián)網(wǎng)環(huán)境中,就算使用這樣的代理服務(wù)器,打開網(wǎng)頁時(shí)也常常會(huì)被“Reset”。
    2011-03-03
  • Linux中sudo、su和su -命令的區(qū)別小結(jié)

    Linux中sudo、su和su -命令的區(qū)別小結(jié)

    我們知道,在Linux下對(duì)很多文件進(jìn)行修改都需要有root(管理員)權(quán)限,比如對(duì)/ect/profile等文件的修改。下面這篇文章主要給大家總結(jié)介紹了關(guān)于Linux中sudo、su和su -命令的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2018-09-09

最新評(píng)論