марта 18, 2007

Высокие показатели io wait

Столкнулся было дело с такой ситуацией когда на сервере mysqld серъезно загружал процессор, при чем процессор большее время проводил в режиме iowait и очень небольшую в режиме user.

Грубо говоря, процессор большее количество времени ждет ответа какого то блочного устройства. Так как кандидатов не много (сеть и винт), диагностировать затык не составило труда.

При помощи утилит iostat,dstat,vmstat удалось выяснить что узкое место винчестер.

Однако как я не парился. (система Gentoo Linux)

1. Сменил io scheduler deadlock на cfq (перекомпиляция ядра)
2. Затюнил кучу sysctl
3. Скомпилировал mysqld в статическом варианте, лишившись очень полезной утилиты mytop
4. Разнес даже таблицы по разным дискам

В результате добился только некоторого улучшения ситуации, однако перспектива мне не нравилась

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

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

5 комментариев:

Murz комментирует...

Испытываю ту же самую проблему, iowait очень часто доходит до 80-90% без видимых на то причин...
Расскажи пожалуйста поподробней, каким образом у тебя получилось определить какие именно базы данных и таблицы тормозят работу? А то у меня там баз данных штук 100 и таблиц в каждой куча, кого первого из пользователей базы обвинить - прям не знаю...

Serge комментирует...

Ну там mytop надо смотреть, анализировать бинарные логи, какие запросы много времени занимают или логи Slow запросов.

Очевидно такую хрень вызывает избыточность и ненормализованность данных и/или очень массивные таблицы.

Можно мускулю памяти дать больше, хотя сомневаюсь что поможет. Разве что вообще физической памяти добавить.

Проанализируй массивные таблицы. В первую очередь надо искать там.

Murz комментирует...

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

Serge комментирует...

Берешь суточный слепок бинарного лога, парсишь перлом и анализируешь. Там все есть - таймштамп, юзер, хост, база, запрос.

Хотя нет, не бинарный лог. В бинарном логе только апдейт запросы вроде. Бери квери лог.

Murz комментирует...

Ну это понятно, попробую руками попарсить. Просто думал может уже готовые скрипты какие есть для этого...