Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux修改最大文件描述符数

Linux修改最大文件描述符数的操作指南

作者: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修改最大文件描述符数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文