前言

关于TCP服务器最大并发连接数有一种误解就是“因为端口号上限为65535,所以TCP服务器理论上的可承载的最大并发连接数也是65535”。

先说结论:对于TCP服务端进程来说,他可以同时连接的客户端数量并不受限于可用端口号。并发连接数受限于linux可打开文件数,这个数是可以配置的,可以非常大,所以实际上受限于系统性能。

现在做服务器开发不加上高并发根本没脸出门,所以为了以后吹水被别人怼“天天提高并发,你自己实现的最高并发是多少”的时候能义正言辞的怼回去,趁着元旦在家没事决定自己写个demo搞一搞。

这个测试主要是想搞明白Linux下哪些参数配置限制了连接数的最大值,上限是多少。

一、先说下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 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)

}

}

二、开始测试

第一次:

先说结果,连接数达到1031时accept失败了,当时还没有对errno做判断,所以只打印输出了accept失败。

然后首先想到的是ulimit -n的限制,查看了一下,默认值1024,然后就是修改这个值,在/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失败,错误信息:

golang的标准库文档中么有对错误信息的解释,从错误信息来看,是分配地址失败,于是想是不是端口地址范围限制了。

查看了一下端口地址范围,确认就是这个限制,由于端口地址是16位,所以,就算把这个端口地址范围修改为1024--65535,也最多能开启64521个连接,而我现在只有一台虚拟机作为客户端,所以想要实现10万连接是不可能了,但是通过这次测试,也让我搞明白了,到底哪些参数会限制连接的上限,这就是我想要的。

最后,感谢Linux内核团队的大神们推出了epoll这么牛逼的机制,才使得我们现在想实现高并发是如此的容易,希望自己有一天也能这么牛逼,哈哈。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

linux普通用户tcp最大连接数查询,如何测试Linux下tcp最大连接数限制详解相关推荐

  1. Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...

  2. Linux下的samba服务配置详解

    Linux下的samba服务配置详解 一.Samba介绍 二.Samba工具及特性 三.搭建环境介绍 四.Samba配置步骤 1.服务端操作 2.在客户端操作 五.测试用户的权限情况 一.Samba介 ...

  3. 在linux系统上怎么架设服务器吗,Linux下各种服务器的架设详解

    Linux下各种服务器的架设详解 本站整理   发布时间:2009-03-10 12:10:57   作者:jb51.net   我要评论 ########DNS########bind 篇##### ...

  4. linux下防火墙iptables用法规则详解

    linux下防火墙iptables用法规则详解 分享者: du52.com 邮件: wangaibo168@163.com 主页: http://www.du52.com linux下防火墙iptab ...

  5. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  6. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解

    Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...

  7. Linux下暴力破解工具Hydra详解

    Linux下暴力破解工具Hydra详解 一.简介 Number one of the biggest security holes are passwords, as every password s ...

  8. Linux 下 TC 命令原理及详解<一>

    文章目录 1 前言 2 相关概念 3 使用TC 4 创建HTB队列 5 为根队列创建相应的类别 6 为各个类别设置过滤器 7 复杂的实例 Linux 下 TC 命令原理及详解<一> Lin ...

  9. linux电脑关机命令是什么问题,linux下正常关机之命令详解 -电脑资料

    系统启动的时候生成一个文件,正常关机的时候会删除这个文件,管理过程中出现故障的机率. 步骤: 在/etc/rc.d/init.d/下编程脚本. 判断是否正常关机,和生成文件的脚本:touch-file ...

最新文章

  1. RHEL6 PXE+KickStart全自动安装配置指南
  2. Spark UDF用户自定义函数
  3. flag的具体用法python_Python Qt.WindowFlags方法代码示例
  4. ResNet论文笔记
  5. 列车时刻管理c语言程序设计,列车时刻表信息管理系统实践报告C语言源代码
  6. win10中plt绘图显示中文
  7. 【OpenCV】基于图像处理和模式识别的火灾检测方法
  8. 安卓 摇一摇 事件监听
  9. ios 系统状态栏样式修改_IOS修改状态栏的字体颜色以及修改状态栏的背景颜色...
  10. 2022 年值得安装的几个 chrome/edge 扩展神器
  11. 构造函数中慎用memset
  12. 博弈论2:学会换位思考(弱劣势策略)
  13. 第一天,初了解锐捷网络
  14. 随机生成6位字母+数字混合密码
  15. AI重新定义web及谷歌验证码安全
  16. python 无脸男
  17. 虚幻引擎:游戏设计(FPS项目) 一
  18. 华为路由器与交换机的基础命令
  19. 中美青年创客大赛启动,50万奖金等你来挑战!
  20. 西安航天民芯电子 推出原厂原装MT36291 SOT23-6 PIN对PIN兼替FP6291LR-G1 MT3608

热门文章

  1. Android Studio中R文件错误的解决办法
  2. 地理空间数据 Geospatial data
  3. 简谈卷积—幽默笑话谈卷积
  4. 计算机专业常用笔记本,适合计算机专业的笔记本电脑有哪些
  5. 在mysql中 更新数据中where_SQL中使用UPDATE更新数据时一定要记得WHERE子句
  6. android 字符串折线图,Android + MPAndroidChart 实现折线、柱形和饼状图
  7. 微信理财通和余额宝哪个好
  8. ubuntu输入法设置(候选词语不显示)
  9. 2008年硕士招生专业目录
  10. 航海世纪服务器维护中,航海世纪求解