• max-file:表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
  • ulimit -n:控制进程级别(比如 Nginx 进程、MySQL 进程)能够打开的文件句柄的数量。提供对 shell 及其启动的进程的可用文件句柄的控制。这是进程级别的。

一边情况下,服务器上的 ulimit 都需要我们自己设置,而不能使用系统默认的,否则会出现文件描述符耗尽的问题。文件句柄达到上限之后的常见错误有:Too many open files 或者 Socket/File: Can’t open so many files 等。

查看 max-file

$ sysctl -a | grep 'fs.file-max'
fs.file-max = 6553560

$ cat /proc/sys/fs/file-max
6553560

设置的方式有两种,一种是临时生效,重启后恢复默认。另一种永久生效。

file-max 的修改:

$ echo 6553560 > /proc/sys/fs/file-max
$ sysctl -w "fs.file-max=34166"
// 以上 2 种重启机器后会恢复为默认值
或
$ echo "fs.file-max = 6553560" >> /etc/sysctl.conf
// 立即生效,此方式永久生效
$ sysctl -p 

ulimit open files 修改:

// 这只是在当前终端有效,退出之后,open files 又变为默认值。当然也可以写到 /etc/profile 中,因为每次登录终端时,都会自动执行 /etc/profile
$ ulimit -HSn 65535
或
// 加入以下配置,重启即可生效
$ vim /etc/security/limits.conf  
* soft nofile 65535 
* hard nofile 65535

// 如果需要设置当前用户 session 立即生效,可以执行:
$ ulimit -n 65535 

解释说明

1. 文件句柄:在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读/写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读/写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。

Logo

更多推荐