Linux(服务器编程):百万并发服务器系统参数调优( 七 )

< LISTEN_PORT_COUNT; ++i){close(listened[i]);} return 0;}

  • 第二步:
    • 修改客户端程序mul_port_client_epoll.c , 将其MAX_PORT宏修改为5即可 , 修改完成之后 , 其就会向5个服务端都发起连接
    • 修改完成之后重新编译
#define MAX_PORT 5
Linux(服务器编程):百万并发服务器系统参数调优文章插图
备注(必看)
  • 此处出错的场景在实际开发中是不会出现的 , 因为在实际生活中 , 不会出现一个系统中有上万的客户端(IP都一致) , 因此出现了这种“五元组”组合用尽的情况
  • 在实际中 , 每个客户端的IP地址都是不同的 , 因此它们的“五元组”类型都是不同的 , 因此就不会出现这种因为端口被用完从而导致“五元组”组合被用尽的情况
  • 修改完成之后进行下面的第3次测试
五、第3次测试测试如下
  • 左侧运行服务端程序reactor(111.229.177.161:8888) , 右侧运行两个客户端程序mul_port_client_epoll去连接服务器
  • 效果如下:
    • 左侧服务端持续接收客户端的连接
    • 右侧两个客户端向服务端发起连接 , 但是当两个客户端都连接到64999的时候 , 客户端不动了 , 阻塞了(程序没有报错 , 也没有退出)
    • 左侧服务端也跟着阻塞了(程序没有报错 , 也没有退出)
    • 过了一小会之后 , 客户端显示连接超时 , 然后程序退出

Linux(服务器编程):百万并发服务器系统参数调优文章插图
Linux(服务器编程):百万并发服务器系统参数调优文章插图
原因分析
  • nf_conntrack_max限制了每一个程序可以建立的TCP的连接的最大数目(是连接数目 , 而不是套接字描述符的个数)
解决方案
  • 我们只需要修改客户端的内核参数nf_conntrack_max就可以 , 可以将其修改为1048576
  • 第一步:nf_conntrack_max参数默认是不开启的 , 需要先加载下面的内核模块 , 加载完成之后其值默认为65536
sudo modprobe ip_conntrack
Linux(服务器编程):百万并发服务器系统参数调优文章插图
  • 第二步:然后在客户端的/etc/sysctl.conf配置文件中将nf_conntrack_max设置为1048576

Linux(服务器编程):百万并发服务器系统参数调优文章插图
  • 第三步:调用sysctl命令将/etc/sysctl.conf配置文件的内容更新到/proc/sys/net/nf_conntrack_max中

Linux(服务器编程):百万并发服务器系统参数调优文章插图
备注一下
  • 与第3次测试类似 , 在实际过程中也不会出现这个问题 , 因为不可能有一个客户端程序会发起上万个连接 , 因为此处我们是测试 , 所以程序要发起上万个测试 , 才修改这个参数
  • 修改完成之后进行第4次测试
六、第4次测试测试如下
  • 左侧运行服务端程序reactor(111.229.177.161:8888) , 右侧运行两个客户端程序mul_port_client_epoll去连接服务器
  • 效果如下:
    • 左侧服务端持续接收客户端的连接
    • 右侧两个客户端向服务端发起连接 , 但是当两个客户端都连接到140999个的时候 , 客户端显示无法分配地址 , 从而程序退出
    • 左侧服务端没有报错 , 只是没有客户端再连接进来了

Linux(服务器编程):百万并发服务器系统参数调优文章插图


推荐阅读