Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте,
имеется проблема, а именно случайная длительность различных запросов раз в две-три минуты, если запрос происходит в наиболее нагруженные таблицы. К концу дня буквально каждый запрос в итоге оказывается в slow query log.
Воспользовавшись утилитой Jet Profiler, которая визуализирует данные встроенного профайлера, обнаружил, что поток длительное время пребывает в состояниях System lock, Locked. нагрузка на дисковую систему при этом крайне незначительная 2-3Мб/с, HDD использовались различные, в данный момент SAS 15k
SHOW VARIABLES
http://pastebin.com/pDAPbDLW
SHOW GLOBAL STATUS
http://pastebin.com/d4JAgDv0
my.cnf
http://pastebin.com/wZS1VYhr
Jet Profiler
http://img203.imageshack.us/img203/4429/states.png
Помогите разобраться, какие необходимы данные - предоставлю.
Неактивен
Хм, сервер у Вас достаточно загружен. По хорошему — надо смотреть SHOW
PROCESSLIST во время того, как процессы висят Locked.
Из того, что видно из Ваших данных:
1. Вы очень много пишете по сравнению с чтениями: в среднем на один SELECT
приходится два(!) UPDATE и еще сверху половинка INSERT.
2. При всем при этом Вы используете тип таблиц MyISAM, которые не позволя-
ют делать изменения одновременно.
3. Соответственно, рабочее предположение, что приходят несколько потоков,
которые хотят изменить данные, а в результате все параллельные SELECT их
ждут.
Если я угадал, то самое простое — переделать такие нагруженные таблички
в InnoDB. Ну или, скажем, сделать реплику и снимать SELECT с нее. Еще вари-
анты: делать INSERT/UPDATE LOW PRIORITY и/или SELECT HIGH PRIORITY.
Но тут можно плохими приоритетами добиться того, что обновления вообще
будут очень редко происходить из-за выборок. Все-таки, движок предназна-
чался для данных с большим уклоном в сторону чтения.
P.S. Очень красивая у Вас утилитка, которая графики строит.
P.P.S. Кто такой Remi, который собирал MySQL?
Неактивен
Спасибо за ответ.
Насчет репликации, наверное это самый лучший вариант, но как направить приложение делать SELECT на сервер репликации я пока не догадываюсь.
Попробую вариант с InnoDb для самых загруженных таблиц.
paulus написал:
P.S. Очень красивая у Вас утилитка, которая графики строит.
Утилитка действительно красивая, на сайте производителя есть бесплатная версия.
paulus написал:
P.P.S. Кто такой Remi, который собирал MySQL?
Сервер mysql взят из репозитория: http://blog.famillecollet.com
Неактивен
А почему не с mysql.com? Вроде, MySQL AB неплохо собирает свой сервер
Неактивен
Взял на всякий пакет c mysql.com, 5.1.49
С InnoDB ситуация хуже, некоторые запросы выполнялись по 30-40 секунд, некоторые моментально, не понял почему, вернул MYISAM. Реплика также не помогла, настроил на этой же машине slave, направил внешние SELECT для сборка статистики туда, с течением времени master сервер реагировал все медленнее и медленее, пока не выключил slave.
SHOW PROCESSLIST показывает ожидаемую картину, выполняется 1 update/select и 20-30 в состоянии Locked/System Lock
Заметил еще что lsof не показывает что открыты файлы таблиц. При этом:
show global status like 'open%tables%';
Open_tables 381
Opened_tables 536
iostat показывает среднюю нагузку на HDD на запись 2-3Мб/с
Уже не знаю что делать, неоправданно поменял машину на "помощнее" и таже петрушка.
Неактивен
Не-не, я не предлагал Вам менять сервер, просто хотел узнать, почему такой.
Какие настройки InnoDB у Вас стояли?
Неактивен
paulus написал:
Не-не, я не предлагал Вам менять сервер, просто хотел узнать, почему такой.
Какие настройки InnoDB у Вас стояли?
Сервер то я сам поменял, на всякий.
Настройки innodb:
innodb_flush_method=O_DIRECT
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=8M
innodb_buffer_pool_size=2G
innodb_log_file_size=32M
innodb_thread_concurrency=16
Всте таблицы с нестатичными данными были переведены на InnoDB.
Неактивен
Хм, а flush в ноль ставить не пробовали? При бывших табличках myisam вам, наверное, полный acid не нужен? Ну и processlist интересно посмотреть, когда тормозит.
Неактивен
Пробовал innodb_flush_log_at_trx_commit 0,1,2, погоды не делало. processlist на MYISAM не сохранил, но там было очевидно - 20-30 запросов, 2-3 селекта, остальные обновления, длительная блокировка.
Вот сейчас установили SSD диски, перенес туда базу, в профайлере суммарное время System lock понизилось значительно, как было - картинка в первом посте, а вот как стало.
http://img839.imageshack.us/f/statesn.png/
На SAS диске почему то System lock занимал длительное время.
Неактивен
На myisam processlist и не интересен. Интересен на innodb, с ноликом. SSD увеличивает производительность дисковой системы, да. Но проблему не решает.
Неактивен
Проблему то понятно, что не решило, постараюсь сэмулировать загрузку на InnoDB, и буду смореть processlist. Обращусь за советом уже с каким-нибудь данными.
Неактивен
Два дня свистопляски, перевел еще раз все на InnoDB, эмулятор нагрузки мой показал стабильное снижение пропускной способности, в моем случае это где то до 800 запросов в секунду, запись : чтение где-то 2 : 1, НО при этом в несколько 12 часовых заходов не показало ни одного медленного запроса, с MYISAM получалось где-то 2000 запросов в секунду, но гарантировано были медленные запросы, они мне и все портили, простой всех потоков 2-4 секунды в ожидании снятия блокировки. Все тесты проводил без репликации.
К сожелению при включении бинарного лога, без слейва или с ним, в случае и InnoDB и MYISAM на SAS и SSD дисках, с течением времени скорость выполнения запросов понижается до неприемлимой. Не нашел что-то параметров, можно ли выставить приоритет на слейве или на мастере, чтобы подгружать данные на слейв только когда мастер "не занят", и по поводу бин-лога, можно ли контролировать как будут сбрасываться данные, может есть настройки, аналогичные настройкам InnoDB: innodb_flush_log_at_trx_commit
Неактивен
Параметры есть, но по умолчанию они не синкают логи
http://dev.mysql.com/doc/refman/5.1/en/ … y-log.html
В принципе, если писать лог на отдельный диск, то он не будет конфликто-
вать с записью данных. Как вариант — писать в память (но тогда, разумеется,
велик риск потерять некоторое количество еще не среплицированной инфор-
мации).
Неактивен