elasticsearch必须检查vm.max_map_count,因其默认用mmapfs存索引,每个segment、doc value、倒排表均需内存映射区域(vma),系统默认65530远低于最低要求262144,不足会导致启动失败或运行中outofmemoryerror: map failed。

必须改系统级参数,ES 启动时会强制校验 vm.max_map_count,低于 262144 直接退出,不给绕过机会。
为什么 ES 非要检查 vm.max_map_count
Elasticsearch 默认用 mmapfs 存索引,依赖大量内存映射区域(VMA)。每个 segment、每个 doc value、每个倒排表都可能触发一次 mmap。系统默认值 65530 远不够用,尤其在多分片、高字段数场景下,maps 数量轻松破十万。不调高会导致启动失败,或运行中 mmap 失败引发 OutOfMemoryError: Map failed。
临时生效:用 sysctl -w 快速验证
适合调试、CI 环境或 Docker 容器内快速修复:
- 执行
sudo sysctl -w vm.max_map_count=262144(最低要求)或更稳妥的1048576 - 立即生效,无需重启机器
- 但重启后失效 —— 容器重建、宿主机 reboot 后该值会回退到系统默认
- Docker Desktop 用户需进 WSL 子系统操作:
wsl -d docker-desktop sysctl -w vm.max_map_count=262144
永久生效:写入 /etc/sysctl.conf
生产环境唯一推荐方式,避免服务反复崩溃:
- 用 root 编辑
/etc/sysctl.conf,追加一行:vm.max_map_count = 262144(或1048576) - 执行
sudo sysctl -p加载新配置 - 验证是否生效:
sysctl vm.max_map_count应输出你设的值 - 注意:某些发行版(如 CentOS 7)需确保
sysctl服务已启用,否则-p不持久
容易被忽略的关键点
很多人调完 vm.max_map_count 还是起不来,往往卡在这些地方:
-
sysctl -p执行后没报错 ≠ 配置已加载,务必用sysctl vm.max_map_count实际查值 - 容器内修改无效 —— 必须改宿主机(或 WSL)的内核参数,容器共享宿主机内核
- 有些云厂商(如 AWS EC2)的 AMI 会锁死
sysctl.conf权限,需先chown root:root /etc/sysctl.conf - ES 日志里如果同时出现
mmap failed和vm.max_map_count too low,说明前者(如堆太大、无 swap)已导致进程提前退出,根本没走到 bootstrap check 阶段 —— 得先调小-Xms/-Xmx或开 swap










