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

< nfds;i ++){ int clientfd = events[i].data.fd;// 执行写 if (events[i].eventssend(sockfd, buffer, strlen(buffer), 0);}// 执行读 else if (events[i].eventsssize_t length = recv(sockfd, rBuffer, MAX_BUFFER, 0); if (length > 0) { printf(" RecvBuffer:%s\n", rBuffer);if (!strcmp(rBuffer, "quit")) {isContinue = 0;}} else if (length == 0) { printf(" Disconnect clientfd:%d\n", clientfd);connections --;close(clientfd);} else { if (errno == EINTR) continue;printf(" Error clientfd:%d, errno:%d\n", clientfd, errno);close(clientfd);}} else { printf(" clientfd:%d, errno:%d\n", clientfd, errno);close(clientfd);}}}// 休眠1000微秒(0.01秒)usleep(1 * 1000); } return 0;err: printf("error : %s\n", strerror(errno)); return 0;}三、第1次测试测试如下

  • 左侧运行服务端程序reactor(111.229.177.161:8888) , 右侧运行客户端程序mul_port_client_epoll去连接服务器
  • 效果如下:
    • 左侧服务端接收了1021个客户端(除去描述符0、1、2)之后程序报错 , 显示无法继续接收客户端的连接
    • 右侧客户端也报错 , 无法继续连接服务端

Linux(服务器编程):百万并发服务器系统参数调优文章插图
原因分析
  • 默认情况下 , 系统有限制 , 一个进程最多只能1024个文件(或文件描述符) 。 我们的客户端发起来了超过1024个客户端的连接 , 因此程序报错
  • 通过ulimit命令可以查看 , 如下:

Linux(服务器编程):百万并发服务器系统参数调优文章插图
解决方案(修改最大文件数)
  • 第一步:
    • 通过ulimit命令或者修改/etc/security/limits.conf配置文件 , 修改用户可打开的最大文件描述符个数 。 由于ulimit命令修改的结果不能永久保存 , 因此我们此处修改/etc/security/limits.conf配置文件
    • (下面图1)下面修改/etc/security/limits.conf , 将所有用户可打开的文件描述符个数修改为1048576(1024*1024)
    • (下面图2)修改完成之后退出当前会话(不必重启) , 然后重新开启会话 , 通过ulinit命令可以看到修改成功
    • 然后再把客户端的机器也全部修改一下 , 别忘记了

Linux(服务器编程):百万并发服务器系统参数调优文章插图
Linux(服务器编程):百万并发服务器系统参数调优文章插图
  • 第二步:
    • (下面图1)上面我们虽然修改了/etc/security/limits.conf , 但是该配置文件约束的是“用户级别”的系统限制 。 还有两个“内核级别”的配置参数与文件描述符有关 。 一个为nr_open(表示单个进程打开文件句柄数上限) , 另一个为file-max(表示系统范围内所有进程可打开的文件句柄的数量限制)
      • 其中nr_open默认为1048576 , 我们就不需要修改了
      • file-max默认为180566 , 因此我们需要将其修改为1048576
    • (下面图2)修改/etc/sysctl.conf文件 , 在里面修改file-max的值为1048576 , 然后保存退出
    • (下面图3)执行sysctl的命令 , 将/etc/sysctl.conf文件的内容更新到/proc/sys/fs/file-max中生效 , 令执行完之后查看/proc/sys/fs/file-max文件 , 更新成功
    • 然后再把客户端的机器也全部修改一下 , 别忘记了

Linux(服务器编程):百万并发服务器系统参数调优文章插图
Linux(服务器编程):百万并发服务器系统参数调优文章插图
Linux(服务器编程):百万并发服务器系统参数调优文章插图
  • 第三步:
    • 上面我们将进程可分配描述符数量都增大了 , 那么还需要修改服务端程序reactor.c中的MAX_EPOLL_EVENTS宏 , 因为其代表的是epoll_wait()可以处理事件的数量 , 因为客户端数量增加了 , 因此该宏也要增加
    • 下面我们将该宏设置为1024*512=524288(由于本人机器内存不足 , 只能修改这个大 , 如果修改再大程序就运行不了 , 因为无法为程序分配更多的内存 。 如果你的机器内存够大 , 那么可以将这个数值再往上调;如果你的机器内存不足 , 那么就将这个值调小)
    • 修改完成之后重新编译reactor.c
#define MAX_EPOLL_EVENTS (1024 * 512)
Linux(服务器编程):百万并发服务器系统参数调优文章插图
  • 上面所有的内容修改完成之后 , 进入下面的第2次测试
四、第2次测试测试如下