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


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

  • 准备内容
  • 一、connection_refuesed ---->文件系统最大的进程fd个数
  • 二、Cannot assign requested address-----> 在服务器开多个端口
  • 三、Connection time out----->设置当前系统设置最大连接数和防火墙对外的最大连接数
  • 四、服务器 too many open files in system ----> 设置file_max
  • 五、内存不够----->调整TCP/IP协议栈 参数

准备内容 Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

一、connection_refuesed ---->文件系统最大的进程fd个数 Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

在那个文件下添加两行
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

reboot后即可
可以通过ulimit -a指令来查看文件系统最大的进程fd个数
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

确实由1024变为了百万级别
二、Cannot assign requested address-----> 在服务器开多个端口 连接到一半的时候又会遇到这个问题
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

在客户端这边,远程ip,远程端口,协议都是确定的,本机ip也是确定的,那么实际上就是本机的端口耗尽了。
解决方法就是 在服务器开多个端口,目前就开了一个端口:8888
解决过程
端口只有65535个,如何可以实现几百万并发呢。由于sockfd是五元组,而几百万并发是sockfd的数量
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

通过一个循环,开MAX_PORT个端口,每个为一个sockfd
并把每个sockfd加入到epoll中去
最后还需要用一个数组,将每次遇到的sockfd存入到数组后。(由于后续在监听到数据后,需要区分是listenfd还是客户端的信息)
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

后续while(1) 持续监听的时候,通过sockfds数组(理解为sockfd的集合)判断是listenfd还是clientfd就行了。
通过将MAX_PORT个io都放入到epoll中去管理
三、Connection time out----->设置当前系统设置最大连接数和防火墙对外的最大连接数 运行到后来,客户端还是会出现问题
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

可以看到64999非常接近65535这个数
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

接下来,来排查一下问题
通过命令来查看 系统所有进程一共可以打开的文件数量
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

结果很大,因此和最大可打开的文件数量没有关系
查看当前系统设置最大连接数
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

这是 内核里面设置的防火墙对外的最大连接数
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

因此需要设置参数,linux内核中的参数,都可以通过sysctl.conf来设置
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

修改后,通过下面这条命令进行生效
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

四、服务器 too many open files in system ----> 设置file_max 然后发现,服务器端,出现了问题,too many open files in system
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

发现服务器的file-max不够大
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

对服务器端的/etc/sysctl.conf 同样进行修改
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

通过sudo sysctl -p去更新
如果出现问题
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

需要 运行下列命令
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

然后再sudo sysctl -p去更新
五、内存不够----->调整TCP/IP协议栈 参数 在跑的时候查看htop,发现当一段时间后,fd个数不再增加了,
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

服务器停住了,因为内存满了,但是过一会又开始下降,说明是内存开始回收。
一旦开始对客户端大量进程结束,cpu的利用率会到达100%(而一般不能这么做,一般不能超过80%)
这时候就要调整 TCP/IP协议栈了
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

5242884k差不多为2G
Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
文章图片

1024字节
2*100w差不多为2G。(通过这种方式计算出来)
总的缓存=(每个fd发送缓存+每个fd接受缓存)*fd数量
【Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)】如果想做到千万并发,就要用到用户态协议栈了

    推荐阅读