文件是 Linux 系统中的一切事物的存在形式, 计算机中的数据和硬件都是通过文件的形式进行管理, Linux 的文件主要有普通文件, 文件夹, 设备文件, 链接文件, 管道文件, 套接字文件 (数据通信的接口) 等类型, Linux 中的各种事物比如像文档, 文件夹, 键盘, 监视器, 硬盘, 可移动媒体设备, 打印机, 调制解调器, 虚拟终端等等都是定义在文件系统空间下的字节流.
因此在 Linux 系统上的 web 程序, 在进行 TCP 连接时, 系统为每个 TCP 连接创建一个 socket 句柄, 而每个句柄也是一个文件句柄, 所以 Web 程序对文件的操作情况, 是影响到服务器性能的重要指标, 像网站在高流量高并发的场景下出现 "Too many open files" 的异常就是因为打开的文件数超过限制, 而程序中对资源 (包括图片, 音视频资源), 网页, 以及接口的请求在 Linux 系统里的表现为对文件的访问, 如果打开文件数超出了系统限制(系统级和用户级) 的数量, 就会拒绝接下来的文件访问
当前用户级的文件数限制, 可以通过 ulimit -n 来查看, 如图:
而系统级别的文件数限制, 则通过 sysctl -a 来查看, 如下图:
一般系统最大文件数会根据硬件资源计算出来的, 如果强行需要修改最大打开文件数可以通过 ulimit -n 10240 来修改, 当这种方式只对当前进程有效, 如果需要永久有效则需要修改 / etc/security/limits.conf(重启系统生效), 如下图:
其中:
root : 指定用户, 如对所有用户, 则写 *
soft: 软限制
hard: 硬件限制
nofile 是代表最大文件打开数
除此之外, 下面是一些打开文件数操作相关的指令, 仅供参考:
1, 查看所有进程的文件打开数:
lsof |wc -l
2, 查看某个进程打开的文件数:
lsof -p pid |wc -l
3, 查看系统中各个进程分别打开了多少句柄数:
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
来源: http://server.51cto.com/sOS-586846.htm