常 识 一 : 文 件 句 柄 限 制 \color{blue}常识一:文件句柄限制 常识一:文件句柄限制
在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can’t open so many files”。
这时你需要明白操作系统对可以打开的最大文件数的限制。
进 程 限 制 \color{green}进程限制 进程限制
执行ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。临时修改:ulimit -n 1048576(最大值),但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。
永 久 修 改 : 编 辑 / e t c / s e c u r i t y / l i m i t s . c o n f , 在 其 后 添 加 如 下 内 容 : \color{orange}永久修改:编辑/etc/security/limits.conf,在其后添加如下内容: 永久修改:编辑/etc/security/limits.conf,在其后添加如下内容:
* soft nofile 1048576 # open files (-n)
* hard nofile 1048576
* soft nproc 1048576 # max user processes (-u)
* hard nproc 1048576
全 局 限 制 \color{green}全局限制 全局限制
执行
cat /proc/sys/fs/file-nr
输出
9344 0 592026
各项含义分别为:
- 已经分配的文件句柄数,
- 已经分配但没有使用的文件句柄数,
- 最大文件句柄数。
但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。
我们可以把这个数值改大些,用 root 权限修改 /etc/sysctl.conf 文件:
fs.file-max = 1048576
net.ipv4.ip_conntrack_max = 1048576
net.ipv4.netfilter.ip_conntrack_max = 1048576