ElasticSearch系列(七)es内存大小设置
近期发现线上es服务内存告警,使用率超过90%,需要处理,下面记录下处理流程。
1. 查看进程内存占用情况
使用top命名,可以显示进程列表,
然后键盘按下M键,可以按照内存降序,结果如下:
elastic+就是es的进程。
2.查看es配置的内存大小
使用 ps -ef | grep java (或者按照上面的进程号找),显示java进程,如下是es进程:
可以看到es进程启动时设置的java堆内存为-Xms5g -Xmx-5g,也就是5g,这两个参数一般建议设置成一样。
修改之前,这里设置的是6g,物理总内存为8g,所以光es进程就占用了75%;有个疑问是,75%而已,为什么实际使用内存到了90%呢?服务器上也没有安装其他占用内存较大的服务。
原因:这是因为,es内核使用lucene,lucene本身是单独占用内存的,并且占用的还不少,官方建议设置es内存,大小为物理内存的一半,剩下的一半留给lucene。
由此看来,之前线上把es内存设置为6g(物理内存8g)并不合理,修改为4g比较合适。
另外,es官方提了api查询集群各个节点的状态,比如 GET /_cat/nodes ,
http://localhosts:9002/_cat/nodes?v&h=http,version,jdk,disk.total,disk.used,disk.avail,disk.used_percent,heap.current,heap.percent,heap.max,ram.current,ram.percent,ram.max,master
详见官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-nodes.html
3.如何修改es内存
有网上说,设置es内存的方法为:
设置环境变量:export ES_HEAP_SIZE=4g
或者,在程序启动的时候把内存大小传递给它:/bin/elasticsearch -Xmx4g -Xms4g ;
但是我实际操作后,发现并没有生效,可能是es版本的原因吧,我目前线上使用的es版本为5.6.4。
正确设置内存的方式:修改jvm.options文件:
此文件一般在安装目录下,或者使用 whereis elasticsearch 命令,列出es相关的文件路径,都找一找。
打开此文件,其中有如下内容:
上面默认是注释掉的,默认使用1g内存;我们线上设置了6g,现在我们修改为4g,重启es集群即可。