如何通过ulimit在CentOS中巧妙突破内存使用限制,实现系统性能飞跃?
- 内容介绍
- 文章标签
- 相关推荐
ulimit 与内存限制
在 CentOS 程序中,ulimit 是用来设置或查看当前 shell 进程及其子进程的资源限制的工具。它可以控制文件描述符、CPU 时间、进程数、虚拟内存等多种资源。最常见的需求之一就是调整 内存使用上限从而防止单个进程占用过多 RAM,导致程序整体性能下降甚至崩溃。
至于痛点一,应用频繁崩溃。程序响应慢
许多管理员在面对高并发或大型数据库时经常遇到“应用突然停止工作”或“程序卡顿”的情况。原因往往是某些进程被强制终止,因为它们触碰了默认的内存阈值。解决这类问题,需要先确认当前的 memory limit。再根据业务实际需求调整一下。
快速排查步骤
# 查看所有资源限制
ulimit -a
# 关注虚拟内存和物理内存锁定两项
ulimit -v # 单位:KB
ulimit -m # 单位:KB
至于痛点二。临时提高不够灵活,缺乏持久化方案
仅在单次登录会话中执行 ulimit -v 4194304 等命令可以立即生效,但每次重新登录后都会恢复默认值。这给需要持续高性能运行的服务带来了不便。
A. 临时提高示例
# 将虚拟内存软硬限设为 8GB
ulimit -Sv 8388608 # soft limit
ulimit -Hv 8388608 # hard limit
# 或一次性设置软硬限相同
ulimit -v 8388608
B. 永久性提高
- /etc/security/limits.conf: 对所有使用者统一设置。
- .bashrc / .bash_profile: 针对特定使用者自动执行。
# 编辑 /etc/security/limits.conf
* soft memlock 512000 # 512MB soft lock
* hard memlock 512000 # 512MB hard lock
# 对于想要无上限的使用者。可使用 'unlimited'
username soft memlock unlimited
username hard memlock unlimited
# 在 ~/.bashrc 添加:
export MEMLOCK=unlimited
ulimit -l unlimited # 设置最大锁定页面大小为无限制
说到注意事项,
- -m vs -v:-m 限制可锁定的物理内存; 话说回来,-v 限制可使用的虚拟内存。
- `unlimited` 的前提:- 必须在 PAM 配置中允许 `pam_limits.so`。
- `memlock` 必须与 kernel 参数 `vm.max_map_count` 配合使用,以避免因映射过多导致错误。
PAM & Sysctl 的配合使用
AWS Cloud 的大多数实例默认开启了 `/etc/pam.d/system-auth` 中 `pam_limits.so`。但若你手动禁用了它,则无法通过 limits.conf 生效。请确保以下行存在:
# /etc/pam.d/system-auth
session required pam_limits.so
如果你需要进一步调优,还可以修改 /etc/sysctl.conf :
# 增大最大可映射页面数
vm.max_map_count=262144
# 开启 ulimits 对 kernel 参数影响的支持
kernel.panic_on_oops=1
kernel.panic=30
sysctl -w vm.max_map_count=262144
sysctl --system
Smooth Transition: 从临时到永久配置的一步到位方案
- Create a script :
#!/bin/bash
# 设置无穷大 virtual memory 和 memlock 上限
ulimit -v unlimited # 虚拟内存无限制
ulimit -l unlimited # 锁定页面无限制
echo "ULimits 已经永久生效"
exit 0
- Add this script to /etc/profile.d/50-ulimits.sh :
# /etc/profile.d/50-ulimits.sh
if;n source /usr/local/bin/set_ulimits.sh fi chmod +x /etc/profile.d/50-ulimits.sh
这样。无论是普通使用者还是 root 登录,都能自动获得你期望的 memory limit。
& 快速检查清单:
-
✔️ 确认
pam_limits.so已启用; -
✔️ 修改
/etc/security/limits.conf或.bashrc; -
✔️ 使用
ulimit -a验证结果; - ✔️ 如有必要,再配合 sysctl 调整 kernel 参数。完成后你将不再受限于默认低阈值。CentOS 程序将拥有更大的可用 RAM,这样就能实现性能飞跃!
ulimit 与内存限制
在 CentOS 程序中,ulimit 是用来设置或查看当前 shell 进程及其子进程的资源限制的工具。它可以控制文件描述符、CPU 时间、进程数、虚拟内存等多种资源。最常见的需求之一就是调整 内存使用上限从而防止单个进程占用过多 RAM,导致程序整体性能下降甚至崩溃。
至于痛点一,应用频繁崩溃。程序响应慢
许多管理员在面对高并发或大型数据库时经常遇到“应用突然停止工作”或“程序卡顿”的情况。原因往往是某些进程被强制终止,因为它们触碰了默认的内存阈值。解决这类问题,需要先确认当前的 memory limit。再根据业务实际需求调整一下。
快速排查步骤
# 查看所有资源限制
ulimit -a
# 关注虚拟内存和物理内存锁定两项
ulimit -v # 单位:KB
ulimit -m # 单位:KB
至于痛点二。临时提高不够灵活,缺乏持久化方案
仅在单次登录会话中执行 ulimit -v 4194304 等命令可以立即生效,但每次重新登录后都会恢复默认值。这给需要持续高性能运行的服务带来了不便。
A. 临时提高示例
# 将虚拟内存软硬限设为 8GB
ulimit -Sv 8388608 # soft limit
ulimit -Hv 8388608 # hard limit
# 或一次性设置软硬限相同
ulimit -v 8388608
B. 永久性提高
- /etc/security/limits.conf: 对所有使用者统一设置。
- .bashrc / .bash_profile: 针对特定使用者自动执行。
# 编辑 /etc/security/limits.conf
* soft memlock 512000 # 512MB soft lock
* hard memlock 512000 # 512MB hard lock
# 对于想要无上限的使用者。可使用 'unlimited'
username soft memlock unlimited
username hard memlock unlimited
# 在 ~/.bashrc 添加:
export MEMLOCK=unlimited
ulimit -l unlimited # 设置最大锁定页面大小为无限制
说到注意事项,
- -m vs -v:-m 限制可锁定的物理内存; 话说回来,-v 限制可使用的虚拟内存。
- `unlimited` 的前提:- 必须在 PAM 配置中允许 `pam_limits.so`。
- `memlock` 必须与 kernel 参数 `vm.max_map_count` 配合使用,以避免因映射过多导致错误。
PAM & Sysctl 的配合使用
AWS Cloud 的大多数实例默认开启了 `/etc/pam.d/system-auth` 中 `pam_limits.so`。但若你手动禁用了它,则无法通过 limits.conf 生效。请确保以下行存在:
# /etc/pam.d/system-auth
session required pam_limits.so
如果你需要进一步调优,还可以修改 /etc/sysctl.conf :
# 增大最大可映射页面数
vm.max_map_count=262144
# 开启 ulimits 对 kernel 参数影响的支持
kernel.panic_on_oops=1
kernel.panic=30
sysctl -w vm.max_map_count=262144
sysctl --system
Smooth Transition: 从临时到永久配置的一步到位方案
- Create a script :
#!/bin/bash
# 设置无穷大 virtual memory 和 memlock 上限
ulimit -v unlimited # 虚拟内存无限制
ulimit -l unlimited # 锁定页面无限制
echo "ULimits 已经永久生效"
exit 0
- Add this script to /etc/profile.d/50-ulimits.sh :
# /etc/profile.d/50-ulimits.sh
if;n source /usr/local/bin/set_ulimits.sh fi chmod +x /etc/profile.d/50-ulimits.sh
这样。无论是普通使用者还是 root 登录,都能自动获得你期望的 memory limit。
& 快速检查清单:
-
✔️ 确认
pam_limits.so已启用; -
✔️ 修改
/etc/security/limits.conf或.bashrc; -
✔️ 使用
ulimit -a验证结果; - ✔️ 如有必要,再配合 sysctl 调整 kernel 参数。完成后你将不再受限于默认低阈值。CentOS 程序将拥有更大的可用 RAM,这样就能实现性能飞跃!

