Hsperfdata user что это
кто-нибудь из вас сталкивался с тем, что ps показывает бегущий процесс java, а jps — нет?
потрейсили и выяснили, что это связанно с тем, что пропадает в неизвестность файл /tmp/hsperfdata_/, хотя java-процесс с таким pid’ом до сих пор живёт.
функциональность jps базируется именно на чтении каталогов hsperfdata_*, поэтому output этой утилиты становится невалидным
ситуацию наблюдали уже два раза, оба раза процесс жил несколько дней, сначала его файл был, потом, судя по всему, исчез .
OS: Red Hat Enterprise Linux Server release 5.1 (Tikanga)
Re: ps и jps — пропажа файла в каталоге hsperfdata
| От: | Cyberax |
| Дата: | 16.04.08 17:18 |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C0s>кто-нибудь из вас сталкивался с тем, что ps показывает бегущий процесс java, а jps — нет?
Точно живые процессы, а не зомби?
C0s>потрейсили и выяснили, что это связанно с тем, что пропадает в неизвестность файл /tmp/hsperfdata_/, хотя java-процесс с таким pid’ом до сих пор живёт.
C0s>функциональность jps базируется именно на чтении каталогов hsperfdata_*, поэтому output этой утилиты становится невалидным
C0s>ситуацию наблюдали уже два раза, оба раза процесс жил несколько дней, сначала его файл был, потом, судя по всему, исчез .
C0s>OS: Red Hat Enterprise Linux Server release 5.1 (Tikanga)
Может кто-то по cron’у чистит /tmp?
Sapienti sat!
Re[2]: ps и jps — пропажа файла в каталоге hsperfdata
| От: | C0s |
| Дата: | 16.04.08 17:28 |
| Оценка: |
Здравствуйте, Cyberax, Вы писали:
C0s>>кто-нибудь из вас сталкивался с тем, что ps показывает бегущий процесс java, а jps — нет?
C>Точно живые процессы, а не зомби?
абсолютно точно
C>Может кто-то по cron’у чистит /tmp?
я, конечно, спрошу, но тогда странно, почему-то этому кому-то не удаётся почистить hsperfdata у юзера jboss42, под которым бежит jboss
Re[3]: ps и jps — пропажа файла в каталоге hsperfdata
| От: | Cyberax |
| Дата: | 16.04.08 17:43 |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C>>Может кто-то по cron’у чистит /tmp?
C0s>я, конечно, спрошу, но тогда странно, почему-то этому кому-то не удаётся почистить hsperfdata у юзера jboss42, под которым бежит jboss
Не знаю. Попробуйте повесить inotify на /tmp и посмотреть (хотя логов от нее будет мнооооооооооого).
ru_java
кто-нибудь из вас сталкивался с тем, что ps показывает бегущий процесс java, а jps — нет?
потрейсили вызов jps и выяснили, что это связанно с тем, что пропадает в неизвестность файл /tmp/hsperfdata_/, хотя java-процесс с таким pid’ом до сих пор живёт.
функциональность jps базируется именно на чтении каталогов hsperfdata_*, поэтому output этой утилиты становится невалидным
ситуацию наблюдали уже два раза, оба раза процесс жил несколько дней, сначала его файл был, потом, судя по всему, исчез, по крайней мере, на момент анализа и трассировки jps его не было
jdk: 6 upd 5
OS: Red Hat Enterprise Linux Server release 5.1 (Tikanga)
hsperfdata
golang parser for java HotSpot virtual meachine performance data V2
hsperfdata
What’s this?
This is a golang parser for the newest V2 java HotSpot virtual machine performance data, support all platform theoretically.
What’s hsperfdata file?
It is a log directory created by JVM while running your code. By default it is created inside the tmp folder of the operating system that you are using! This directory is a part of Java Performance counter. And the file in this directory is named by the pid number of java process.
For example, if you are running a java process which pid is 1111 , the hsperfdata file is %TEMP%/hsperfdata_/1111 on windows , /tmp/hsperfdata_/1111 on linux .
You can disable creating this directory by using -XX:-UsePerfData or -XX:+PerfDisableSharedMem which is not recommended.
Used as a library
First, you should get the file path string of the hsperfdata file that you want to parser, then use ReadPerfData function to parser the hsperfdata file
There are several functions to get the path, include PerfDataPath(pid string) , PerfDataPaths(pids []string) , UserPerfDataPaths(user string) , CurrentUserPerfDataPaths() , AllPerfDataPaths() , DataPathsByProcessName(processName string) .
For how to use these functions, look at hsperfdata function documentation or you can just read the hsperfdata.go to figure out how to use them, the source code is easy to read through.
There is a demo using this project as a go library:
package main import ( "fmt" "log" "sort" "github.com/xin053/hsperfdata" ) func main() filePaths, err := hsperfdata.DataPathsByProcessName("java") if err != nil log.Fatal(err) > for pid := range filePaths entryMap, err := hsperfdata.ReadPerfData(filePaths[pid], true) if err != nil log.Fatal("open fail", err) > var keys []string for k := range entryMap keys = append(keys, k) > sort.Strings(keys) for _, key := range keys fmt.Printf("%s=%v\n", key, entryMap[key]) > > >
Used as a command
There is a demo hstat.go
build hstat yourself
# go1.12+ go build .\cmd\hstat.go # Usage: hstat pid # if you have a java process which pid is 1111, then run this hstat 1111
use the release package
download the executable from the release page, then here you go!
Want deeper?
java HotSpot virtual machine performance data structures
// perfdataHeader http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/AbstractPerfDataBufferPrologue.html // source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBufferPrologue.java type perfdataHeader struct Magic uint32 // magic number - 0xcafec0c0 ByteOrder byte // big_endian == 0, little_endian == 1 Major byte // major version numbers Minor byte // minor version numbers // ReservedByte byte // used as Accessible flag at performance data V2 > // prologue http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBufferPrologue.html // source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBufferPrologue.java type bufferPrologueV2 struct Accessible byte // Accessible flag at performance data V2 Used int32 // number of PerfData memory bytes used Overflow int32 // number of bytes of overflow ModTimestamp int64 // time stamp of the last structural modification EntryOffset int32 // offset of the first PerfDataEntry NumEntries int32 // number of allocated PerfData entries > // entryHeader http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.html // source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java type entryHeader struct EntryLength int32 // entry length in bytes NameOffset int32 // offset to entry name, relative to start of entry VectorLength int32 // length of the vector. If 0, then scalar. DataType byte // JNI field descriptor type Flags byte // miscellaneous attribute flags 0x01 - supported DataUnits byte // unit of measure attribute DataVar byte // variability attribute DataOffset int32 // offset to data item, relative to start of entry. >
You can read the source code hsperfdata.go to get more information, have a good time!
You can open a issue if you have any questions.
Attention
The newest java HotSpot virtual machine performance data structures was V2 when I wrote this code, so these data structures may change from release to release, so this parser code only support JVM performance data V2. If there is new version, please open a issue or pull request, thx.
Reference link
- http://openjdk.java.net/groups/serviceability/jvmstat/index.html
- https://github.com/tokuhirom/go-hsperfdata
- https://github.com/njwhite/telegraf/blob/master/plugins/inputs/hsperfdata/hsperfdata.go
- https://github.com/twitter/commons/blob/master/src/python/twitter/common/java/perfdata/bin/jammystat.py
- https://github.com/YaSuenag/hsbeat/blob/master/module/hotspot/hsperfdata/parser.go
License
This page was generated by GitHub Pages.
Java в контейнере — особенности эксплуатации
Java и контейнеры Linux — технологии совсем не новые, да и использовать их вместе начали отнюдь не вчера. Многие и нас имеют такой стек в промышленной эксплуатации, и вроде бы даже всё работает .
Но, если что то может пойти не так, надо ставить вопрос не «если», а «когда».
Что же может пойти не так в контейнеризованной JVM? Чтобы дать некоторые ответы на этот вопрос капнуть придётся глубоко.
Доклад будут освещены нюансы работы Linux, контейнеризации и JVM друг с другом.
Специалисты Linux смогут узнать новое о JVM, а джависты и Linux.
aragozin
October 14, 2023
More Decks by aragozin
Теория и практика нагрузочного тестирования
Мониторинг Java приложений в эпоху облаков
Разгоняем RPS вопреки всему
Чётная магия JIT компиляции
Java on Linux for Devs and Ops
SJK — Essential tool for Java plumber
SJK Example
Hitchhiker’s guide to Java Flight Recorder
Я знаю почему тормозит ваша Java
Other Decks in Technology
Agents for Amazon BedrockとAmazon Kendraを活用してRAGを構築してみた!
浮かべる心音センサ作ってみた 資料
NW-JAWS #11 re:Cap 2023 Amazon Q network trouble shooting について
Fukuoka.rb 2023 年度活動報告
BLUE PROTOCOL の AI 実装 ~企画意図をふるまいに反映させるために行ったこと~
ベクトルデータベース Astra DB / Apache Cassandra 紹介
イオングループ エンジニア向け会社紹介資料 / AEON Engineer Recruitment Deck
Metadata Management in Distributed File Systems
Beginner’s Guide to Partitioning vs. Sharding in Postgres | Claire Giordano | PGConf EU 2023
どうなる?2024年のLLM
データベース論文朝輪のススメ
ユーザーの求めているもの_株式会社コミュカル Mitz
Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
The Art of Programming — Codeland 2020
Let’s Do A Bunch of Simple Stuff to Make Websites Faster
The Straight Up «How To Draw Better» Workshop
The Power of CSS Pseudo Elements
5 minutes of I Can Smell Your CMS
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
Become a Pro
Clear Off the Table
WebSockets: Embracing the real-time Web
Transcript
Алексей Рагозин
JAVA В КОНТЕЙНЕРЕ
ОСОБЕННОСТИ
ЭКСПЛУАТАЦИИ
Кто есть кто в виртуализации?
Гипервизор – среда выполнения машинного кода в эмулируемой
среде, включая эмуляцию периферийных устройств.
Виртуальная машина – формальное описание
взаимодействия прикладной программы со средой выполнения.
Что же такое Lunix контейнер?
docker, runc, podman, crun, lxc, …
1
Мечта всех времён
Write
Once
Run
Anywhere
2
Мечта всех времён
Write Build
Once
Run
Anywhere
On any Linux
(with same arch and kernel version)
2
JVM в контейнере
JVM
Ядро Linux
Управлению памятью (heap)
Много-поточность
Кросс-платформенный API
Управлению памятью (virtual
memory)
Вытесняющая многозадачность
Сеть, файлы и прочие API
namespaces – изоляция сети,
файловой системы и пр.
3
В докладе
Память
ЦПУ
Файловая система
Диагностика JVM в условиях контейнеризации
4
Память Linux
“Плоское” адресное пространство процесса
Память организована в страницы (4k)
(Есть ещё “huge” страницы, но это другая история)
Может быть включён файл подкачки (swap)
5
Память Linux процесса
С точки зрения процесса, диапазон адресов может быть
— Reserved (SEGFAULT при попытке доступа) —
— Committed (доступ не приведён к ошибке)
Страница ещё не привязана (выделение при первом обращении)
Страница привязана
Страница в вытеснена в swap (загрузка при обращении)
Страница в copy on write режиме (копирование при попытки записи)
— File mapped
6
Память в контейнере Linux
Всё то же самое + cgroups
• Лимиты по памяти, CPU и другим ресурсам
Лимиты на память контейнера
• Resident memory (Включая отображаемые в память файлы)
• Resident + Swap memory
7
Память JVM
Куча (Heap) – основная часть
Стеки потоков – растут с числом потоков
NIO Buffers
Память “нативных” библиотек
Метаданные и JIT – проблема маленьких JVM
Накладные расходы JVM
Специфика
приложения
8
Память JVM в деталях
Java Heap
Young Gen
Old Gen
Non-Heap
JVM Memory
Native JVM Memory
Non-JVM Memory (native libraries)
-Xms/-Xmx
-Xmn
Java Process Memory
Thread Stacks -XX:ThreadStackSize per thread
NIO Direct Buffers -XX:MaxDirectMemorySize
Metaspace -XX:MaxMetaspaceSize
Compressed Class Space-XX:CompressedClassSpaceSize
Code Cache -XX:ReservedCodeCacheSize
9
Память JVM/Linux
JVM Memory
Young Gen -Xmn
Java Heap
Old Gen
-Xms/-Xmx
Native JVM Memory
Thread Stacks
-XX:ThreadStackSize per thread
NIO
Direct Buffers -XX:MaxDirectMemorySize
Metaspace
-XX:MaxMetaspaceSize
Compressed Class Space-XX:CompressedClassSpaceSize
Code Cache
-XX:ReservedCodeCacheSize
Non-Heap
Non-JVM Memory
(native libraries)
Linux process memory
Resident
Commited
Virtual
Untouched
Swapped out
10
Out of Memory in Linux
Недостаток ресурсов памяти решается OОMKiller`ом!
11
JVM в контейнере
JVM детектирует контейнер и лимиты*
Размер кучи устанавливается по лимиту на память
-XX:MaxRAMPercentage (по-умолчанию 25%)
Максимальное число GC потоков выставляется по лимиту CPU
-XX:ParallelGCThreads
* — cgroups v2 поддерживаются начиная с Java 17
12
Опция -XshowSettings
Команда
java -XshowSettings:system –version
Показывает информацию о лимитах доступную JVM
Operating System Metrics:
Provider: cgroupv1
Effective CPU Count: 2
CPU Period: 100000us
CPU Quota: 150000us
CPU Shares: -1
List of Processors, 4 total:
0 1 2 3
List of Effective Processors, 4 total:
0 1 2 3
List of Memory Nodes, 1 total:
0
List of Available Memory Nodes, 1 total:
0
Memory Limit: 1.00G
Memory Soft Limit: Unlimited
Memory & Swap Limit: 1.50G
openjdk version «17» 2021-09-14 LTS
OpenJDK Runtime Environment (build 17+35-LTS)
OpenJDK 64-Bit Server VM (build 17+35-LTS,
mixed mode)
13
Сайзинг JVM для контейнера
Типовое Java приложение
не требует настроек.
14
Сайзинг JVM для контейнера
Типовое Java приложение
не требует настроек.
(Можно выставить -XX:MaxRAMPercentage побольше)
14
Нужна ли вам память вне хипа?
Использует ли ваше приложение диск?
• Да – оставляйте запас для кэша
Нет – можно оставить настройки по-умолчанию
15
Swap или Resident memory
Управляйте лимитом на swap
Ставьте лимит на swap чуть больше чем лимит на память
При недостатке памяти приложение начнёт страдать, но
Вы увидите, что проблема с память
Если это был временный фактор у приложения есть шанс прийти в норму
Альтернатива – перезагрузка контейнера OMM killer
16
ЦПУ лимиты контейнера
CPU Limit – верхняя граница использования ЦПУ
CPU Shares – вес контейнера для планировщика в условиях недостатка ЦПУ
CPU Set – фиксированные CPU для выполнения
и прочее опции планировщика
CPU Limit может быть не целым
Лимит ЦПУ для контейнера ограничивает GC потоки
–> что ведёт к увеличение GC пауз
17
Нюансы малых лимитов ЦПУ
При лимитах меньше 1 CPU приложение может выработать ресурсы ЦПУ в “долг”
(особенно если хост не нагружен), в следствии чего контейнер будет лишён ЦПУ до
тех пор, пока среднее использование ЦПУ не уложиться в квоту.
https://github.com/robusta-dev/alert-explanations/wiki/CPUThrottlingHigh-(Prometheus-Alert)
18
T
200ms
Over quota
600ms
CPU 0.25
Файловая система
Контейнер и файловая система
“Linux контейнер – chroot на стероидах.”
Корневая системы контейнера – overlayfs или аналог
• Как правило есть лимит на размер
• Идеосинхрозии posix семантики (например переименование файлов)
Используйте “точки монтирования” для рабочих директорий и /tmp
• Более эффективное IO
• Совместное использование между контейнерами
• Простой доступ с хоста (например к дампам кучи)
19
Временные файлы JVM
-Djava.io.tmpdir=… — позволяет использовать альтернативный
путь для временных файлов
-XX:PerfDataSaveFile=… — альтернативный путь
для hsperfdata файла
20
Диагностика JVM
Работа с локальным контейнером
Типовые операции доступны из коробки
Дамп потоков – jcmd Thread.print
Дамп памяти – jcmd GC.heap_dump *
Профилирование – JDK Flight Recorder с использованием jcmd *
Графические инструменты Visual VM, Mission Control и т.п.
требуют JMX для полноценной работы!
* — Путь к дампу указывается в файловой системе контейнера!
21
Особенности JMX
JVM стандартный протокол
мониторинга/диагностики JVM.
Включается опциями
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=
-Dcom.sun.management.jmxremote.ssl=
-Dcom.sun.management.jmxremote.port=
-Dcom.sun.management.jmxremote.rmi.port=
-Djava.rmi.server.hostname=
Порт должен быть проброшен из контейнера
Адрес RMI хоста должен совпадать с внешним
адресом контейнера
22
Что делать с JMX?
Стратегии настройки JMX
Настройка JMX на публичный IP
необходимо знать IP
Настройка IP на туннельный доступ
необходимо уметь доступ к туннелю
прямой доступ к JMX работать не будет
https://blog.ragozin.info/2023/09/curse-of-jmx.html
Радикальные решения
Jolokia – JVM over HTTP
https://jolokia.org/
SJK JMX proxy
https://github.com/aragozin/jvm-tools/
(позволяет включать JMX без рестарта,
через консоль контейнера)
23
Диагностика JMX
SJK – https://github.com/aragozin/jvm-tools
sjk.jar mxping -s …
Детальная диагностика JMX хендшейка с распечаткой адресов
> java -jar sjk.jar mxping -s 127.0.0.1:34000
SJK is running on: OpenJDK 64-Bit Server VM 25.275-b01 (BellSoft)
Java home: C:\Java\jdk1.8.0_275+1_bellsoft_x64\jre
Try to connect via TLS
Establishing connection to 127.0.0.1:34000
Failed to connect using TLS: java.rmi.ConnectIOException: error during JRMP connection establishment;
nested exception is:
javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
Try to use plain socket
Establishing connection to 127.0.0.1:34000
Establishing connection to 192.168.100.1:34000
Remote VM: OpenJDK 64-Bit Server VM 25.275-b01 (BellSoft)
24
Стоит ли JMX этой боли? 25
Мониторинг
Не стоит
Prometheus JMX Exporter, Sprinf Micrometer и п.р.
Диагностика/профилирование
Да, если вы хотите использовать VisualVM, MisssionControl и п.р.
Заключение
Заключение
Позитив
Современная JVM неплохо адаптировалась к реалиям контейнеров
-XX:MaxRAMPercentage – удобный способ сайзинга кучи относительно
лимитов контейнера
jcmd позволяет работать с локально запущенными контейнерами
Негатив
JMX и диагностика – очень сложна в настройке
Новые сценарии отказов (превышение лимитов)
Когнитивный барьер: нужно учить cgroup и очередные диалекты yaml
26