Господа, подскажите направление поиска - исследую проблему, в определенном тесте система при большой нагрузке на опредленной ноде(на других не воспроизводится) происходит GC пауза 400мс, что для нашего проекта не допустимо.
копание показало следующее:
GC
(CMS Final Remark)
[YG occupancy: 142247 K (294912 K)]
2019-03-13T07:38:30.656-0700: 24252.576:
[Rescan (parallel) , 0.0216770 secs]
2019-03-13T07:38:30.677-0700: 24252.598:
[weak refs processing, 0.0028353 secs]
2019-03-13T07:38:30.680-0700: 24252.601:
[class unloading, 0.3232543 secs]
2019-03-13T07:38:31.004-0700: 24252.924:
[scrub symbol table, 0.0371301 secs]
2019-03-13T07:38:31.041-0700: 24252.961:
[scrub string table, 0.0126352 secs]
[1 CMS-remark: 2062947K(4792320K)] 2205195K(5087232K), 0.3986822 secs]
[Times: user=0.63 sys=0.01, real=0.40 secs]
сначала я решил, что мб классов много нагрузилось, и теперь их долго выгружать, но обратил внимание на факты:
1. во первых порядок времени исполнения других шагов несоизмеримо мал, по сравнению с выгрузкой классов
2. классы выгружаются из метаспейса, а он менеджется операционной системой, в нашем случае это линукс(не Солярис)
3. системные вызовы выполнились за сотую долю секунду, а вот реальное время исполнения(вместе с блокировками и прочим) - уже 400мс, - такие различия в порядках времени исполнения наталкивают на возможную мысль, что поток GC был заблокирован операционной системой какое то время.
еще немного покапав, я натолкнулся на аткую вещь как huge pages в Linux, и что такие проблемы бывают если в JVM передан флаг -XX+UseLargePages, но не передан флаг -XX:+UseLargePagesInMetaspace(начиная с java8)
но проблема в том, что -XX+UseLargePages у нас не передается - так что я в тупике