Использование процессора Java JDBC

#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. Спасибо, я должен был сам догадаться, что процессорное время учитывается на гораздо более мелкозернистом уровне. Очевидно, что это недостаток отсутствия опыта в низкоуровневом программировании.