附上两篇值得参考的博客https://blog.csdn.net/zhengzhaoyang122/article/details/140242801https://developer.aliyun.com/article/617809在linux系统中文件句柄File Handle是 Linux 系统中用于标识和管理打开文件的索引。每个打开的文件、socket、管道等都占用一个文件句柄。linux中一切皆文件所以了解文件句柄是相当重要的。一、文件句柄与文件描述符文件句柄数定义为单个进程能够同时打开和管理的文件句柄的最大数量。这一限制对于系统资源的合理分配与防止滥用至关重要。在Linux系统中每个进程都有一个文件描述符表它是一个数组用来保存该进程打开的文件句柄。每个文件描述符都是一个非负整数代表了对应文件句柄在文件描述符表中的索引。通常情况下标准输入、标准输出和标准错误对应的文件描述符分别为0、1、2。文件句柄在Linux系统中的使用非常灵活通过文件句柄我们可以对文件进行各种操作如读取文件内容、写入数据到文件、关闭文件等。在编程中开发人员可以通过系统调用来获取文件句柄并通过文件句柄来进行文件操作。文件句柄还可以用来进行进程间通信。比如通过管道或者socket来传输数据通过 Unix Domain Socket SCM_RIGHTS 传递 FD。在这种情况下文件句柄可以跨进程传递实现进程间的数据共享。二、文件句柄与文件描述符的关系在Linux系统中文件描述符和文件句柄是两个密切相关但概念不同的实体。文件描述符是用户空间对文件句柄的引用它是一个非负整数用作fdtable进程打开文件表中的索引。而文件句柄则是内核空间中的实际对象包含了文件的详细信息和状态。用户空间的操作通常通过文件描述符来间接引用和操作文件句柄。三、文件句柄限制层级1.进程级限制ulimit -n单个进程可打开的最大句柄上限[roottest ~]# ulimit -n 655352.用户级限制/etc/security/limits.conf单个用户可打开句柄上限[roottest ~]# cat /etc/security/limits.conf #对root用户生效 root soft nofile 655350 root hard nofile 655350 #对所有用户生效 * soft nofile 655350 #软限制触发会告警 * hard nofile 655350 #硬限制触发会禁止再生成fd3.系统级限制/proc/sys/fs/file-max所有进程句柄总和上限[roottest ~]# cat /proc/sys/fs/file-max 1755090 [roottest ~]# cat /proc/sys/fs/file-nr 1728 0 1755090 #含义 已分配 已分配未使用 最大值举个栗子nginx的配置文件如下[roottest ~]# !vim vim /opt/web_app/nginx-1.16.1/conf/nginx.conf user nginx; worker_processes 2; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { use epoll; worker_connections 60000; } #nginx进程信息 [roottest ~]# ps -ef | grep 32202 nginx 3933 32202 0 18:01 ? 00:00:00 nginx: worker process nginx 3934 32202 0 18:01 ? 00:00:00 nginx: worker process root 9813 24528 0 18:10 pts/3 00:00:00 grep --colorauto 32202 root 32202 1 0 Feb28 ? 00:00:00 nginx: master process /opt/web_app/nginx-1.16.1/sbin/nginxnginx服务有三个进程其中master进程是1个root用户worker进程有2个nginx用户。按照进程级别的限制那么每个进程能处理的最多的socket就是65535个但nginx的event里面限制了60000那就是选择最小值这里理论上1个worker能处理60000个链接。有2个worker所以理论上nginx用户最多能处理12万个链接。同时12万并没有超过用户级限制的655350所以理论成立。四、各功能消耗量场景文件句柄消耗打开文件1 个文件 1 个句柄TCP 连接1 个连接 1 个句柄 (收发)数据库连接每个连接消耗多个句柄高并发服务成千上万个并发连接句柄耗尽后果Too many open files错误服务无法接受新连接数据库连接失败日志无法写入五、实际限制因素注以下内容仅供参考生产环境还请斟酌每个打开文件会消耗少量内核内存通常几百字节具体取决于内核实现。建议通过监控 /proc/meminfo 中 Slab 或 KernelStack 来评估真实开销。配置 file-max 时优先参考官方文档或压力测试结果。在配置文件句柄理论限制参数后系统最大文件句柄数实际上是受到硬件和内存的限制的。内存与句柄关系每个文件句柄消耗约 1KB 内核内存建议句柄数 ≤ 可用内存 (GB) × 100 万系统级限制可简单参考一下计算公式进行配置最大句柄数 ≈ 可用内存 (GB) × 100 万 × 安全系数 (0.5-0.8)