Я администрирую большой сервер LAMP с несколькими тысячами пользователей. Примерно неделю назад все притормозилось, и единственное, что я вижу, Задержка ввода-вывода увеличена резко. Опыт пользователей медленный страница загружается, и у меня несколько секунд зависания, когда я хочу сохранить файл.
Операционная система - CloudLinux, ядро 2.6.32. Вдобавок к этому замечательная комбинация CageFS и cPanel. Оборудование - IBM X3630 M3 с 11 дисками в аппаратном RAID 5 + запасной диск.
Я провел много экспериментов. Сначала я побежал iotop -oaP
чтобы увидеть, что делает большую пропускную способность ввода-вывода. Все процессы, которые оказались на верхних позициях, являются обычными сервисами LAMP. Похоже, что они выполняли не намного больше операций ввода-вывода, чем следовало бы, хотя я не знаю идеальной или нормальной нагрузки на сервер. К сожалению, я не могу получить доступ к информации sysstat с тех времен, когда задержка ввода-вывода была нормальной, только графики munin. С другой стороны, CageFs должен ограничивать активность всех пользователей.
Так что я начал думать, что диски получают много операций ввода-вывода в секунду, с которыми они не справляются. Собственный megacli
Утилита сообщает, что в массиве RAID нет сбоев, не выполняется восстановление или что-то необычное. Бег sar
в течение нескольких часов я испытывал более 5000 операций ввода-вывода в секунду, но зависания все еще сохраняются, когда система выполняет менее 1 КБ операций ввода-вывода в секунду, поэтому я думаю, с дисками все в порядке?
Я пробовал использовать фреймворк аудита и системный кран, но оба оказались бесполезными (первый зависает во всей системе, и я не мог получить много статистики, второй даже не работал).
Сейчас я сравниваю скорость моего крошечного ноутбука с сервером с помощью нескольких тестов. Вот как я узнал, что, хотя я могу создать 100K файлов с помощью следующего скрипта на моем ноутбуке (с маленьким медленным жестким диском) за 3-5 секунд, сервер делает это более чем за 20-30 секунд.
#!/bin/bash
i=1
while (( $i < $1 )); do
echo $i
echo "foobartest" > tmp/iotest.$i
(( i++ ))
done
Это может быть связано с тем, что сервер обслуживает 50-100 HTTP-запросов в секунду, но странно то, что, если я наблюдаю текущие числа в терминале, иногда он зависает на несколько секунд, прежде чем он сможет создать следующий файл.
В настоящее время я использую strace -T
и анализируя вывод, чтобы увидеть, как долго каждый системный вызов висит (поскольку я не могу использовать stap
).
Я обнаружил, что open, write и dup2 занимают гораздо больше времени, чем другие. Все три являются нормальными, учитывая, что я хочу создать много файлов с контентом - поэтому я действительно не знаю, где мне двигаться дальше ?!
статистика strace:
open 26,8320000000
write 11,5165000000
dup2 7,0665500000
ПРИМЕЧАНИЕ. По запросу я могу загружать результаты таких команд, как sar
и т.д. Извините за плохой английский, здесь 2 часа ночи, когда никого не волнует его / ее сайт. Заранее спасибо.
ОБНОВИТЬ: Мы изменили блок питания с двойного ~ 400 Вт на двойной ~ 650 Вт, и я больше не испытываю лагов. Однако задержка по-прежнему достаточно высока, чтобы беспокоиться.
Выход megacli showsummary a0
показывает проблемный BBU:
Hardware
Controller
ProductName : ServeRAID M5015 SAS/SATA Controller(Bus 0, Dev 0)
SAS Address : xxxx
FW Package Version: 12.12.0-0047
Status : Need Attention
BBU
BBU Type : iBBU
Status : Replace Battery pack
Странно то, что если я наблюдаю текущие числа в терминале, иногда он зависает на несколько секунд, прежде чем сможет создать следующий файл.
Это пахнет, как будто вы заполняете кэш записи на вашем RAID-контроллере. У вас есть кеш записи, да? (мегакли показывает сводку а0)
Особенно проверьте, оптимален ли ваш BBU. В конфигурации по умолчанию отказавший / отказавший BBU такой же, как отсутствие кеша записи.
Наблюдайте за iostat, чтобы увидеть, приближается ли процент занятости жесткого диска к 100% при замедлении работы.
Также было бы полезно больше информации, такой как основная файловая система. Размещайте графики! Все, что у вас есть! (ну, большая часть)