无法更改elasticsearch的vm.max_map_count

史前

我在CentOS 6.5上运行elasticsearch和SugarCRM7。 我每天都面临同样的问题:java outOfMemory错误。 发生这种情况是因为vm.max_map_count的值较小,只有在build议使用262144的情况下,才会出现65530。

问题

问题是,vm.max_map_count似乎是不可改变的:

  1. 在根目录下更改

    sudo sysctl -w vm.max_map_count=262144 

    回报

    错误:密钥“vm.max_map_count”上的权限被拒绝

     ps aux | grep java 

    只返回grep进程

  2. 改变elasticsearch启动

     sudo service elasticsearch start 

    也返回错误

    错误:密钥“vm.max_map_count”上的权限被拒绝

    启动elasticsearch:[确定]

  3. 通过文件手动更改(脏脏的黑客攻击):

     sudo vi /proc/sys/vm/max_map_count 

    也不工作:

    “/ proc / sys / vm / max_map_count”[只读] 1L,6C

    – 插入 – W10:警告:更改只读文件

    E45:设置“readonly”选项(add!覆盖)

    “/ proc / sys / vm / max_map_count”E212:无法打开文件进行写入

     ls -la /proc/sys/vm/ | grep max_map_count 

    返回

    -rw-r – r– 1 root root 0 4月10日09:36 max_map_count

    (但我猜这可能是正常的Linux谈论/ proc目录)

那么我怎样才能改变这个variables的值? 每晚重新开始elasticsearch不是一个好主意…或者至less可能有人知道为什么会发生这种错误?

你几乎就在那里,无论是虚拟机还是物理机,这些设置总是可以改变的。

我会展示3种方法。

一些前置信息:

1)如果可能,最好以root身份执行。

2) / proc on unix不是一个真正的文件系统,它是一个内存内核文件系统,但它看起来像一个普通的磁盘文件系统。 你可以把它称为'假文件系统'或'特殊文件系统',你不能用vi或其他编辑器编辑这些假文件,因为它们不是文件,只是看起来像文件。 几年前我也遇到了同样的问题。

但是改变它们的价值很简单,只需要另一种“机制”来编辑它们。

我会解释一下:首先,必须是root:(sudo在某些发行版中可以工作,但不会像其他发行版一样尝试,第一种方法是通用的,适用于任何Linux,macOS或任何基于Unix的希望你有机会获得root密码。

在提示符下继续:

  $ su root 

inputroot密码。

现在你是root了,让我们来检查/ proc / sys / vm / max_map_count的当前值

  $ cat /proc/sys/vm/max_map_count 65536 

让我们改变它:

  echo 262144 > /proc/sys/vm/max_map_count 

我们来validation一下:

  cat /proc/sys/vm/max_map_count 262144 

完成! 它已经被应用和function。 通过更改/ proc下任何伪文件的值,设置立即变为活动状态。 但是在重新启动之后它们不会持续。 您可以使用弹性值或任何其他应用程序或系统度量标准评估值并衡量性能变化。 去调整你的系统,写在一些纸上的价值观,保持最佳值。 任何错误,重新启动,他们都将回到原来的价值,并重新开始,直到所有希望的价值是最佳的。 / proc下有很多磁盘和内存可通过参数。 如果你调好他们(有时间),他们会产生巨大的差异和性能上的提升。 你走对了。

满意后,让他们永久:

第一种方法:

使用/etc/rc.local

  vi /etc/rc.local 

把所有的参数放在rc.local文件中,例如:

  echo 220000000 > /proc/sys/vm/dirty_background_bytes echo 320000000 > /proc/sys/vm/dirty_bytes echo 0 > /proc/sys/vm/dirty_background_ratio echo 0 > /proc/sys/vm/dirty_ratio echo 500 > /proc/sys/vm/dirty_writeback_centisecs echo 4500 > /proc/sys/vm/dirty_expire_centisecs echo 1 > /proc/sys/net/ipv4/tcp_rfc1337 echo 10 > /proc/sys/vm/swappiness echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time echo 0 > /proc/sys/vm/zone_reclaim_mode echo deadline > /sys/block/sda/queue/scheduler echo 8 > /sys/class/block/sda/queue/read_ahead_kb echo 1048575 > /proc/sys/vm/max_map_count 

退出vi编辑器保存文件。

这些参数将在每次重新启动时设置,在所有init服务启动之后,就在login提示符显示之前。

/etc/rc.local文件在所有启动linux服务之后执行,如果elasticsearch作为服务启动之前它可能不起作用,但是如果将来您需要另一个安装程序,这个方法可能是有用的,或者你可以像这样使用通过把它们放到你的elasticsearch init脚本里面,因为init脚本是以root身份运行的,所以它和init脚本里面使用的是相同的语法)

您现在也可以复制它们并粘贴它们以进行即时更改。 上面的参数是有效的,调整和运行在我的apache cassandra服务器上。 如果你愿意的话,试试把它们作为调整你的起点。

第二种方法,使他们永久:

现在参数将在Linux上的任何启动服务之前设置。

编辑/etc/sysctl.conf ,把里面的参数

  vm.max_map_count=1048575 vm.zone_reclaim_mode=0 vm.dirty_background_bytes=220000000 vm.dirty_background_ratio=0 vm.dirty_bytes=320000000 vm.dirty_ratio=0 vm.swappiness=10 

继续与其他人一起,保存/etc/sysctl.conf ,重新启动服务器以应用更改,或执行: sysctl -p应用更改而不重新引导。 它们将在重新启动后保持不变。

以上两种方法是最常见的。 还有一个,它可能适用于你,这是通过使用sudo ,就像你在做:

代替:

  sudo sysctl -w vm.max_map_count=262144 

尝试:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count 

它在Ubuntu上运行。

校验:

  user@naos:~$ cat /proc/sys/vm/max_map_count 262144 

希望我已经有所帮助了,至less通过给出3个不同的选项来处理这个问题,因为它已经快一年多了。

问候,拉斐尔普拉多

我认为你的“虚拟机”实际上是一个OpenVZ容器(你可以通过运行virt-what来validation)。

在这种情况下,您不能更改vm.max_map_count sysctl或许多其他。 值是固定的。

这是有关elasticsearch的一个众所周知的问题( issue#4978 )。 这不仅仅是Elasticsearch。 众所周知,Java应用程序在各种OpenVZ提供程序上performance不佳,主要是因为主机往往调整得不好,对此无能为力。 关于这个问题的一位评论者恰恰回应了我的build议:

joshuajonah评论2015年10月20日
疯了吧。 我想我会换成KVM VPS。