#java #multithreading #operating-system
#java #многопоточность #операционная система
Вопрос:
Во время тестирования моего веб-приложения под нагрузкой я получил следующий top
отрывок под Linux:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
3964 nobody 20 0 4965m 622m 6048 S 8.5 11.0 6:02.49 java
1985 mysql 20 0 294m 125m 3804 S 2.1 2.2 0:05.39 /usr/sbin/mysqld
Мне нужно объяснение в %CPU
столбце java. Насколько я понимаю, во время веб-запроса один из java
потоков выполняет некоторую чистую Java-логику, потребляя часть процессорного времени (пусть это будет 5 мс). Затем он подключается к базе данных через JDBC, отправляет некоторый sql-запрос и ожидает ответа, скажем, 10 мс. Эти 10 мс, очевидно, учитываются как /usr/sbin/mysqld
загрузка процессора. Затем java
поток возобновляет свою работу и завершается, потребляя еще 20 мс и составляя 5 10 20 = 30 мс общего времени выполнения.
И вопрос новичка: не кажется ли вам, что эти 10 мс, связанные с БД, учитываются дважды: один раз как поток java, ожидающий, пока БД обработает запрос, и второй раз как само использование ЦП базы данных? Чего я здесь не понимаю?
Ответ №1:
Когда процесс просто ожидает сокет, он обычно не будет использовать значительные объемы ЦП. В принципе, ядро знает, что оно находится в состоянии ожидания, и не будет планировать его запуск — за исключением таких мелочей, как обработка сигналов, которые можно использовать, например, для регулярного запуска сборщика мусора.
(Хорошо, если нужно собрать много мусора, эта «мелочь» может оказаться не такой уж маленькой.)
Комментарии:
1. Спасибо, я должен был сам догадаться, что процессорное время учитывается на гораздо более мелкозернистом уровне. Очевидно, что это недостаток отсутствия опыта в низкоуровневом программировании.