Elasticsearch 7.x 的 JVM 內存配置(qbit)

官方文檔摘要

jvm.options

  • 通常狀況下並不須要更改 JVM 的配置項。
  • 最可能更改的 JVM 配置是堆大小(heap size)
  • 可使用 jvm.options 配置文件或 ES_JAVA_OPTS 環境變量更改 JVM 配置
  • 首選經過 jvm.options 更改配置

heap size

  • Elasticsearch 經過 jvm.options 中的 Xms 和 Xmx 設置堆的大小
  • 應該講 Xms 和 Xmx 設爲相同的值
-Xms8g 
-Xmx8g
  • Xms 和 Xmx 的值不該超過物理內存的 50%,由於 Elasticsearch 在堆內存以外還須要將內存用於其餘。例如 Elasticsearch 須要利用堆外內存來進行網絡通訊,依賴操做系統的文件系統緩存來有效訪問文件,而 JVM 自己也須要一些內存。
  • CompressedOops(compressed ordinary object pointers,壓縮普通對象指針)
(0, 2GB]      Compressed Oops mode: 32-bit
[2GB, 26GB]   Compressed Oops mode: Zero based,26G不是確切值,視系統而定
(26GB, 32GB)  Compressed Oops mode: Non-zero disjoint base,32G不是確切值,視系統而定
[32GB, )      CompressedOops 失效,32G不是確切值,視系統而定

CompressedOops

  • 若是設置的堆內存大小的值低於閾值(CompressedOops,32G),在啓動 ES 時在日誌中會顯示相似以下行
$ bin/elasticsearch
heap size [1.9gb], compressed ordinary object pointers [true]

kibana

查看 jdk 版本

GET _cat/nodes?h=jdk&v
jdk
15.0.1

查看 jvm 堆內存配置

  • 命令
GET _cat/nodes?h=heap*&v
  • 輸出示例
heap.current heap.percent heap.max
       1.4gb            4   30.3gb
       1.1gb            3   30.3gb
     826.7mb            2   30.3gb

操做步驟

檢查 CompressedOops 閾值

$ ll
total 572
drwxr-xr-x  9 qbit qbit   4096 Mar 26 14:36 ./
drwxrwxr-x  3 qbit qbit   4096 May  8 09:50 ../
drwxr-xr-x  2 qbit qbit   4096 Mar 26 14:36 bin/
drwxr-xr-x  2 qbit qbit   4096 Mar 26 14:36 config/
drwxr-xr-x  9 qbit qbit   4096 Mar 26 14:36 jdk/
drwxr-xr-x  3 qbit qbit   4096 Mar 26 14:36 lib/
-rw-r--r--  1 qbit qbit  13675 Mar 26 14:28 LICENSE.txt
drwxr-xr-x  2 qbit qbit   4096 Mar 26 14:36 logs/
drwxr-xr-x 38 qbit qbit   4096 Mar 26 14:37 modules/
-rw-r--r--  1 qbit qbit 523209 Mar 26 14:36 NOTICE.txt
drwxr-xr-x  2 qbit qbit   4096 Mar 26 14:36 plugins/
-rw-r--r--  1 qbit qbit   8164 Mar 26 14:28 README.asciidoc
下面測試的粒度爲 GB,也能夠到 MB
# CompressedOops 閾值
# 32 G,false 表示超過了閾值
$ ./jdk/bin/java -Xmx32g -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
    bool UseCompressedOops    = false    {lp64_product}
# 31G,true 表示在閾值以內
$ ./jdk/bin/java -Xmx31g -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
    bool UseCompressedOops    := true    {lp64_product}
# zero based Compressed Oops 閾值
# 31G,Non-zero
./jdk/bin/java  -server -Xms31G -Xmx31G -XX:+UnlockDiagnosticVMOptions -Xlog:gc+heap+coops=info -version
[0.134s][info][gc,heap,coops] Heap address: 0x0000001000800000, size: 31744 MB, Compressed Oops mode: Non-zero disjoint base: 0x0000001000000000, Oop shift amount: 3
openjdk 13.0.2 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
# 30G,Zero based
./jdk/bin/java  -server -Xms30G -Xmx30G -XX:+UnlockDiagnosticVMOptions -Xlog:gc+heap+coops=info -version
[0.128s][info][gc,heap,coops] Heap address: 0x0000000080000000, size: 30720 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.1+9, mixed mode, sharing)

肯定堆內存大小的值

# 公式
heapSize = math.floor(RAM/2)  # 物理內存的 50% 下取整
if heapSize > threshold:      # 若是大於閾值,則設爲等於(或略小於閾值大小)
    heapSize = threshold
# 例一
機器情況: 物理內存 128G,CompressedOops 閾值爲 31 G,
         zero based Compressed Oops 閾值爲 30 G
配置建議: 啓動兩個實例,堆內存大小設爲 30G
# 例二(最佳實踐)
機器情況: 物理內存 64G,CompressedOops 閾值爲 31 G,
         zero based Compressed Oops 閾值爲 30 G
配置建議: 啓動一個實例,堆內存大小設爲 30G
# 例三
機器情況: 物理內存 32G,CompressedOops 閾值爲 31 G
         zero based Compressed Oops 閾值爲 30 G
配置建議: 啓動一個實例,堆內存大小設爲 16G

啓動檢查

  • 查看堆內存
cat ./config/jvm.options | grep '^\-Xm'
-Xms4g
-Xmx4g
$ ./bin/elasticsearch
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[2020-05-08T10:00:11,381][INFO ][o.e.e.NodeEnvironment    ] [qhost] using [1] data paths, ......
[2020-05-08T10:00:11,383][INFO ][o.e.e.NodeEnvironment    ] [qhost] heap size [3.9gb], compressed ordinary object pointers [true]
[2020-05-08T10:00:11,481][INFO ][o.e.n.Node               ] [qhost] node name [qhost], node ID ......
[2020-05-08T10:00:11,481][INFO ][o.e.n.Node               ] [qhost] version[7.6.2], pid[38912], ......
...........................
# 從 heap size [3.9gb], compressed ordinary object pointers [true] 行能夠看到,
# 對象指針壓縮是啓用的
  • 查看物理內存
# RSS(Resident Set Size)即爲佔用物理內存大小,單位爲 KB
ps aux | head -1; ps aux | grep Elasticsearch
USER    PID %CPU %MEM    VSZ   RSS      TTY STAT START   TIME COMMAND
qbit  41699  1.2 44.6 10100728 4545928 pts/0 Sl+ 11:40   0:37  ...bootstrap.Elasticsearch

測試案例

這個案例中,分配 32g 比 31g 能建立的對象少了 50%
587889429/385481085 ≈ 1.525

35GB < 32GB

這個案例中,48g 才基本達到 31g 的效果

48GB=31GB

本文出自 qbit snap
相關文章
相關標籤/搜索