Я профилирую Java (OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
) приложение, которое в основном состоит из I/O
файла в сокет. Данные считываются из файла, архивируются на лету и отправляются в сокет.
Я сделал несколько выборок из CPU-циклов с помощью perf и получил следующую картинку:
То, что я заметил, было sys_futex
, потребляющее большую часть ЦП (точно _raw_spin_unlock_irqrestore
- 11,44%), и так называемый символ _ZN12GCTaskThread3runEnv
, который, как я догадался из его названия, связан с GC
.
ВОПРОСЫ:
Как узнать, за что отвечает этот символ _ZN12GCTaskThread3runEnv
?
Почему futex
es (futex_wait
, futex_wake
) являются самыми трудоемкими? Я ожидал, что вид copy_user_enhanced_fast_string
из-за высокой активности I/O
будет на вершине, но в показанных примерах это займет всего 0.56%
.
AFAIK _raw_spin_unlock_irqstore
означает ожидание события ввода-вывода, но почему он потребляет больше ресурсов ЦП, чем сам ввод-вывод?