Назад | Перейти на главную страницу

Высокая нагрузка без объяснения причин

У меня очень большая нагрузка на машину, и я не знаю, что за это отвечает и как это выяснить.

На машине работает сервер приложений jboss и mysql. Вот топ от пользователя в пиковое время:

top - 16:23:01 up 101 days,  6:50,  1 user,  load average: 23.42, 21.53, 24.73
Tasks:   9 total,   1 running,   8 sleeping,   0 stopped,   0 zombie
Cpu(s): 17.2%us,  1.6%sy,  0.0%ni, 80.4%id,  0.1%wa,  0.1%hi,  0.7%si,  0.0%st
Mem:  16440784k total, 16263720k used,   177064k free,   151916k buffers
Swap: 16780872k total,    30428k used, 16750444k free,  8963648k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
27344 b         40   0 16.0g 6.5g  14m S  169 41.7   1184:09 java
 6047 b         40   0 11484 1232 1228 S    0  0.0   0:00.01 mysqld_safe
 6192 b         40   0  604m 182m 4696 S    0  1.1  93:30.40 mysqld
 7948 b         40   0 84036 1968 1176 S    0  0.0   0:00.07 sshd
 7949 b         40   0 14004 2900 1608 S    0  0.0   0:00.03 bash
 7975 b         40   0  8604 1044  840 S    0  0.0   0:00.44 top

Использование процессора Java-процессом нормальное. Пики появляются только тогда, когда я развернул определенное веб-приложение. Мог ли полученный сетевой трафик увеличить нагрузку так, что я не вижу его в топе?

Так что средняя нагрузка на самом деле достаточно сложная, но я понимаю, что в основном это то, что ждет в очереди выполнения. Так что я предполагаю, что у вас могут быть вещи, ожидающие ввода-вывода. Вот хороший украденный фрагмент чтобы увидеть, что ждет:

ps -eo stat,pid,user,command | egrep "^STAT|^D|^R"

D : Uninterruptible sleep (usually IO)
R : Running or runnable (on run queue)

Как уже отмечалось, iostat также хорошо работает, чтобы узнать, вероятно ли это диск.

Сложно сказать по одному снимку сверху. Требуется дополнительная информация.

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

Всегда ли значение IOWait (% wa) низкое или этот снимок не является типичным с точки зрения IOWait?

vmstat 1 покажет нам вашу память, т. е. со временем.

iostat -x 1 также покажет нам, на какой диск / разделы выполняется запись.

На хостах, где веб-приложения и базы данных размещаются в одном и том же блоке, я не раз видел, что журналы для веб-приложения и каталога данных баз данных часто оказываются на одном диске / разделе / ​​файловой системе, что может вызвать раздор. Ряд дистрибутивов, которые я видел, помещают данные mysql в / var / lib / mysql и веб-приложения tomcat в / var / lib / tomcat / webapps и, конечно же, журналы в / var / log / tomcat.

Т.е. ваше веб-приложение принимает много обращений и пытается записать эти обращения в раздел, но в то же время он пытается читать данные для БД из того же раздела.

Я обычно считаю использование времени ожидания и времени обслуживания наиболее полезной статистикой от iostat, если я подозреваю наличие разногласий.

Быстрый и грязный способ узнать - просто переместить местоположение журнала tomcat на другой раздел / диск, если это возможно.

обычный ответ в таких случаях - начните собирать статистику с Мунин или кактусы, потому что теперь ты изрядно ослеп. вещи для сюжета:

  • io statistics - чтение / запись на диск
  • потребление памяти, чтение и запись из свопа
  • количество процессов и количество потоков [может ли быть, что java по какой-то причине порождает их тонны в этом конкретном сценарии? ]
  • количество открытых TCP-сокетов, открытых файловых дескрипторов [возможно ...]
  • средняя нагрузка
  • использование процессора с обычным nice / iowait / user / softirq и т. д.
  • для tomcat вы также можете получить [вероятно] неплохую java-статистику - размер кучи, размер PermGen / Survivor / Tenured, количество обращений в секунду

В нашем случае это было вызвано тем, что базовый сервер Ubuntu запустил do-release-upgrade, но не был перезагружен после этого. Глядя на дампы виртуальных машин, оказалось, что что-то странное с библиотеками ОС сделала сама виртуальная машина, а не программное обеспечение поверх нее. Перезагрузка ОС устранила проблему.