У нас возникла странная проблема с нашей инфраструктурой KVM Ubuntu 10.04, когда один из двух веб-серверов vm периодически выходит из строя, с постоянно высокой нагрузкой, даже если мы перезапускаем приложения. (единственное, что использует какие-либо значительные системные ресурсы внутри виртуальной машины). Если мы полностью остановим демон веб-сервера, загрузка действительно упадет, но она вернется на высокий уровень, когда мы снова запустим его. Перезагрузка гостевой виртуальной машины устраняет проблему, и она будет работать нормально в течение нескольких дней, прежде чем проблема вернется.
Недавно мы установили «perf» на гипервизор и заметили, что в период высокой нагрузки функция ядра «__ticket_spinlock» использует большой процент (30-60%) ЦП по сравнению с менее 1% при нормальной работе. Перезагрузка виртуальной машины с высокой нагрузкой проясняет это. Проведя некоторое исследование для понимания спин-блокировок и спин-блокировок билетов, мы выдвинули гипотезу о том, что виртуальная машина, испытывающая высокую нагрузку, ожидает блокировки, удерживаемой какой-либо другой виртуальной машиной, и по какой-то причине не получает ее.
Мы обнаружили разницу (среди многих) между гипервизорами, у которых есть эта проблема, и гипервизорами CentOS из предыдущего развертывания, которые настроены аналогично, но не имеют. Ядро для гипервизора Ubuntu 10.04 скомпилировано с использованием другого IOScheduler по умолчанию (крайний срок), а preempt_volvention выключен. Мы синхронизировали эти конфигурации между двумя сайтами и ждем, чтобы увидеть, не сойдет ли снова виртуальная машина на обновленном гипервизоре.
** Изменить: нам так и не удалось найти основную причину, но после перехода на Ubuntu 14.04 мы больше не видели проблемы.
Есть ли способ определить, какое устройство ожидает процесс Linux, когда он находится в спин-блокировке / спин-блокировке билета? Есть ли способ определить, какой процесс Linux заблокировал конкретное устройство?