如何在Suse Linux 15 SP2中限制文件描述符始终小于1024?
select系统调用的官方限制说明翻译如下:
警告:select() 只能监视编号小于 FD_SETSIZE(默认值为1024)的文件描述符,对于很多现代应用来说这个限制过低,且该限制不会被修改。所有现代应用应当改用 poll(2) 或者 epoll(7),这两个接口不存在该限制。
SUSE Linux 15 SP2 存在对应的配置方法,可以实现内核始终生成编号小于1024的文件描述符,具体操作如下:
配置方法
全局永久生效配置
编辑
/etc/security/limits.conf文件,添加如下两行配置:* soft nofile 1024 * hard nofile 1024保存后重启系统即可生效。内核分配文件描述符遵循最小可用原则,当进程的文件描述符上限被限制为1024时,最大可分配的文件描述符编号为1023,自然不会出现超过1024的情况。
单进程临时生效配置
若不需要全局修改,仅需要针对特定进程做限制,可在启动目标进程前,在当前shell执行命令:
ulimit -n 1024
再启动目标进程即可,该限制仅对当前shell会话及其子进程生效。
补充说明
之所以仅在AWS EC2实例上会遇到文件描述符超过1024的问题,是因为AWS EC2默认的系统镜像会将进程的文件描述符上限默认调整为65535甚至更高,进程打开文件数超过1023后自然会拿到大于等于1024的文件描述符;而非AWS环境默认的文件描述符上限通常为1024,因此不会触发该问题。
注意:上述配置仅为兼容依赖select()的老旧代码的临时解决方案,select()的1024限制本质是glibc编译期的FD_SETSIZE常量限制,即便调整了内核配置,只要程序编译时使用的FD_SETSIZE为1024,传入超过范围的文件描述符依然会导致内存越界、逻辑异常等问题。长期方案建议将代码中的select()调用替换为poll()或者epoll,彻底解决该限制问题。
内容的提问来源于stack exchange,提问作者Meraj Hussain

