网络编程: 服务器百万连接实现

这篇具有很好参考价值的文章主要介绍了网络编程: 服务器百万连接实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验内容: 用三个客户端与服务器建立百万连接
服务器代码: Reactor

将实验遇到的问题记录如下

一、TCP连接

一个TCP连接叫做TCP控制块(tcp control block)。区分网络连接的五元组元素有

(源ip, 目的ip, 源端口, 目的端口, 协议)

二、记录服务器连接时间和连接数

添加功能

  1. 增加服务器监听端口
    如果服务器只用一个端口,那么至少需要10e6/(2^16-1024) ≈ 16台虚拟机。(能分配的端口范围为 1024 ~ 65,535)
for(int i = 0;i < MAX_PORT; i++){
        int socket_fd = socket(AF_INET, SOCK_STREAM, 0);

        struct sockaddr_in serveraddr;
	    memset(&serveraddr, 0, sizeof(struct sockaddr_in));

	    serveraddr.sin_family = AF_INET;
	    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	    serveraddr.sin_port = htons(START_PORT + i);

        if (-1 == bind(socket_fd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr))) {
            perror("bind");
            return -1;
        }

        listen(socket_fd, 10);

        connect_list[socket_fd].fd = socket_fd;
        memset(connect_list[socket_fd].rbuffer, 0, BUFFER_SIZE);
        memset(connect_list[socket_fd].wbuffer, 0, BUFFER_SIZE);
        connect_list[socket_fd].recv_t.accept_callback = accept_callback;
        set_event(socket_fd, EPOLLIN, 1);
    }
  1. 暴力扩大服务器连接池最大数量
#define CONNECTLIST_SIZE 1024 * 1024

struct connect_item connect_list[CONNECTLIST_SIZE];
  1. 记录服务器连接数量和时间
if ((clientfd % 1000) == 999) {
	struct timeval tv_cur;
	gettimeofday(&tv_cur, NULL);
	int time_used = TIME_SUB_MS(tv_cur, zvoice_king);

	memcpy(&zvoice_king, &tv_cur, sizeof(struct timeval));
	
	printf("clientfd : %d, time_used: %d\n", clientfd, time_used);
}

二、问题记录

1. 打开文件数超出系统限制

服务器端显示:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux
客户端显示:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux
引起的原因就是当前shell以及该shell启动的进程打开的文件数量超过了系统限制,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux
将open files改为1048576(临时修改)

ulimit -n 1048576
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux

2. 文件描述符最大值

客户端报错,显示:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux

1.修改内核能够分配的tcp连接的页数和tcp读写缓冲区的内存以及系统能够打开的文件数量
进入 /etc/sysctl.conf 文件中添加
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux
net.ipv4.tcp_mem: 内核分配给TCP连接的内存,单位为页

第一个值表示tcp使用少于多少pages时,kernel不对其进行任何的干预
第二个数字表示当tcp使用了超过多少pages时,kernel会进入 “memory pressure” 压力模式
第三个数字表示当tcp使用超过多少pages时,就会报:Out of socket memory

net.ipv4.tcp_rmem,net.ipv4.tcp_wmem: 为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte

数字分别代表 最小值 缺省值 最大值,一般按缺省值分配
fs.file-max: 系统能够打开的最大文件数量,设置太小系统无法正常运行

三、测试结果

最后服务器到84w连接的时候客户端内存不够了
server:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux
client1:
网络编程: 服务器百万连接实现,Linux 网络编程,网络,服务器,c++,linux

参考文献:https://www.cnblogs.com/94cool/p/5631905.html文章来源地址https://www.toymoban.com/news/detail-808355.html

到了这里,关于网络编程: 服务器百万连接实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】demo版TCP网络服务器实现

    UDP和TCP的区别: 对于TCP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 有连接(正式通信前要先建立连接) 3️⃣ 可靠传输(在内部帮我们做可靠传输工作) 4️⃣ 面向字节流 对于UDP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 无连接 3️⃣ 不可靠传输 4️⃣ 面向数据报 可以看到

    2024年02月06日
    浏览(51)
  • 【网络编程】demo版UDP网络服务器实现

    在上一章【网络编程】socket套接字中我们讲述了TCP/UDP协议,这一篇就是简单实现一个UDP协议的网络服务器。 我们也讲过其实 网络通信的本质就是进程间通信 。而进程间通信无非就是读和写(IO)。 所以现在我们就要写一个服务端(server)接收数据,客户端(client)发送数据

    2024年02月02日
    浏览(44)
  • Java 网络编程 —— 创建多线程服务器

    一个典型的单线程服务器示例如下: 服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。 一般用并发性

    2024年02月02日
    浏览(46)
  • 网络编程 lesson6 服务器模型和网络超时检测

    目录 服务器模型介绍 网络编程服务器模型 循环服务器模型 并发服务器模型 1. 多线程服务器 2. 多进程服务器 3. 事件驱动服务器 网络超时检测 应用场景 设置超时检测的方式 1.利用函数参数设置 代码示例 2.利用socket属性设置 3.利用alarm定时器设置 代码示例 在网络模型中,服

    2024年02月06日
    浏览(48)
  • 网络编程六--UDP服务器客户端

    UDP(User Datagram Protocol)称为用户数据报协议,是一种无连接的传输协议。 UDP的主要应用在即使丢失部分数据,也不影响整体效果的场景。例实时传输视频或音频时,即使丢失部分数据,也不会影响整体效果,只是会有轻微的画面抖动或杂音。 UDP服务器/客户端不像TCP那样,交

    2024年02月15日
    浏览(46)
  • 【skynet】 网络编程之回显服务器

    skynet 提供了一套 tcp 的 API ,本文将给出简单的回显服务器实现,以及讲解。 拉取 skynet 工程 编译 负责启动 gate 服务 \\\"L\\\" 表示客服端的消息前带四字节大端序的 msg_size skynet.address(skynet.self()) 把自己设置为 watchdog ,有新连接通过 text 消息告诉自己 port TCP 监听端口 0 将 TCP 数据

    2024年04月25日
    浏览(35)
  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(72)
  • 【网络编程】高性能并发服务器源码剖析

      hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中, 你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇文章能

    2024年04月15日
    浏览(51)
  • 云服务器搭建与部署【Unity网络编程(一)】

    1.购买云服务器 新用户第一次买不贵,我在腾讯云买的,学生2G2核CPU20元3个月,36元半年,就买了半年的,只是简单的测试和学习 2.购买后建议选择CentOS系统,之前选择windows server系统,然后在XShell中一直连接不上 在服务器可以看到公网和内网了 3.重置密码 如果不重置的话登

    2023年04月20日
    浏览(39)
  • 网络编程(8.14)TCP并发服务器模型

    作业: 1. 多线程中的newfd,能否修改成全局,不行,为什么? 2. 多线程中分支线程的newfd能否不另存,直接用指针间接访问主线程中的newfd,不行,为什么? 多线程并发服务器模型原代码: 1.将newfd改成全局变量效果:  答:不行,因为newfd是全局变量的话,客户端连接后生成

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包