vm.max_map_count是linux内核参数,用于控制单个进程可创建的最大内存映射区域数,默认值通常为65530或65536,elasticsearch等应用常需调至262144以避免“map failed”错误。

Linux 中“进程的最大文件映射数量限制”通常指单个进程可建立的 内存映射区域(mmap areas)数量上限,由内核参数 vm.max_map_count 控制。它不等于文件描述符(nofile)或打开文件数限制,而是影响如 Elasticsearch、Redis、Docker、Java(尤其是使用大量堆外内存或 mmap 的应用)等依赖大量内存映射的应用能否正常启动或扩容。
该限制决定了一个进程最多能创建多少个独立的 mmap() 区域(例如每个 Lucene segment、每个 JVM NIO direct buffer 映射、每个 Docker layer overlay 映射都可能消耗一个 mmap 区域)。超出时会报错:java.lang.OutOfMemoryError: Map failed
或 Cannot allocate memory(即使物理内存充足)。
查看当前 mmap 数量限制
cat /proc/sys/vm/max_map_count
常见默认值:65530(CentOS/RHEL)、65536(Ubuntu/Debian),对高并发检索或大数据服务往往不够。
临时调整(重启后失效)
sudo sysctl -w vm.max_map_count=262144
验证是否生效:
cat /proc/sys/vm/max_map_count # 应返回新值
永久生效(推荐用于生产环境)
将配置写入 /etc/sysctl.conf:
echo "vm.max_map_count = 262144" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
✅ 注意:
sysctl -p会重新加载所有/etc/sysctl.conf中的设置,确保无语法错误。
部分系统(如新版 systemd)也支持单独配置文件:
echo "vm.max_map_count = 262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf sudo sysctl --system
验证是否被进程实际使用
修改后,需重启目标服务(如 Elasticsearch、Logstash、自定义 Java 程序),因为 vm.max_map_count 是进程启动时读取的内核参数,运行中不会动态更新其上限。
例如 Elasticsearch 启动日志中若出现:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
说明旧值未生效,需检查 sysctl -p 是否成功、服务是否已重启。
补充说明:和相关限制的区别
-
ulimit -n(nofile):控制文件描述符总数(含 socket、pipe、普通文件等),不影响 mmap 区域计数; -
ulimit -v(as)或-d(data):限制虚拟/数据段内存大小,与 mmap 数量无直接关系; -
vm.max_map_count:专控mmap() 调用可创建的独立映射区数量,是独立内核 tunable。
不建议盲目设过高(如 1000000),除非确认应用真实需要;过大会略微增加内核页表管理开销,但一般影响极小。
调整完成即生效,无需重启系统。











