如何开启大内存锁定_memlock参数在极限性能中的应用

张开发
2026/4/19 21:23:14 15 分钟阅读

分享文章

如何开启大内存锁定_memlock参数在极限性能中的应用
memlock 是 Linux 内核对单个进程通过 mlock() 可锁定物理内存的上限非总内存限制ulimit -l 仅临时生效于当前 shell 子进程systemd/容器等场景需在 service 文件中配 LimitMEMLOCK且须避免设过大导致因内存碎片而 mlock 失败。memlock 是什么为什么不能只靠 ulimit -l 临时设memlock 不是某个服务的配置项而是 linux 内核对单个进程能用 mlock() 或 mlockall() 锁定的物理内存上限。它管的是“你代码里调用 mlock() 能锁多少”不是“你总共能分配多少内存”。临时执行 ulimit -l 65536 只影响当前 shell 启动的子进程一旦你用 systemd 启服务、进容器、或被 supervisor 管理这个设置就失效了。软限制soft memlock是进程实际能锁定的上限硬限制hard memlock是软限制能被 setrlimit() 提高的天花板Redis、DPDK 应用、实时音频处理等启动时会检查 RLIMIT_MEMLOCK低于所需值直接 abort 并报错 Cannot allocate memory 或 Failed to mlock memory某些发行版如 Ubuntu 22.04默认启用 systemd-user 会覆盖 /etc/security/limits.conf必须额外配 DefaultLimitMEMLOCK 才生效/etc/security/limits.conf 配置为什么经常不生效最常见的失效原因是你改了 limits.conf但没确认 PAM 是否加载了 pam_limits.so。CentOS/RHEL 默认加载但 Debian/Ubuntu 的 common-session 和 common-session-noninteractive 里可能漏掉这一行。检查是否加载grep pam_limits /etc/pam.d/common-session*应看到类似 session required pam_limits.so用户级配置要写全redis soft memlock 1048576 和 redis hard memlock 1048576单位是 KB即 1GB不能只写 * —— systemd 服务默认以 root 或专用用户运行不受通配符影响改完必须重新登录SSH 重连或重启服务su - redis 不触发 PAM session 重载不可靠systemd 服务怎么正确设置 memlock如果你的服务由 systemd 管理99% 的生产场景/etc/security/limits.conf 对它基本无效。必须在 service 文件里显式声明。编辑服务文件sudo systemctl edit redis-server或对应服务名写入[Service]LimitMEMLOCK1073741824单位是字节也可写 1Gsystemd 支持后缀注意不要用 MemoryLocktrue —— 这是 cgroup v2 的内存锁定开关和 RLIMIT_MEMLOCK 完全无关混用会导致行为不可预测生效后验证systemctl show redis-server | grep LimitMEMLOCK再看进程实际值cat /proc/$(pidof redis-server)/status | grep -i lockedmemlock 设太大反而导致 mlock 失败是的。内核不会因为你设了 2GB 就真给你留出 2GB 连续物理页 —— mlock() 成功的前提是请求的内存页当前已在 RAM 中且内核能立刻完成页表映射。如果系统空闲内存碎片化严重或可用页数不足比如只剩 500MB 连续页即使 ulimit -l 显示 2GBmlock() 仍会返回 -1 并设 errno ENOMEM。 Ideogram Ideogram是一个全新的文本转图像AI绘画生成平台擅长于生成带有文本的图像如LOGO上的字母、数字等。

更多文章