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)之后程序报错 , 显示无法继续接收客户端的连接
- 右侧客户端也报错 , 无法继续连接服务端
文章插图原因分析
- 默认情况下 , 系统有限制 , 一个进程最多只能1024个文件(或文件描述符) 。 我们的客户端发起来了超过1024个客户端的连接 , 因此程序报错
- 通过ulimit命令可以查看 , 如下:
文章插图解决方案(修改最大文件数)
- 第一步:
- 通过ulimit命令或者修改/etc/security/limits.conf配置文件 , 修改用户可打开的最大文件描述符个数 。 由于ulimit命令修改的结果不能永久保存 , 因此我们此处修改/etc/security/limits.conf配置文件
- (下面图1)下面修改/etc/security/limits.conf , 将所有用户可打开的文件描述符个数修改为1048576(1024*1024)
- (下面图2)修改完成之后退出当前会话(不必重启) , 然后重新开启会话 , 通过ulinit命令可以看到修改成功
- 然后再把客户端的机器也全部修改一下 , 别忘记了
文章插图
文章插图- 第二步:
- (下面图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文件 , 更新成功
- 然后再把客户端的机器也全部修改一下 , 别忘记了
文章插图
文章插图
文章插图- 第三步:
- 上面我们将进程可分配描述符数量都增大了 , 那么还需要修改服务端程序reactor.c中的MAX_EPOLL_EVENTS宏 , 因为其代表的是epoll_wait()可以处理事件的数量 , 因为客户端数量增加了 , 因此该宏也要增加
- 下面我们将该宏设置为1024*512=524288(由于本人机器内存不足 , 只能修改这个大 , 如果修改再大程序就运行不了 , 因为无法为程序分配更多的内存 。 如果你的机器内存够大 , 那么可以将这个数值再往上调;如果你的机器内存不足 , 那么就将这个值调小)
- 修改完成之后重新编译reactor.c
文章插图- 上面所有的内容修改完成之后 , 进入下面的第2次测试
- 左侧运行服务端程序reactor(111.229.177.161:8888) , 右侧运行两个客户端程序mul_port_client_epoll去连接服务器
- 效果如下:
- 左侧服务端持续接收客户端的连接
- CPU|Intel要推CPU氪金:花钱解锁额外功能、Linux内核率先支持
- 编程|拔掉SIM卡,关机,使用非智能手机,行程码就不知道你的行踪了?
- 小米科技|宋九九:我的腾讯云服务器被封禁,被限制访问
- 编程|扫街我可能还是喜欢带徕卡,因为它体积小,不会引人注目
- Linux|华为鸿蒙系统的优势,真的太明显了,是面向未来的IOT系统
- Linux|钱包可能不保!骁龙888+ 6.1英寸屏,想选索尼全靠信仰加持
- Linux|体验近两个月!实话实说,体验最好的国产折叠屏手机还得是这一款
- Linux|7K能买到的全能本!华硕天选air开启预约,这三点提升诚意十足
- Linux|启中教育:直通车很烧钱?如何打破?
- Linux|追赶Win11系统 新版Linux将支持12代酷睿独家秘技
