elasticsearch在docker中的堆内存大小设置

首先查找官方文档,es默认的jvm堆内存大小是docker容器分配内存的一半。

在我机器上docker容器使用的内存上限是24.99G,es当仁不让的用掉了一半,再加上其它内存使用,便高达13G。

查看内存设置

1
2
3
$> docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
daf5ca2e87dc elasticsearch 0.79% 13.33GiB / 24.99GiB 3.31% 45.2MB / 281kB 0B / 0B 88

要修改它有三个方法:

  1. 设置docker容器内存上限

    1
    2
    3
    4
    5
    6
    7
    8
    docker run `
    -d `
    --name elasticsearch `
    -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 `
    --memory="1g" `
    --memory-swap="1g" `
    -e "discovery.type=single-node" `
    docker.elastic.co/elasticsearch/elasticsearch:7.16.2
  2. 使用环境变量

这种方式会覆盖掉JVM Options,不建议使用在发布环境下。

1
2
3
4
5
6
7
docker run \
-d \
--name elasticsearch \
-p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
docker.elastic.co/elasticsearch/elasticsearch:7.16.2
  1. 使用jvm.options.d

在容器中放一个jvm.options设置文件在/usr/share/elasticsearch/config/jvm.options.d目录,设置

1
2
-Xms1g
-Xmx1g

来控制内存。

但elasticsearch的docker image没有使用服务,而是在启动时就直接运行bin/elasticsearch,所以无法重启服务让新设置生效和,需要bind mount jvm.options.d创建新容器来达成目的。

1
2
3
4
5
6
7
docker run `
-d `
--name elasticsearch `
-p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 `
--mount type=bind,source=$PWD/jvm.options.d,target=/usr/share/elasticsearch/config/jvm.options.d `
-e "discovery.type=single-node" `
docker.elastic.co/elasticsearch/elasticsearch:7.16.2

注意
如果host的./jvm.options不存在,docker会创建一个名为jvm.options的空目录,并不会运行报错。