Linux修改最大文件描述符数的操作指南
更新时间:2026年03月24日 09:13:19 作者:feng68_
LimitNOFILE(最大文件描述符数)是至关重要的瓶颈,本文总结了压测前必须优化的文件描述符限制配置,涉及系统层、服务进程层和应用配置层三个维度,希望对大家有所帮助
压测必做
修改最大文件描述符数文件
LimitNOFILE(最大文件描述符数)是至关重要的瓶颈。如果设置不当,会迅速遇到 Too many open files 错误,导致压测失败或数据不准。
系统层
[root@server1 ~]# tail -n4 /etc/security/limits.conf root soft nofile 65535 root hard nofile 65535 * soft nofile 65535 * hard nofile 65535 # (注:压测机本身如果是 Linux,也需要改这个,否则 AB 发起端也会报错) # 如果是 systemd 管理的系统 # DefaultLimitNOFILE=65535 等同于 DefaultLimitNOFILE=65535:65535 # 对于压测环境,我们需要确保软限制本身就足够大,这样服务启动后立即可用足够的文件描述符,65535是通用的安全值,足以支撑数万级的并发。如果是超高并发压测(如十万级),建议直接设为 1048576 (100万) [root@server1 ~]# grep -i defaultlimitnofile /etc/systemd/system.conf #DefaultLimitNOFILE=1024:524288 Soft Limit(软限制)=1024;Hard Limit(硬限制)=524288,实际生效的文件描述符上限只有1024 DefaultLimitNOFILE=65535 # 同时也把进程数限制放开,防止压测时进程数不够 DefaultLimitNPROC=65535
服务进程层
# nginx、php
# /etc/systemd/system/nginx.service、/etc/systemd/systemphp-fpm.service
[Service]
LimitNOFILE=65535
# 同时增加进程数限制
LimitNPROC=65535
# (注意:如果使用了多个pool配置文件,systemd只控制主进程,子进程通常会继承主进程的限制,但确保主进程足够大很重要)
# 如果是超高并发,建议也调大堆栈大小,防止递归或复杂计算爆栈
# LimitSTACK=8388608
# 数据库
# /etc/systemd/system/mysqld.service
# 如果是文件是/usr/lib/……下的文件,它是软件包(RPM/DEB)自带的,如果直接修改它,下次运行yum update或apt upgrade升级时,修改会被强制覆盖丢失。
# 建议使用systemctl edit命令,它会自动创建/etc/systemd/system/redis.service.d/目录和正确的配置文件。
# 如果是nano编辑的话下面会有提示,比如“^O”表示ctrl键+O键
[Service]
LimitNOFILE=65535
LimitNPROC=65535
# memcached
[root@server3 ~]# systemctl status memcached.service | grep -i load
Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled)
# /usr/lib/systemd/system/memcached.service文件
[Service]
LimitNOFILE=65535
LimitNPROC=65535应用配置文件层
应用配置文件层 (App Config) - 软限制,需配合系统限制。
# nginx全局块,最大并发连接数=worker_processes*worker_connections
worker_rlimit_nofile 65535;
events {
worker_connections 65535; # 每个工作进程的最大连接数
multi_accept on;
}
# mysql(my.cnf/mysqld.cnf)
[mysqld]
open_files_limit = 65535
max_connections = 2000 # 根据服务器内存调整,不要无脑设大
table_open_cache = 4096
# redis.conf
# Redis通常会自动尝试设置ulimit,但最好在systemd里确保它有权限设置,也就是在服务进程层设定好LimitNOFILE、LimitNPROC。
maxclients 10000
# memcached(/etc/sysconfig/memcached)
OPTIONS="……………… -c 10240" # 最大连接数,确保这个值小于系统的LimitNOFILE; PHP-FPM的进程池配置文件(/usr/local/php/etc/php-fpm.d/www.conf) ; --- 进程管理方式 --- ; 压测环境推荐用 static (静态),性能最好,没有动态创建进程的开销 ; 生产环境如果内存紧张可用 dynamic pm = static ; --- 最大子进程数 (核心参数) --- ; 计算公式:总内存 / 单个进程内存 ; 假设服务器 16G 内存,单个 php 进程 50M,则 16*1024/50 ≈ 320 ; 压测环境为了跑满机器,可以设大一点,比如 512 或 1024 (需监控内存别爆) pm.max_children = 512 ; --- 以下参数在 pm = static 时无效,但建议保留以防切换模式 --- pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 50 ; --- 单个进程最大请求数 --- ; 防止内存泄漏,处理这么多请求后重启进程。压测时可适当调大减少重启开销 pm.max_requests = 10000 ; --- 监听队列长度 (非常重要!) --- ; 当所有子进程都在忙时,新的请求会进入队列。 ; 默认通常是 128 或 511,压测时必须调大,否则会出现 502 Bad Gateway listen.backlog = 65535 ; --- 监听权限 --- ; 确保 nginx 能连接上 listen.owner = nginx listen.group = nginx listen.mode = 0660
到此这篇关于Linux修改最大文件描述符数的操作指南的文章就介绍到这了,更多相关Linux修改最大文件描述符数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
linux(ubuntu)用户连续N次输入错误密码进行登陆时自动锁定X分钟
这篇文章主要介绍了linux(ubuntu)用户连续N次输入错误密码进行登陆时,自动锁定X分钟,需要的朋友可以参考下2019-09-09
Linux防火墙配置及iptables与firewalld的使用解读
防火墙是一种网络安全设备,通过规则控制进出网络的访问行为,它分为硬件防火墙和软件防火墙两大类,iptables是Linux系统中用于配置防火墙的工具,具有4个表和5个链,firewall命令用于配置和管理防火墙,有drop、block、public、external、dmz等不同的区域配置2025-01-01


最新评论