跳过正文

提高Linux的文件描述符限制

·667 字·
技术分享 Linux
目录

为什么需要调整文件描述符限制?
#

1. 默认限制的局限性
#

Arch Linux 默认的 open files 限制为:

$ ulimit -n
1024  # 普通用户默认 soft limit
$ ulimit -Hn
524288 # hard limit

这个限制对于以下场景明显不足

  • 高并发 Web 服务(Nginx/Apache)
  • 数据库系统(MySQL/Redis)
  • 大数据处理(Spark/Hadoop)
  • 游戏服务器(需要加载大量资源文件)

2. 不调整的风险案例
#

# 典型错误日志示例
java.io.IOException: Too many open files
nginx: [alert] 4096 worker_connections exceed open file resource limit: 1024
Unhandled Exception: EETypeRva:0x00667F40: Too many open files

配置
#

步骤 1:创建配置文件
#

创建文件 /etc/security/limits.d/10-nofile-limits.conf

# - nofile - max number of open file descriptors
* soft nofile 8192    # 所有用户 soft limit
# * hard nofile 524288 # 保留系统默认 hard limit

对 systemd 单元,在 /etc/systemd/system.conf/etc/systemd/user.conf 中添加:

DefaultLimitNOFILE=8192:524288

步骤 2:立即生效配置
#

# 对于已登录用户需要重新登录
ssh localhost  # 快速重新建立会话

# 验证当前限制
ulimit -Sn && ulimit -Hn
# 应输出:
# 8192
# 524288

步骤 3:系统级监控(可选)
#

# 查看全局文件描述符使用
watch -n 5 "cat /proc/sys/fs/file-nr"

# 输出示例:
# 7584  0       3254236
# 分别表示:已分配 | 未使用 | 系统上限

高级技巧与排错
#

systemd 服务的特殊处理
#

使用 systemd 管理的服务需要额外配置:

# 编辑 systemd 全局配置
sudo nano /etc/systemd/system.conf

# 修改以下参数:
DefaultLimitNOFILE=8192:524288

重启服务生效:

sudo systemctl daemon-reload
sudo systemctl restart your-service

常见问题排查
#

Q:修改后限制未生效?

  • 确认用户已重新登录
  • 检查 sshd_config 是否启用 UsePAM yes
  • 使用 cat /proc/<PID>/limits 验证进程实际限制

Q:应该设置多大的值?

应用类型推荐 soft limit
Web 服务器65535-131072
数据库262144-524288
桌面应用16384-32768

结语
#

通过合理的文件描述符限制配置,可以在 系统稳定性应用性能 之间取得平衡。建议定期监控文件描述符使用情况:

# 统计各进程打开文件数
lsof -n | awk '{print $1}' | sort | uniq -c | sort -nr | head

📘 扩展阅读:Linux 内核关于文件管理的 官方文档

Sakari
作者
Sakari

相关文章

在 Linux 上反代 Steam 社区
·774 字
技术分享 Linux Network
在 Linux 上 使用 Steamcommunity 302 并使用 systemd 实现开机自启
安全便利地访问家里的 NAS
·1584 字
技术分享 Linux Network
将 CapsLock 重映射到 Esc 和 Ctrl
·849 字
技术分享 Linux
使用 caps2esc ,让 Caps Lock 键在单独按下时充当 Escape 键,在与其他键组合按下时充当 Control 键