我们已将 Elastic Search JVM 选项配置/etc/elasticsearch/jvm.options
为使用固定堆大小-Xms512m -Xmx512m
检查 Elastic Search 进程时可以确认此功能正在运行:
然而您会注意到它仍然使用 835M 内存。
如果我们用 ES 检查实际使用的堆大小:
root: curl -sS -XGET "localhost:9200/_cat/nodes?h=heap*&v"
heap.current heap.percent heap.max
276.1mb 55 494.9mb
它实际上只使用了 276MB 的堆内存 -那么另外的559MB具体用在哪儿呢?我们担心它会导致很多交换/分页问题,特别是因为 VIRT 列的大小为 4GB(但我被告知不用担心该列,尽管对我来说它似乎是一个奇怪的高数字)
我们还使用 mlockall 选项禁用了 Elastic Search 的交换,可以通过以下方式确认:
root:~# curl -s localhost:9200/_nodes?pretty|grep mlock
"mlockall" : true
然而它似乎仍在交换:
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
java 128592 kB
我的问题是:
- 我们可以做些什么来减少 Elastic Search 消耗的内存大小以确保它固定在 512MB 或尽可能接近这个值?
- 确保已禁用交换
- 减小 VIRT 列的大小(或者这真的不值得担心?)
答案1
-Xmx512m
此设置仅限制 Elasticsearch 应用程序(JVM 内部)使用的 RAM,而不会限制 JVM 开销所需的 RAM 量。mlockall 也是如此
这就是为什么 Elastic 建议使用 -Xmx 将 50% 的可用 RAM(在操作系统和其他运行软件之后)用于您的 Elasticsearch 应用程序。
关于此内容的好文章:为什么我的 Java 进程比 Xmx 消耗更多的内存
答案2
我建议你查看有关堆大小
无论如何,我认为绝对建议不要为生产服务器上的 elasticsearch 服务分配少于 1GB 的内存。