我知道 Linux 限制了打开描述符的最大数量,通常为 1024。
现在假设我需要创建一个服务器,它可以处理超过 1024 个用户,例如 2000 个用户,而无需篡改内核。
这意味着我无法通过为每个客户端保持一个打开的描述符并轮询它们来处理所有用户选择()因为我的内核仅支持 1024 个主机。
但是假设我想创建一个并发服务器并为每个连接的客户端生成一个子进程/线程
1. 子进程是否共享父进程的描述符限制,换句话说,我可以生成 2000 个子进程并分别处理每个客户端吗?
2. 线程是否共享父进程的描述符限制,我可以创建 2000 个线程,每个线程处理一个连接吗?
答案1
在 Linux 上,系统范围内对打开的 fds 数量有限制:fs.file-max。此外,还通过 pam_limits 模块 (ulimit) 对每个进程设置了单独的限制,称为 nofile。
https://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
ulimit -n 和 /proc/sys/fs/file-max 有何不同?
孩子是否与父母共享描述符限制
系统总的 fs.file-max 限制是,每个进程的 ulimit 没有。
现在假设我需要创建一个服务器,它可以处理超过 1024 个用户,例如 2000 个用户,而无需篡改内核。
在 set nofile 文件中/etc/security/limits.d/
,为运行服务器的用户至少设置所需的数量,大概是 4000 个。
在文件中将/etc/sysctl.d/
fs.file-max 设置为至少总连接数,再加上一些用于其他程序的连接数。也许是 200000。