Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现

简介: Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现

准备内容

一、connection_refuesed ---->文件系统最大的进程fd个数

在那个文件下添加两行

reboot后即可

可以通过ulimit -a指令来查看文件系统最大的进程fd个数

确实由1024变为了百万级别

二、Cannot assign requested address-----> 在服务器开多个端口

连接到一半的时候又会遇到这个问题

在客户端这边,远程ip,远程端口,协议都是确定的,本机ip也是确定的,那么实际上就是本机的端口耗尽了。

解决方法就是 在服务器开多个端口,目前就开了一个端口:8888

解决过程

端口只有65535个,如何可以实现几百万并发呢。由于sockfd是五元组,而几百万并发是sockfd的数量

通过一个循环,开MAX_PORT个端口,每个为一个sockfd

并把每个sockfd加入到epoll中去

最后还需要用一个数组,将每次遇到的sockfd存入到数组后。(由于后续在监听到数据后,需要区分是listenfd还是客户端的信息)

后续while(1) 持续监听的时候,通过sockfds数组(理解为sockfd的集合)判断是listenfd还是clientfd就行了。

通过将MAX_PORT个io都放入到epoll中去管理

三、Connection time out----->设置当前系统设置最大连接数和防火墙对外的最大连接数

运行到后来,客户端还是会出现问题

可以看到64999非常接近65535这个数

接下来,来排查一下问题

通过命令来查看 系统所有进程一共可以打开的文件数量

结果很大,因此和最大可打开的文件数量没有关系

查看当前系统设置最大连接数

这是 内核里面设置的防火墙对外的最大连接数

因此需要设置参数,linux内核中的参数,都可以通过sysctl.conf来设置

修改后,通过下面这条命令进行生效

四、服务器 too many open files in system ----> 设置file_max

然后发现,服务器端,出现了问题,too many open files in system

发现服务器的file-max不够大

对服务器端的/etc/sysctl.conf 同样进行修改

通过sudo sysctl -p去更新

如果出现问题

需要 运行下列命令

然后再sudo sysctl -p去更新

五、内存不够----->调整TCP/IP协议栈 参数

在跑的时候查看htop,发现当一段时间后,fd个数不再增加了,

服务器停住了,因为内存满了,但是过一会又开始下降,说明是内存开始回收。

一旦开始对客户端大量进程结束,cpu的利用率会到达100%(而一般不能这么做,一般不能超过80%)

这时候就要调整 TCP/IP协议栈了

5242884k差不多为2G

1024字节
2*100w差不多为2G。(通过这种方式计算出来)

总的缓存=(每个fd发送缓存+每个fd接受缓存)*fd数量


如果想做到千万并发,就要用到用户态协议栈了

如果想提升客户端连接速度,可以将100个listenfd放入100个线程中去
把clientfd和listenfd放到不同的线程中

如果只利用一个端口8888,开多个进程


相关文章
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
105 1
Linux C/C++之IO多路复用(aio)
WK
|
1月前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
75 1
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
110 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
498 3
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
55 0
|
2月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
33 0
Linux C/C++之线程基础
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
36 0
Linux C/C++之IO多路复用(poll,epoll)
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
84 0
|
2月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
弹性计算 Linux
[转]ECS之初体验(Linux)
服务商: 阿里云 操作系统:Linux 64位 Ubantu 20.04 64位
122 0
下一篇
DataWorks