Как настроить mysql в debian для высокой нагрузки?

Здравствуйте.
На сервере (8 ядер, 32gb, linux debian) mysql 5.5.31 - выполняется до нескольких тысяч запросов за раз.
С утра все в порядке, но с 15:30 и до вечера нагрузка повышается и nginx начинает постоянно выдавать 502 ошибку.

Когда все в порядке:
screencast.com/t/ZpATtcji
Длительность запроса 0,3сек в среднем. Т.е. сам MYSQL запрос не очень тяжелый.

Когда все плохо:
screencast.com/t/PsUD9fIssttL

При этом команда top показывает нагрузку на ЦП процесса mysql 100%-350%.
И что еще хуже, временами выдает ошибку "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (11)"

Пытался сам настроить mysql, по различным мануалам из интернета, но не слишком успешно, проблемы остались. Еще не было опыта по настройке высоко нагруженных серверов.

Вот файл my.cfg:
yadi.sk/d/SF7hykLEHMmTr

Для предотвращения ошибки "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (11)" установил open_files_limit 8192, правда бестолку. Вроде как еще и в самом линуксе нужно что-то поправить, но непонятно что.

В логах апача и mysql ничего. Никаких ошибок и такое ощущение, что логгирование просто не работает толком.

Я явно что-то упустил. Конфигурация сервера, то, совсем не слабая и эти 2-3 тысячи подключений наверняка не предел.

Заранее благодарю за помощь.
  • Вопрос задан
  • 8105 просмотров
Пригласить эксперта
Ответы на вопрос 7
fornit1917
@fornit1917
Во-первых, надо привести в порядок базу данных - расставить индексы, где надо.
Во-вторых - оптимизировать само приложение, возможно от многих запросов удастся избавиться.
В mysql можно включить лог медленных запросов (slow query log)

Что касается настройки mysql, то в случае innodb могу посоветовать следующие рекомендации www.pentarh.com/wp/2011/03/02/mysql-innodb-highloa...

Еще у Mysql есть опция на максимальное количество одновременных соединений. Но лучшее без особой надобности не трогать - если вы оптимизируете все остальное, то со значением по умолчанию должно нормально работать.
Ответ написан
opium
@opium
Просто люблю качественно работать
Включите slow log и посмотрите какие запросы ложат mysql
запустите mysqltuner.pl и он вам скажет какие стандартные оптимизации можно сделать
наймите нормального сисадмина и живите спокойно.
Ответ написан
@Merlyel
0) а вы уверены, что ошибка из-за мускуля? может, у вас что-то с php (если он используется) или с самим nginx? его логи смотрели?
1) почитать про persistent mysql connections
2) добавить логирование запросов без индексов
3) почитать, что пишет mysqltuner/tuning-primer - бывает советуют полезные вещи
4) проверить лог сервера и веб-сервера, может они тоже ругаются на количество открытых файлов - тогда нужно править эти лимиты в системе (например, вот один мануальчик www.cyberciti.biz/faq/linux-increase-the-maximum-n...)
5) выделите больше памяти mysql, особенно innodb
6) таймауты очень большие - 4 часа - возможно, у вас висит куча неиспользуемых процессов
7) зайти в ЧНН в консоль mysql и посмотреть список процессов (show processlist;) - посмотреть, что там происходит, возможно сразу будут видны locks
8) переключение на tcp/ip может помочь с ошибкой на открытые файлы, но одновременно может уменьшить производительность
While you don't hit the entire IP stack when going over localhost, you still hit a big part of it. A unix socket is essentially just a 2-way pipe. It's faster and lighter.
да и в любом случае - это временный обход проблемы, а не решение. Просто рано или позже эта же ошибка вылезет в другом месте
9) посмотрите на значения iowait в top/iotop - возможно, проблема не в запросах, а в дисковой подсистеме. В таком случае может помочь вынос мускуля на отдельный раздел
10) попробуйте посмотреть загрузку по процессорам (нажать 1 в top), возможно один-два процессора забиты под завязку, а остальные простаивают. Возможно, в таком случае будет смысл разнести задачи по процам
Ответ написан
Комментировать
@ChemAli
Это веб-сервер? Если да, сначала расставьте контрольные точки по коду веб-приложения и посмотрите на каких участках оно спотыкается или долго исполняется с упором в БД. Оттуда увидите проблемные запросы и поймете где узкие места.
Ответ написан
Комментировать
Foror
@Foror
Графоман
Гуглите mysql ulimit например duntuk.com/how-raise-ulimit-open-files-and-mysql-o...

Плюс посмотрите по каким урлам идет 502 ошибка, если есть какой-то общий шаблон, то просто добавить лог в сырцы обрабатывающие данный урл, и выяснить, что подвисает из логов.
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Пишите в почту, попробую поделиться подходящим конфигом.
А вообще - переходите вы на перкону 5.5 уже)
Ответ написан
Комментировать
golotyuk
@golotyuk
Попробуйте настроить параметры по этому руководству.
Из инструментов для анализа - munin для графиков, mysql/fpm slow log, maatkit для анализа этих логов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы