2020 年 2 月 28 日之后,我们发现用于处理日志(具有日期字段)的 Elasticsearch 集群性能不佳。
我们一直使用 HotSpot(TM) 64 位服务器 VM 18.9(构建 11.0.3+12-LTS)来运行 Elasticsearch 集群。
jstack & JVM 去优化日志导致我们对 joda-time 的闰年检查进行去优化(reason=unstable_if):
jstack 显示 elasticsearch 的 [bulk] 线程可运行,但实际上它们被阻塞(根据 gstack)因为 BasicGJChronology.java:185 和 BasicGJChronology.java:187 处的 JVM 去优化?这两行都是闰年检查。
jstack:
"elasticsearch[xxx][bulk][T#19]" #312 daemon prio=5 os_prio=0 cpu=1972224606.34ms elapsed=12348671.96s tid=0x00007f90a0006800 nid=0xdd41 runnable [0x00007f8f170ee000]
java.lang.Thread.State: RUNNABLE
at org.joda.time.chrono.BasicGJChronology.setYear(BasicGJChronology.java:185)
at org.joda.time.chrono.BasicYearDateTimeField.setExtended(BasicYearDateTimeField.java:92)
at org.joda.time.format.DateTimeParserBucket$SavedField.set(DateTimeParserBucket.java:568)
at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:451)
at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:182)
at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826)
at org.elasticsearch.index.mapper.DateFieldMapper$DateFieldType.parse(DateFieldMapper.java:248)
at org.elasticsearch.index.mapper.DateFieldMapper.parseCreateField(DateFieldMapper.java:456)
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:297)
--
"elasticsearch[xxx][bulk][T#20]" #315 daemon prio=5 os_prio=0 cpu=1975796442.21ms elapsed=12348662.71s tid=0x00007f92f4048000 nid=0xdd83 runnable …Run Code Online (Sandbox Code Playgroud)