前言
Ubuntu 24.04 默认的 systemd 配置适用于普通桌面场景,但对于高并发服务器、高性能数据库或密集型 Web 服务,往往需要针对性地调整参数。本文全面介绍 systemd 调优、文件描述符限制、DNS 解析优化等关键领域的配置方法。
Ubuntu 24.04 systemd 默认限制
Ubuntu 24.04 的 systemd 默认限制定义在系统配置文件中:
# 查看 systemd 默认资源限制
systemctl show | grep -i defaultlimit
systemctl show --property DefaultLimitNOFILE
systemctl show --property DefaultLimitNPROC
# 也可以直接查看配置文件
grep -i limit /etc/systemd/system.conf
| 资源类型 | 默认软限制 | 默认硬限制 | 说明 |
|---|---|---|---|
LimitNOFILE |
1024 | 524288 | 文件描述符数量 |
LimitNPROC |
512 | 524288 | 进程/线程数量 |
LimitCORE |
infinity | infinity | Core 文件大小 |
LimitMEMLOCK |
65536 | 65536 | 内存锁定大小 |
注意:虽然硬限制设置为 524288,但系统级
fs.file-max通常默认为 9223372036854775807(几乎无限制),实际瓶颈往往在 systemd 配置层。
Root 用户是否需要单独设置?
是的,root 用户需要单独考虑。
为什么 root 用户特殊?
- ** PAM 配置不影响 root**:
/etc/security/limits.conf中的*通配符默认不包含 root 用户 - ** systemd 默认包含 root**:systemd 的
DefaultLimit*适用于所有用户,包括 root - ** 服务通常以 root 运行**:很多系统服务(nginx、mysql 等)默认以 root 身份运行
root 用户在 limits.conf 中的写法
# /etc/security/limits.conf
# 必须显式写 root,不能用 * 包含
root soft nofile 65535
root hard nofile 65535
root soft nproc 65535
root hard nproc 65535
systemd 对 root 服务的配置
# /etc/systemd/system/nginx.service.d/override.conf
[Service]
LimitNOFILE=65535
LimitNPROC=65535
# 以下配置对 root 用户尤其重要
LimitMEMLOCK=infinity
全局 systemd 调优配置
修改系统级 systemd 配置
编辑 /etc/systemd/system.conf:
[Manager]
# 文件描述符限制
DefaultLimitNOFILE=65535
# 进程数限制
DefaultLimitNPROC=65535
# Core 文件大小(infinity 表示无限制)
DefaultLimitCORE=infinity
# 内存锁定限制(高并发服务需要)
DefaultLimitMEMLOCK=infinity
# CPU 时间限制
DefaultLimitCPU=infinity
# 最大锁数量
DefaultLimitLOCKS=524288
修改用户级 systemd 配置(可选)
编辑 /etc/systemd/system.conf.d/limits.conf:
[Manager]
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535
使配置生效
# 重载 systemd 配置
sudo systemctl daemon-reload
# 查看当前生效的限制
systemctl show | grep -i limit
单个服务的限制配置
方法一:创建 override 配置文件(推荐)
# 为服务创建 override 目录
sudo mkdir -p /etc/systemd/system/nginx.service.d/
# 创建 override 配置文件
sudo vim /etc/systemd/system/nginx.service.d/override.conf
[Service]
# 文件描述符
LimitNOFILE=1048576
# 进程数
LimitNPROC=65535
# 内存锁定(对于高性能服务很重要)
LimitMEMLOCK=infinity
# 实时调度(适用于低延迟要求的服务)
LimitRTPRIO=50
LimitRTTIME=infinity
# 最大的文件大小
LimitFSIZE=infinity
# 重载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart nginx
# 验证配置
cat /proc/$(pgrep -f nginx)/limits | grep -E "Max (files|nproc|locks)"
方法二:直接修改 service 文件
# 查看服务完整配置
sudo systemctl cat nginx
# 编辑服务文件
sudo systemctl edit nginx --full
在 [Service] 部分添加:
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
LimitMEMLOCK=infinity
DNS 域名解析优化
在高并发场景下,DNS 解析失败是常见问题。常见原因包括:
- DNS 缓存不足:系统 DNS 缓存太小
- 并发连接限制:DNS 查询并发数受限
- DNS 服务器响应慢:单一 DNS 服务器成为瓶颈
- DNS 查询超时:重试机制不完善
systemd-resolved DNS 缓存配置
Ubuntu 24.04 使用 systemd-resolved 作为 DNS 解析器。配置 /etc/systemd/resolved.conf:
[Resolve]
# 主 DNS 服务器(推荐使用公共 DNS)
DNS=8.8.8.8 1.1.1.1 223.5.5.5
# 备用 DNS
FallbackDNS=8.8.4.4 1.0.0.1
# DNS 缓存大小(默认 1000,严重不足)
CacheSize=10000
# 是否启用 DNSSEC 验证(高并发时可暂时关闭)
DNSSEC=no
# 是否启用 DNS over TLS(生产环境建议开启)
DNSOverTLS=no
# 并发 DNS 查询数
MaxReuseLoopsPerServer=10
# 允许 DNS 服务在缓存耗尽时返回 NXDOMAIN
CacheFromLocalhost=no
# DNS TTL 最小值(秒)
MinTTL=60
# DNS TTL 最大值(秒)
MaxTTL=3600
# 缓存条目-positive TTL 最长时间
CacheMaxTTL=3600
# 缓存条目-negative TTL 最长时间
CacheMinTTL=60
# 重启 systemd-resolved 使配置生效
sudo systemctl restart systemd-resolved
# 验证 DNS 缓存状态
resolvectl statistics
增加 DNS 并发限制
对于高并发服务,还需要调整内核参数。编辑 /etc/sysctl.conf:
# DNS 查询优化
net.ipv4.tcp_syncookies = 1
# 增加本地端口范围(用于发起大量 DNS 查询)
net.ipv4.ip_local_port_range = 1024 65535
# 调整 ICMP redirect 忽略设置(安全性考虑)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# 启用反向路径校验(安全性考虑)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 使配置生效
sudo sysctl -p
使用 nscd 进行更强力的 DNS 缓存
如果 systemd-resolved 缓存仍不够,可以安装 nscd(Name Service Cache Daemon):
# 安装 nscd
sudo apt install nscd
# 配置 nscd
sudo vim /etc/nscd.conf
# DNS 缓存配置
enable-cache hosts yes
positive-time-to-live hosts 3600
negative-time-to-live hosts 60
suggested-size hosts 211
check-files hosts yes
persistent hosts yes
shared hosts yes
max-db-size hosts 33554432
# 启用日志(调试时开启)
logfile /var/log/nscd.log
debug-level 0
sudo systemctl enable nscd
sudo systemctl restart nscd
验证 DNS 解析性能
# 测试 DNS 解析速度
dig example.com
# 测试并发 DNS 查询
for i in {1..100}; do dig example.com +short & done; wait
# 查看 DNS 缓存命中率
nscd -i hosts
getent hosts example.com
nscd -g
内核网络参数优化
编辑 /etc/sysctl.conf 添加以下配置:
# ========================
# 网络基础优化
# ========================
# 允许更多的并发连接
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.optmem_max = 65536
# ========================
# TCP 连接优化
# ========================
# TCP 内存窗口
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
# TCP 性能参数
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_max_syn_backlog = 65535
# TCP 平滑重启
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_syncookies = 1
# TIME_WAIT 连接复用
net.ipv4.tcp_tw_reuse = 1
# 本地端口范围(高并发必需)
net.ipv4.ip_local_port_range = 1024 65535
# ========================
# 文件系统优化
# ========================
# 文件描述符
fs.file-max = 2097152
fs.nr_open = 2097152
fs.inotify.max_user_watches = 524288
fs.aio-max-nr = 1048576
# ========================
# 虚拟内存优化
# ========================
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50
vm.zone_reclaim_mode = 0
vm.max_map_count = 1048576
# ========================
# IPC 共享内存
# ========================
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
# 应用所有 sysctl 配置
sudo sysctl -p
# 验证关键参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_tw_reuse
sysctl fs.file-max
PAM 模块配置
确保 /etc/pam.d/common-session 包含会话配置:
# 检查是否存在 pam_limits.so
grep -r "pam_limits" /etc/pam.d/
# 如果没有,添加到 common-session
sudo vim /etc/pam.d/common-session
添加行:
session required pam_limits.so
完整调优检查清单
1. 系统级限制
# 检查系统最大文件描述符
cat /proc/sys/fs/file-max
# 检查当前使用量
cat /proc/sys/fs/file-nr
# 检查系统最大进程数
cat /proc/sys/kernel/pid_max
2. systemd 限制
# 查看默认限制
systemd-analyze show-property DefaultLimitNOFILE
systemd-analyze show-property DefaultLimitNPROC
# 查看所有服务限制
systemctl show --all | grep -E "^Limit(NOFILE|NPROC)="
3. 用户级限制
# 查看当前用户限制
ulimit -a
# 查看特定进程限制
cat /proc/$(pgrep nginx)/limits
4. DNS 解析状态
# 查看 systemd-resolved 缓存统计
resolvectl statistics
# 查看 nscd 统计(如果使用)
nscd -g
常见问题排查
Q1: 修改 limits.conf 后不生效?
# 确保 PAM 配置包含 pam_limits.so
grep pam_limits /etc/pam.d/*
# 对于 SSH 会话,需要重启 sshd
sudo systemctl restart sshd
# 对于已经登录的 shell,需要重新登录
exit
Q2: systemd 服务 limit 不生效?
# 确保使用 daemon-reload 而不是 restart
sudo systemctl daemon-reload
sudo systemctl restart your-service
# 检查是否有 override 配置冲突
sudo systemctl cat your-service
Q3: DNS 解析偶尔超时?
# 增加 DNS 重试和超时
vim /etc/systemd/resolved.conf
# 设置 DNSSEC=no 以减少验证时间
# 设置 CacheSize=10000 增加缓存
# 或者使用 DNS over HTTPS
DNSOverTLS=opportunistic
Q4: 高并发下连接被重置?
# 检查 TCP 连接跟踪表
cat /proc/sys/net/netfilter/nf_conntrack_max
# 如果使用 iptables,可能需要增加连接跟踪数
echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max
总结
Ubuntu 24.04 的 systemd 调优涉及多个层面:
| 层面 | 关键配置 | 说明 |
|---|---|---|
| systemd 全局 | DefaultLimitNOFILE |
适用所有服务 |
| systemd 服务 | LimitNOFILE |
针对单个服务 |
| PAM 系统 | limits.conf |
影响用户 shell |
| 内核参数 | sysctl.conf |
系统级优化 |
| DNS 缓存 | resolved.conf |
域名解析性能 |
| Root 用户 | 显式指定 | root soft nofile xxx |
建议在高并发生产环境中,按照本文档逐步调整,每次修改后监控效果,确保稳定性。