0%

设置ulimit

深入理解和配置 CentOS 中的 ulimit:从临时调整到生产环境优化

在 Linux 系统中,ulimit 是控制进程资源使用的关键工具,尤其是最大打开文件数(open files)的限制,直接影响高并发服务(如 Web 服务器、数据库)的稳定性。本文将系统讲解 ulimit 的配置方法和注意事项。

为什么需要调整 ulimit?

默认情况下,CentOS 的 open files 限制为 1024,这在以下场景中会成为瓶颈:

  • 高并发服务:Nginx、Apache 等 Web 服务器需要同时处理大量连接(每个连接对应一个文件句柄)。
  • 数据库服务:MySQL、PostgreSQL 会打开大量数据文件和连接句柄。
  • 分布式系统:Kafka、Elasticsearch 等组件需要维护大量网络连接和文件句柄。

当超过限制时,会出现 too many open files 错误,导致服务异常或连接失败。

ulimit 配置的完整方案

临时调整(当前 shell 会话生效)

1
2
3
4
5
6
7
8
9
# 查看当前 open files 限制
ulimit -n

# 临时修改(同时设置软限制和硬限制)
ulimit -n 655360

# 单独设置软限制(-S)和硬限制(-H)
ulimit -Sn 655360 # 软限制:可临时突破,会警告
ulimit -Hn 1048576 # 硬限制:绝对上限,非 root 无法修改

适用场景:临时测试或紧急调整,无需重启服务。

永久配置(全局生效)

(1)修改 /etc/security/limits.conf

这是最常用的全局配置方法,对所有用户生效:

1
sudo vi /etc/security/limits.conf

添加以下配置(格式:用户 限制类型 限制项 数值):

1
2
3
4
5
6
7
8
# 对所有用户设置最大打开文件数(软+硬限制)
* - nofile 655360

# 对 root 用户单独设置更高限制(可选)
root - nofile 1048576

# 限制最大进程数(避免 fork 炸弹)
* - nproc 65535
(2)处理 limits.d 目录的覆盖问题

CentOS 会加载 /etc/security/limits.d/ 目录下的配置文件,优先级高于 limits.conf。例如 20-nproc.conf 可能限制进程数,需同步修改:

1
sudo vi /etc/security/limits.d/20-nproc.conf

更新内容:

1
2
*          soft    nproc     65535
root soft nproc unlimited
(3)生效配置
  • 普通用户:重新登录会话即可生效。
  • 服务进程:需重启服务(如 systemctl restart nginx)。

针对特定服务的配置(推荐生产环境)

对于 systemd 管理的服务(如 Nginx、Java 应用),建议在服务配置中单独设置限制,避免全局配置影响其他服务:

1
2
# 编辑服务配置文件(以 Nginx 为例)
sudo vi /etc/systemd/system/nginx.service.d/limits.conf

添加以下内容:

1
2
3
4
5
6
7
[Service]
# 最大打开文件数
LimitNOFILE=655360
# 最大进程数
LimitNPROC=65535
# 核心文件大小(调试用)
LimitCORE=unlimited

重新加载配置并重启服务:

1
2
sudo systemctl daemon-reload
sudo systemctl restart nginx

验证配置是否生效

验证当前用户限制

1
2
3
4
5
# 查看所有限制
ulimit -a

# 单独查看 open files 限制
ulimit -n

验证特定进程限制

每个进程的限制信息存储在 /proc/<PID>/limits 中:

1
2
3
4
5
# 查找进程 PID(以 Nginx 为例)
PID=$(pgrep nginx | head -n 1)

# 查看该进程的 open files 限制
cat /proc/$PID/limits | grep "Max open files"

如果输出的 Soft LimitHard Limit 与配置一致,说明生效。

常见问题与解决方案

1. 配置后不生效?

  • 原因 1:未重新登录或重启服务。
    解决:退出当前会话重新登录,或重启对应服务。
  • 原因 2limits.d 目录的配置覆盖了 limits.conf
    解决:检查 /etc/security/limits.d/ 下的文件,确保配置一致。
  • 原因 3:服务由 systemd 管理,未单独配置。
    解决:按 “针对特定服务的配置” 方法设置。

2. 如何确定合适的数值?

  • 最大打开文件数:根据服务并发量估算,建议设置为 655361048576(100 万)。
  • 最大进程数:一般设置为系统内存(GB)× 1000 左右(如 16GB 内存设为 16384)。

3. 安全注意事项

  • 避免设置过高的 nproc 限制,防止恶意进程创建大量子进程(fork 炸弹)。
  • 核心文件(core file size)建议默认关闭(设为 0),如需调试可临时开启。

通过合理配置 ulimit,可以为高并发服务提供充足的资源配额,避免因资源限制导致的服务中断,是服务器性能优化的基础步骤

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10