我正在通过
启动ElasticSearchecho "export ES_HEAP_SIZE = 4096" >> /root/setenv
echo "export ES_MAX_MEM = 4096" >> /root/setenv
echo "export ES_MAX_MEM = 4096" >> /root/setenv
# finally, we can start the app
echo 'Starting ElasticSearch...'
bin/elasticsearch -Xmx4g -Xms4g
然而,在没有时间(20分钟)之后,它变得没有反应,显然是由于HeapDumpOnOutOfMemoryError
......
[root@ip-***** api]# ps -ax | grep elasticsearch
6225 ? SLl 5:35 java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.path.home=/root/elasticsearch/elasticsearch-0.20.3 -cp :/root/elasticsearch/elasticsearch-0.20.3/lib/elasticsearch-0.20.3.jar:/root/elasticsearch/elasticsearch-0.20.3/lib/*:/root/elasticsearch/elasticsearch-0.20.3/lib/sigar/* -Xmx4g -Xms4g org.elasticsearch.bootstrap.ElasticSearch
编辑 - 我刚注意到这里输出的-Xms大小只有256米,尽管在启动时超过4g。我误解了什么吗?
FWIW,我在运行CentOS和Java v1.6.0_14-b08的Amazon EC2(m1.large instances => 8GB RAM)上
答案 0 :(得分:4)
首先,设置ES_HEAP_SIZE
不会帮助您自行防止内存错误。 Elasticsearch使用的内存量取决于您执行的查询类型:是否使用分面,排序,过滤,有多少字段,这些字段有多大,基数是什么等等。
其次,最好使用ES_INCLUDE
脚本或service wrapper,而不是将命令行上所需的所有选项传递给elasticsearch
脚本。
第三,当您正确设置ES_HEAP_SIZE
环境变量时,您无需将-X
选项传递给 elasticsearch 脚本。实际上,这些选项没有任何效果 - 脚本不会将它们传递给Java。使用ES_HEAP_SIZE
变量来控制内存,并使用ES_JAVA_OPTIONS
来控制要传递给Java的其他变量。