MySQL упирается в скорость жесткого диска, что делать?

DiMA

php.spb.ru
Команда форума
MySQL упирается в скорость жесткого диска, что делать?

MySQL упирается в скорость жесткого диска, скорее всего в seek time, обрабатывая большое число запросов.

Поставил innodb_flush_log_at_trx_commit поставил равным 0 и другие оптимизации по памяти. Опасность потерь данных при сбое меня вообще не беспокоит.

Теперь есть мысль перекомпилить движок InnoDB, чтобы журнал транзакций писался на диск еще реже, а не раз в секунду. Кто-нибудь занимался темой, как выжать из винча больше, чем тот способен пропустить? Какие опции прямо в заголовочных файлах подкрутить, которые отвечают за частоту сброса журнала (в опциях конфига такого параметра нет)?
 

vovanium

Новичок
Как вариант присмотреться к SSD-шкам, seek time раз в 100 лучше, чем у винтов.
 

DiMA

php.spb.ru
Команда форума
у них разве нет лимита перезаписи? их же можно юзать только для кеша неких статичных файлов, а никак не жестко перезаписываемых

в любом случае - это не вариант, дешевле взять в аренду 5-10 серверов (целиком), чем одну флешку для одного сервера купить...
 

vovanium

Новичок
Тут во многом зависит от объемов (если 16-32 гига хватит, то можно и более тщательно изучить вопрос), и специфики работы. Что касается лимита перезаписи, то как бы технология на месте не стоит. Где-то читал, что у современных SSD этот лимит значительно увеличили, плюс контролеры умные, которые равномерно записывают по всем ячейкам. Но лучше изучить этот вопрос на том же форуме ixbt.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DiMA
ты полностью тему раскрой - сколько серверов, что за данные, что за запросы, проблема на пиках или постоянно - все, что касается темы

когда у меня уткнулся, я некоторые операции перевел в память, хоть и пришлось переписать кое-что
 

korchasa

LIMB infected
Сколько памяти и ядер на машине?
Какая версия и сборка MySQL?
Почему уверенность, что упирается в диск?
Сколько данных? Сколько из них горячих? Характер запросов?
Что за винты? Какой рейд?

По SSD есть несколько тестов на mysqlperformanceblog. Если вкратце, то они сильно рулят. 1 в секунду им хватит надолго ;)
 

DiMA

php.spb.ru
Команда форума
Серверов - несколько десятков. Запросы - простейшие SELECT / INSERT / UPDATE по первичным ключам или индексам. Много параллельных запросов, на тачку где-то 500-700 в секунду.

Проблемы только в пики нагрузки, когда юзера валом идут, с 18 до 24. В другое время все в рамках. Мы естественно разбиваем базы на более мелкие с закупкой серверов, но это время и вопрос не в том. Да, в память конечно ничего не влезает.

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

Все данные - очень горячие.

Думаю, что все уперлось в винч по следующим показателям:
- CPU mysql ~0% (idle системы 70%)
- сотни php скриптов (кроны+аппликейшн) долбят параллельно базу (на веб-балансере 2000 соединений в секунду)
- увеличение кол-ва этих потоков на скорость не влияет
- сами php потоки жрут ~0% CPU и несколько метров памяти (на разных серверах), когда выполняют нагрузку
- iostat показывает 10мб/с обмен с жестким диском и кучу мелких операций
- транзакции почти все уже повыкидывал в особо узких местах
- когда глазами смотрю PROCESSLIST - там почти всегда пусто
- общую погоду портит где-то 1% запросов, которые исполняются медленно скорее всего из-за того, что база давно не читала какой-то файл и нужно его считать с диска

Из этого я делаю вывод - база мгновенно выдает ответ и сливает данные в ОС на запись, от чего в PROCESSLIST пусто, CPU почти нулевое, PHP ожидает ответа и т.д.

Некоторые базы работают хорошо, некоторые - тормозят (на них объективно подается нагрузка выше, процентов на 20-30%). На справляющихся с нагрузкой базах винч так же нагружен, но CPU mysql в районе 30-60%.

В табличках 30-150 тыщ записей. Несколько индексов. Только числовые поля. Видов таблиц - несколько, но все такие по простой структуре.

Применяю нетрадиционные методы, чтобы избегать лавинообразного накопления кол-ва запросов, когда база не справляется с какой-то из одной своих таблиц... Один крон мониторит со всех тачек SHOW PROCESSLIST и вырубает часть пользователей, которые читают тормозные таблицы. При срабатывании - новые запросы игнорируются, т.е. лавина не образуется. А спустя пару секунд, еще делается KILL всем тредам. Таких бывает очень мало и редко, но они могут завесить весь проект, пока над одной тормозной таблицей наконец не выполнятся все накопленные операции. У меня это не приводит к ошибкам, т.к. если крон не обработал запрос, то он уйдет обратно в очередь на отложенную обработку (естественно, тоже без вечного зацикливания).

SSD никак не катит. Как не настрой базу, она будет долбить винч множеством мелких запросов на всю катушку. С нашей загрузкой сдохнет через неделю, хотя и проблема seek time исчезнет как класс. Менять хостера не выгодно (а уж тем более покупать железо).

Во всех доках написано, что при innodb_flush_log_at_trx_commit=0 запись журнала идет примерно раз в секунду. И нигде не поднимался просто вопрос - а что делать, если мне надо еще реже? Я понимаю, уже и так выжали все, только жалко, что оно уперлось не в память или CPU, а в тормозной винч.
 

korchasa

LIMB infected
Подожди, я может чего-то не так понимаю, но 70% idle это точно не диски, там io_wait должен быть. Да и не 70% нормально для 8 процессоров. Или ты уже поделил? Что vmstat выдает?

К тому же смущают 8 ядер. Стандартная поставка у нас их(то же 8) утилизировала хреново, примерно с теми внешними показателями, что и у тебя. В итоге переехали на сборку от percona, с гугловскими патчами. Стало лучше.

ИМХО, стоит попробовать XtraDB. Даже если проблема именно в дисках, и именно в записи, то у них уже вроде бы можно задавать размер страницы.

ЗЫ: Кэш запросов отключен? Хотя это мелочь, но там тоже глобальный лок, наверняка.
 

fixxxer

К.О.
Партнер клуба
Да-да-да, есть подозрения, что это еще и блокировки тредов.

Кстати, помимо xtradb, еще релиз кандидат 5.5 вышел, там серьезно переписали-оптимизировали все что касается блокировок и масштабирования по куче ядер. (Но что мыскль куплен ораклом, конечно, сразу заметно - обещанный прирост производительности "до 1500%" в пресс релизе это конечно круто :) заява в стиле Оракла, ага)
 

korchasa

LIMB infected
fixxxer
Там, насколько я помню, не переписали, а тупо влили патчи гугла и фейсбука :). Да и насчет стабильности очень много вопросов было. Это имиджевый релиз.
 

DiMA

php.spb.ru
Команда форума
Да, Xtradb уже ставим как эксперимент. RC 5.5 тоже попробую.

70% idle - (т.е. 30% CPU) жрут другие процессы на тачке, которые почти не общаются с диском. Очень часто у mysql нагрузка снижается чуть ли не до нуля. В нормальном режиме - от 30%.

Что не так с 8 ядрами? Что и на что попробовать изменить?

Как бороться с блокировками тредов?

Стабильность 5.5 не страшна, будет плохо - переедем сразу назад...
 

fixxxer

К.О.
Партнер клуба
влили патчи гугла и фейсбука
Ты так говоришь, как будто это что-то плохое :) Хотя перконе в плане стабильности я верю больше, да.

-~{}~ 28.09.10 13:49:

Как бороться с блокировками тредов?
Если не обновлять мыскль, то единственный черезжопный способ, котоый я вижу, - запустить 2-4 мыскля разделенные по базам (и, возможно, прибить гвоздями к соответствующим ядрам - cpuset на фре, на линуксе хз). Но кстати таким раком можно еще и базы по отдельным винтам разнести. Но что-то это какие-то совсем извращения :D тем более что это не мемкеш, memory footprint до хрена большой да и затрахаешься тут потребление памяти еще тюнить у каждого...
 

korchasa

LIMB infected
fixxxer
Нет, это замечательно. Только гугловские патчи и в перконе есть, если не ошибаюсь. Плюс расширенная схема.

Прибить к ядру это да. Опять же cache miss'ов меньше будет) Главное все точно рассчитать)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
меня смущает
база мгновенно выдает ответ и сливает данные в ОС на запись, от чего в PROCESSLIST пусто, CPU почти нулевое, PHP ожидает ответа и т.д.
если база возвращает после запроса мгновенно и в PROCESSLIST пусто, как именно проявляется задержка?


ты уверен, что нельзя некоторые самые активные данные писать в hash, а если надо, кучей переносить на винт, уменьшая "кучу мелких операций"? обычно такие участки найти можно
 

DiMA

php.spb.ru
Команда форума
> У тебя логи и tmp для MySQL на одном диске?

на разных

я немного ошибся, никакого рейда вообще нет, просто 2 последовательных sata винча класса домашний компьютер (софтварный рейд отключен в силу убогости)

> запустить 2-4 мыскля разделенные по базам

Мы по разным серверам все разносим, на одном вешать несколько штук - до такого еще не дошли.

> меня смущает

Меня тоже. Я просто нажимаю F5 на процесслисте. Там почти нет запросов (очень мало). Т.е. запросы выполняются быстро и исчезают от туда. С этим согласуется, почему база ничего не делает и не грузит CPU. Тем не менее, нагрузка через нее проходит, порядка 500 запросов в секунду. Проблема в том, что около 10% запросов выполняются более 0.1 секунды, а 0.1-1% - пару секунд. Запросы простейшие, всего 10 разновидностей, вся нагрзука из них состоит.

> ты уверен, что нельзя некоторые самые активные данные писать в hash

Это на будущее. Попытаюсь отделить реальный горячий контент от архива. Использую кеширование результатов по максимуму и так.
 

fixxxer

К.О.
Партнер клуба
> Мы по разным серверам все разносим, на одном вешать несколько штук - до такого еще не дошли.

хехе =)

кстати, я тут че подумал еще. Если включен mysql-евский query cache (и при том используется апплевел кэширование, мемкеш или что там еще) - руби его нахрен. Во-первых, это сам по себе так или иначе лок, во-вторых, что много хуже - там нифига не продуманное выделение памяти (не приводится к степеням 2-ки - обычный malloc на "сколько съели"), по коей причине все дико фрагментируется, что вызывает регулярные дефрагментации в libc-шном malloc(), на время чего разумеется все нахрен блокируется вообще.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ну это далеко не факт что iowait - с ним бы висело больше запросов imho
это похоже на локи какие-то

поставь эксперимент - добавь 3й винт и вынеси некоторые таблицы на него
 

DiMA

php.spb.ru
Команда форума
да, он давно отключен - mysql-евский query cache
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
кстати, когда ты на сервере из консоли работаешь с файлами-папками, например, ls /etc, компиляция, ты визуально ощущаешь задержки?
когда у меня был перегружен винт, я это чувствовал явно

да и просто померяй скриптом скорость чтения/записи в нормальном режиме и в пике
если винты перегружены - это будет чувствоваться
 
Сверху