Во время профилирования встроенного веб-приложения я натолкнулся на следующее очень странное (по крайней мере для меня) наблюдение.
Почти все время проведено в socketRead0()
методе класса SocketInputStream
. Это неудивительно, потому что мое приложение делает работу с удаленной службой по каждому запросу. Странно, что для этого метода не только использование времени настенных часов является слишком высоким, так как время процессора тоже очень велико. Я не могу понять, почему процессорное время велико, потому что, если мое приложение ожидает ответа на удаленный сервис (что на самом деле не так быстро), для самого приложения нечего делать. Поэтому время процессора должно быть явно низким.
Несколько наблюдений:
- VisualVM в режиме выборки показывает, что метод
SocketInputStream.socketRead0()
едет до 95% времени (время работы настенных часов и); -
mpstat
(мы используем Linux как ОС) показывает около 90% времени пользователя и ~ 1-3% системного времени (остальное время простоя); - приложение, развернутое на выделенном сервере;
- удаленная служба также является веб-приложением HTTP. Среднее время отклика составляет около 100 мс. Средний размер ответа составляет около 2 КБ.
- мое приложение использует spring
RestTemplate
для непосредственного взаимодействия с удаленным сервисом, а не сSocketInputStream
.
Пока у меня есть только одна идея - может быть, это накладные расходы на вызов встроенных методов в JVM (SocketInputStream.socketRead0()
является родным)?
Как вы думаете? Есть ли другие причины для этого?