Использование процессора Java + JDBC - PullRequest
3 голосов
/ 11 апреля 2011

При тестировании моего веб-приложения под нагрузкой я получил следующую выдержку 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-запрос и ожидает, скажем, 10ms ответа.Эти 10 мс явно учитываются как /usr/sbin/mysqld загрузка ЦП.Затем поток java возобновляет свою работу и завершает свою работу, потребляя еще 20 мс и общее время выполнения 5 + 10 + 20 = 30 мс.

И вопрос новичка таков: не думаете ли вы, что эти дБ 10 мс считаются дважды: один раз как поток Java, ожидающий, пока БД обработает запрос, и второй раз как само использование ЦП базы данных?Что я здесь не понимаю?

1 Ответ

4 голосов
/ 11 апреля 2011

Когда процесс просто ожидает в сокете, он обычно не использует значительное количество ЦП. По сути, ядро ​​знает, что оно находится в состоянии ожидания, и не будет планировать его запуск - за исключением мелких вещей, таких как обработка сигналов, которые можно использовать, например, регулярно запускать сборщик мусора.

(Хорошо, если нужно собрать много мусора, эта «мелочь» может быть не такой уж маленькой).

...