MySQL-тюнинг. Настраиваем по-взрослому.

Итак, для начала благодарности. Выражается нереальная благодарность Олегу Копачовцу(он же Dr. Cop, http://www.kopachovets.com), за собранный материал и анализ фактов, а также за удачную подачу материала.
Идея написания статьи витала в воздухе уже давно, вопрос правильной настройки сего загадочного зверька всегда вызывал у меня интерес. Мало кто знает, но правильно оттюненный MySQL может работать в 10-100 раз быстрее своего неоптимизированного собрата из базовой установки.
Я человек не жадный, именно поэтому данная статья увидела свет. Итак, приступимс …

Поучение 1. Вы еще не стартовали MySQL? – Тогда мы идем к вам …

Если вы думаете, что вы стартовали демона MySQL и на этом ваша работа закончилась – вы оптимист.
А уверены ли вы, что стартовали MySQL правильно? Да? Ну так давайте посмотрим, что стоило бы сделать в первую очередь …

Итак, предположим, что MySQL стартуется из init-скрипта, через демон mysqld_safe. Находим строку запуска MySQL, и что мы видим?

$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file >/dev/null 2>&1 &

И чего? – спросите вы.

А вот чего, аккуратно добавляем к строке запуска следующие параметры:

–skip-name-resolve – Не производится разрешения имен хостов. Все значения в столбце Host в таблицах привилегий должны быть IP-адресами или значениями localhost
Это сильно увеличивая быстордействие запросов за счет выключения постоянных DNS запросов (до 1000% при “внешних” соединениях с mysql)
–skip-locking – Нужно запускать mysqld с опцией –skip-locking. Запрет внешней блокировки существенно повысит скорость работы. Редко когда с одной базой работают одновременно 2 сервера
Ограничение: при запрете внешней блокировки нельзя будет использовать несколько серверов для работы с теми же базами данных.
–low-priority-updates – INSERT/UPDATE в БД являются более низкоприоритетными, чем SELECT… Думаю для многих проектов это будет актуально, хотя пользоваться этим надо с умом.

$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file --skip-name-resolve --low-priority-updates --skip-locking >/dev/null 2>&1 &

Поучение 2. Ну вроде бы запустились …

Мы конечно уже обрадовались, думается, ну вот же он – наш Database server, но-но, не тут то было, а как же my.cnf?
Открываем /etc/my.cnf, и начинаем стучать в бубен (то есть определять конфигурационные переменные MySQL):

thread_concurrency. Если у вас много памяти и много таблиц, то для увеличения производительности, при запуске сервера рекомендуется использовать следующие формулы, учитывающие специфику работы mysql под различные ОС:

  • Для FreeBSD: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)
  • Для Linux: thread_concurrency = (кол-во процессоров)*(кол-во ядер в одном процессоре)*3

Почему на Linux можно давать можно и нужно давать больше потоков, чем на FreeBSD? Это связано с тем, что Linux умеет распределять и управлять потоками между ядрами, а FreeBSD не умеет, зато FreeBSD умеет эффективно распределять процессы, чего, в свою очередь, не умеет Linux.

max_connections=4000 Разрешенное количество одновременно подсоединенных клиентов. Ставим 4000, чтобы не было казусов с “Too many connections…”, но стараемся поставить все таки меньше, так как, Mysql 5.0 все ещё использует select() вызов, а если хотим держать большое число соединений, то необходимо ставить mysql 6.0, который построен на libevent (epoll).
Примечание: если вам хочется использовать больше 4000 коннектов к базе, вынужден вас огорчить, с этим есть проблема. Задать такое количество соединений, вы конечно сможете, но стандартные билды не позволяют использовать такое количество соединений. Вы конечно, можете скачать патчи, для повышения количества соединений, – но это не спасет Отца Русской демократии, даже в этом случае вы будете иметь ограничение порядка 7000 коннектов.

key_buffer=1024M Блоки индексов буферизированы и доступ к ним разрешен всем потокам. key_buffer – размер буфера, используемого для блоков индексов. Чтобы улучшить обработку индексов (для всех операций чтения и записи нескольких элементов), необходимо увеличить это значение настолько, насколько возможно. Рекомендуется выставлять это значение от 15% до 25% ОЗУ, чтобы система не начала сохранять временные файлы на диске, что значительно снизит производительность.
Производительность буфера ключей можно проверить, выполнив команду show status LIKE "Key%"; и проверив значения переменных Key_read_requests, Key_reads, Key_write_requests и Key_writes. Отношение значений Key_reads/Key_read_request обычно должно быть < 0,01.
Пример:


mysql> show status LIKE "Key%";
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 818569 |
| Key_blocks_used | 287552 |
| Key_read_requests | 3012333357 |
| Key_reads | 2435564 |
| Key_write_requests | 668018001 |
| Key_writes | 70927911 |
+------------------------+------------+

Заметка: Key_buffer является общим для всех потоков, все остальные буфера выделяются для каждого потока конкретно

key_buffer = 0,25 * Объему ОЗУ - поскольку у меня 4Gb оперативной памяти, мне не жалко отдать 1Gb для индексов.

table_cache=1024 – Количество открытых таблиц для всех потоков. С увеличением этого значения увеличивается количество дескрипторов файлов, необходимых для mysqld. Чтобы узнать, необходимо ли изменять значение кэша таблиц, следует проверить значение переменной Opened_tables в вашем сервере MySQL.


mysql> show status LIKE "Opened_tables%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 685 |
+---------------+-------+

Итак, сейчас у нас 685 открытых таблиц, есть смысл задать этот параметр для нашего сервера в 1024.

sort_buffer=128M – Каждый поток, которому необходимо произвести сортировку, выделяет буфер данного размера. Увеличение данного значения позволит ускорить выполнение операторов ORDER BY или GROUP BY. “Увлекаться” большим значением не стоит, а посчитать его можно исходя из среднего значения открытых потоков (Threads_running) и кол-ва ОЗУ сервера.


mysql> show status LIKE "Threads_running%";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Threads_running | 4 |
+-----------------+-------+

Текущее значение Threads_running равно 4, таким образом на буферы сортировки у нас выделяется в среднем 512Mb.

record_buffer=32M – Каждый поток, осуществляющий последовательное сканирование, выделяет буфер указанного размера для каждой сканируемой таблицы. Если проводится много последовательных операций сканирования, это значение можно увеличить. Адекватно оценить/подсчитать размер этого буфера можно исходя из данных о количестве прочитанных строк из таблиц mysql и объема данных в таблицах… Обычно рекомендуется принять его в 4-6 раз меньшим чем sort_buffer.

query_cache_limit=2M – Результаты, превышающие это значение, не кэшируются (по умолчанию – 1Мб). Зависит от типа извлекаемых данных из mysql. Если запросов много и в то же время преимущественно извлекается небольшое количество данных (1 Mb), то данное значение лучше уменьшить.

max_join_size=1000000 Это защита от кривых рук программиста, способного join`ом на 10 миллионов записей похоронить даже 4-х процессорный сервер.
Объединения, которые потенциально могут считывать более max_join_size записей, будут возвращать ошибку. Это значение нужно задавать, если ваши пользователи осуществляют объединения, которым недостает оператора WHERE, – такие объединения занимают много времени, а затем возвращают миллионы строк.

max_sort_length=20 – Защита от кривых мозгов архитектора БД, когда не стоят адекватные лимиты по индексам сортировки текстовых полей
Параметр определяет, сколько байтов следует использовать при сортировке значений BLOB или TEXT (обрабатываются только первые max_sort_length байтов каждого значения, остальные игнорируются).

thread_cache_size=64 Определяет, сколько потоков должно сохраняться в кэше для повторного использования. После отключения клиента потоки клиента помещаются в кэш, если там не больше потоков, чем thread_cache_size. Все новые потоки сначала берутся из кэша, и только когда кэш становится пустым, создаются новые потоки. Значение этой переменной можно увеличить, чтобы повысить производительность, если создается много новых соединений (если потоки у вас хорошо организованы, обычно заметного улучшения производительности не наблюдается). Насколько эффективен текущий кэш потоков, можно определить по разнице между Connections и Threads_created. Если есть возможность, рекомендуется установить это значение не меньше, чем значение переменной Max_used_connections. Если значение этой переменной больше 128, рекомендуется ограничиться этим значением.

mysql> show status LIKE "Max_used_connections%";
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 62 |
+----------------------+-------+

В нашем случае, Max_used_connections = 62, поэтому установим этот параметр в 64.

myisam_sort_buffer_size=512М – Буфер, который выделяется для сортировки индексов при выполнении команды REPAIR или для создания индексов при помощи команд CREATE INDEX или ALTER TABLE. Рекомендуется не жадничать …

net_read_timeout=12 – Количество времени в секундах, на протяжении которого ожидаются дополнительные данные от соединения, пока не будет отменено чтение. Обратите внимание, что мы не ожидаем поступления данных от соединения, время ожидания определяется по write_timeout.

net_write_timeout=15 – Время ожидания записи блока через соединение, пока запись не будет прервана (в секундах).

wait_timeout=30 – Время в секундах, на протяжении которого сервер ожидает активности соединения прежде, чем закрыть его.
Примечание: мы, предполагаем, что наша система очень динамична, и висеть конекшенам по несколько часов не требуется, 30 секунд достаточно даже для очень медленных запросах от Web-приложения.

interactive_timeout=600 – Количество времени в секундах, на протяжении которого сервер ожидает активности со стороны интерактивного соединения, прежде чем закрыть его. Интерактивный клиент – это клиент, который использует параметр CLIENT_INTERACTIVE для mysql_real_connect(). См. также информацию по wait_timeout.

long_query_time=30 – Если обработка запроса отнимает больше указанного промежутка времени (в секундах), значение счетчика Slow_queries будет увеличено. Если используется параметр –log-slow-queries, запрос будет записан в журнал медленных запросов.
Значение этого параметра должно быть примерно равно time_limit скрипта php или временно лимиту операции выдачи, т.к. часто получаются ситуации когда PHP-скрипт уже вылетел по time_limit, а бендненькое умирающее животное MySQL все еще корчится в конвульсиях над запросом по группировке 10 млн записей.

Поучение 3. А не выпить ли нам таблеток от Склероза?

Кэш в MySQL называется QuickCache или он же QCache. Ошибочно мнение, что эффективность использования кэша это отношение хитов в кэш к инсертам в кэш. Все немного сложнее. Эффективность попадания в кэш можно оценить вот таким показателем:

qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)

Посмотреть эти значения можно следующим образом:


mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_free_blocks | 36 |
| Qcache_free_memory | 138488 |
| Qcache_hits | 79570 |
| Qcache_inserts | 27087 |
| Qcache_lowmem_prunes | 3114 |
| Qcache_not_cached | 22989 |
| Qcache_queries_in_cache | 415 |
| Qcache_total_blocks | 912 |
+-------------------------+--------+

Если это значение > 0.8, то значит 80% ваших запросов попадают в кэш, это очень хороший показатель.
Если % попадания в кэш низкий, то необходимо увеличить значение query_cache_size.
Текущее значиние можно посмотреть так:

SHOW VARIABLES LIKE 'query_cache_size';

Опять же возникает вопрос: как выбрать адекватное значение query_cache_size?
В этом поможет Qcache_lowmem_prunes. В этой переменной хранится число запросов, которые были убраны из кэша из-за необходимости кэширования новых запросов. Необходимо стремится к такому размеру кэша, при котором Qcache_lowmem_prunes будет лишь незначительно увеличиваться. Для этого, рекомендуется сравнить разницу значений Qcache_lowmem_prunes за час и кол-во запросов, поступивших на mysql за этот же час.
На практике, для расчета query_cache_size можно использовать одну из 2-х формул:


query_cache_size = (число запросов за 10 минут)*(срений объем ответа на запрос) * 1,2
или
query_cache_size = (объем трафика за 10 минут) * 1,2

Это позволит закэшировать запросы на 10 минут + дать дополнительные 20% памяти на фрагментацию кэша и дополнительный резерв кэширования
Подсчитать количество и средний объем ответа на запроса можно использую переменные Bytes_sent соответственно

И так значения query_cache_size мы увеличили, после чего стоит обратить внимание на значения Qcache_total_blocks, Qcache_free_blocks и Qcache_queries_in_cache. MySQL хранит кэш в блоках. На 1 запрос необходимо 2 блока: один для самого текста запроса, второй для результата.
Если рассмотреть таблицу со значения Qcache%
Общее количество блоков кэша Qcache_total_blocks – 912
Закешировано сейчас 415 запрос, а значит занят 415*2 = 830 блоков
свободно блоков Qcache_free_blocks – 36. Чем больше незадействованных Qcache_free_blocks, тем больше степень “фрагментации” кэша.
Если большинство запросов имеют небольшой объем результирующих данных, то стоит уменьшить минимальный размер блока кэша query_cache_min_res_unit, который по умолчанию равен 4 Кб.
Если же большинство запросов возвращают много данных – то стоит увеличить размер блока кэша.
Главное – это добится минимального значения Qcache_free_blocks.

Если же случилось непоправимое, и ваш кеш вас подводит, рекомендуется не забыть про следующие команды MySQL:
FLUSH QUERY CACHE – дефрагментировать кэш
RESET QUERY CACHE – очистить кэш

Поучение 4. СМЕРШ. Ищем злодеев и вредителей.

Без комментариев:

–log-slow-queries=/var/log/slow_queries

Перед этим, стоит помочь MySQL (на всякий случай):

#touch /var/log/slow_queries
#chmod 777 /var/log/slow_queries

Рекомендуется ежедневно смотреть лог медленных запросов через less или же пользоваться mysqldumpslow.

Примечание: –log-long-format позволяет заносить в лог запросы, не использующие индексов. Это также полезная информация, для поиска внутренних врагов.

Поучение 5. Подсматриваем и вынюхиваем.

Даже если ваши руки настроили MySQL как конфетку, НЕ ЗАБЫВАЙТЕ О МОНИТОРИНГОВОМ программном обеспечении, – целее будете …

Поучение 6. Что делать и Кто виноват?

И так в один прекрасный момент мы видим, что очень медленно открываются страницы нашего драгоценного сайта…
При выяснении причин и при просмотри top сервера обнаруживаем, что паршивой овцой в нашей боевой linux-связке оказался таки MySQL. Главное спокойно и без паники.

Админы с поверхностным представлением об MySQL сделают “service mysql restart” и на этом успокоятся… Вот только, минут через 10-15, как правило, MySQL опять начнет бится в конвульсиях.

Админы с более продвинутой встроенной логикой начнут делать mysqladmin processlist и пытатся выловить кто же мучает их MySQL и найти причину. Не спорю метод эффективен, но может оказаться что сайт развился до такой степени что ему уже просто не хватает MySQL ресурсов.

Итак, что же мы будем делать в сутации когда наш верный конь MySQL захромал?

  • таки да… “show processlist;” – и попытаться найти первопричину загрузки. По возможности ослабить её или устранить. Возможно какие-то боты “долбят” ваш сервер
  • если таки причина не устранена пробуем сделать: mysqladmin flash-tables . Такое действие поможет закрыть устаревшие дескрипторы для таблиц и таким образом можно вправить МОСК своему любимому MySQL
  • FLUSH QUERY CACHE – дефрагментировать кэш
  • service mysql restart

Если ничего из вышеперечисленного не поможет, рекомендую пинать Системного Архитектора на тему построения более Масштабируемого решения. :)

25 Responses to “MySQL-тюнинг. Настраиваем по-взрослому.”

  1. LEXX says:

    Спасибо за статью! Очень информативно и полезно! :)

  2. Вадим says:

    Однозначно в мемориз! Спасибо.
    Сам давно хотел поделить своим опытом в “подкручивании” параметров MySQL, но все как-то не удается систематизировать знания.

  3. Friend says:

    Полезная статейка, надо будет на досуге повертеть скуль ;)

  4. [...] Хорошие советы по настройке MySQL на русском, Web Applications Scalability » MySQL-тюнинг. Настраиваем по-взрослому. [...]

  5. Zuka says:

    пионерская пурга по многим пунктам

    для примера:
    thread_concurrency никоим образом не определяется размером памяти и количеством таблиц
    max_connections – интересно как будет шевелиться сервер при 4000 одновременно выполняемых запросах

  6. * пионерская пурга по многим пунктам

    * для примера:
    * thread_concurrency никоим образом не определяется размером памяти и количеством таблиц
    * max_connections – интересно как будет шевелиться сервер при 4000 одновременно выполняемых запросах

    Все параметры MySQL настраиваются исходя из параметров “Железа” вашего сервера и как минимум, количества активных баз данных/таблиц.
    Поэтому если на сервер с 1 Гб оперативной памяти, вы поставите thread_concurrency = 12, то ваш сервер, такого просто не вытянет. Стоит ли учитывать количество и размер таблиц для параметра thread_concurrency? Если думать только о хорошем, то нет, если думать о плохом, например, для повышения производительности хотелось бы держать индексы этих таблиц, в оперативной памяти то видимо эти параметры связаны. В любом случае, в полемику по этому вопросу вступать не буду, и на истину в последней инстанции не претендую.
    max_connections – это именно max_connections, и параметр этот не имеет никакого отношения к количеству одновременно выполняемых запросов. Вопрос этот, также можно обсуждать долго, заметить хочу только одно, если все ваши 100 коннектов (количество по-дефолту) были залочены вашими приложениями(вопрос почему они залочились тоже рассматривать не буду), mysql отвалится до того момента, пока не появится свободный коннект, рестарт MySQL в этом случае, спасет положение, но этой ситуации можно было избегнуть выбрав правильное значение max_connections.

    P.S. Может я открою для вас Америку, но 4000 запросов это не предел для правильно настроенного Database сервера.

  7. За статью спасибо (послужила поводом ещё раз заглянуть в основной my.cnf), но пара соображений всяко нашлась.

    Кстати, для начала полезно заглядывать в my-large.cnf и my-huge.cnf из поставки/документации.

    > зато FreeBSD умеет эффективно распределять процессы,
    > чего, в свою очередь, не умеет Linux.
    Да ладно сказки-то рассказывать.

    > #chmod 777 /var/log/slow_queries
    Лучше всё-таки посмотреть, под каким пользователем исполняется в итоге mysqld, и отдать ему. Да и по чтению совсем не факт, что публично полезно.

    > НЕ ЗАБЫВАЙТЕ О МОНИТОРИНГОВОМ
    Вы про mytop, collectd или ещё чего? ;-)

    > Возможно какие-то боты “долбят” ваш сервер
    Возможно, пора озадачиться robots.txt для вменяемых, файрволом (или .htaccess) для невменяемых вроде MSNbot, ну и проконсультировать отзывчивых вроде гугльбота о том, как часто надо тормошить или весь сайт, или постранично. Google Webmaster Tools в помощь с последним.

    PS: не нашёл про: join_buffer_size (~sort_buffer_size), read_buffer_size, ft_min_word_len (скажем, 3–4), myisam_recover, а также что-нить вроде

    [myisamchk]
    key_buffer = 512M
    key_buffer_size = 128M
    sort_buffer_size = 512M
    read_buffer = 4M
    write_buffer = 4M

  8. 2: Michael Shigorin:

    Хочется ответить на справедливые замечания :) :

    >> зато FreeBSD умеет эффективно распределять процессы,
    >> чего, в свою очередь, не умеет Linux.
    > Да ладно сказки-то рассказывать.
    В данном случае не имеется в виду, что Linux чего-то совсем не умеет или FreeBSD в чем-то совсем отсталая система. Имеется в виду, что Linux и FreeBSD используют различные модели для реализации потоков и процессов. Более подробно об этом можно почитать на специализированных сайтах, например для потоков: http://dev.mysql.com/doc/refman/5.0/en/thread-packages.html. К сожалению MySQL изначально была ориентирована на Linux системы, связано это было с предпочтениями разработчиков MySQL. Например, по некоторым отзывам в течении нескольких лет в MySQL вообще не уделялось внимание FreeBSD (разработчики которые этим занимались покинули компания MySQL, правда это было до 2005 года). Я надеюсь, что на текущий момент, с выходом FreeBSD 7.0, большая часть проблем с FreeBSD решена.

    >> НЕ ЗАБЫВАЙТЕ О МОНИТОРИНГОВОМ
    > Вы про mytop, collectd или ещё чего? ;-)
    Да, в частности можно использовать тот же Nagios как систему высокоуровневого мониторинга стабильности работы серверов. Все зависит от того, насколько глубоко вы хотите копать историю проблем с MySQL. В самом простом случае полезно будет знать просто о фактах отказов MySQL.

  9. Dr.Stas says:

    Отлично собрано.
    И ко всему выше сказанному, давайте не забывать о безопасности и пускать клиентов в рута только с локалхоста, ну а остальным – бог в помощь :)
    Jail рулит.

  10. SeoCoder says:

    Помогите настроить mysql на fulltext поиска. База очень большая – 10 гигов.

  11. Я бы не рекомендовал использовать полнотекстовую индексацию для построения системы поиска. Причина одна, при большом количестве данных это работает медленно, или вообще не работает :( .

    В качестве альтернативы предлагаю ознакомиться со статьей: http://habrahabr.ru/blog/webdev/48313.html

    От себя порекомендовал бы Sphinx.

  12. Макс says:

    Opened_tables – сколько вообще открывалось, нужно использовать Open_tables :)

  13. Bethrezen says:

    В мемориз. Но хотелось бы ещё дополнения по оптимизации настроек innoDb

  14. Ruslan says:

    Добрый день. Как оптимизировать MySQL для ISP PRO ?

  15. To: Eugene A. Kalosha

    Для полнотекстового поиска – значительно лучше подойдет PostgreSQL.
    Скорость и качество поиска будут в разы выше!

  16. Maxim says:

    Добрый день!
    Огромное спасибо за статью.
    Судя по комментариям, возможно есть некоторые нюансы, но я считаю статью очень полезной, особенно для тех, кто не сталкивался с тонкой настройкой MySQL.
    Во всяком случае есть направление – “куда копать”.
    На сегодня для меня лично это очень актуально, на VPS есть проблема с производительность – статья очень помогла разобраться с проблемой.

    Еще раз, спасибо.

  17. mcwees says:

    Очень пользительно, спасибо.
    Вот чего не осилил:

    qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)

    Можно пояснить детальнее? что есть qcache_inserts?

  18. mcwees says:

    Вот я нашел:
    - Qcache_free_memory – объем свободной памяти, отведенной под кэш.
    - Qcache_hits – количество запросов, отработанных из кэша.
    - Qcache_inserts – количество вставок запросов в кэш.
    - Qcache_lowmem_prunes – количество высвобождений памяти из-за наполненности кэша.
    - Qcache_not_cached – количество запросов, не подлежащих кэшированию.
    - Qcache_queries_in_cache – количество запросов, находящихся в кэше в настоящее время.

    Если я правильно понял, то ratio будет выглядеть как
    Qcache_hits /Qcache_queries_in_cache

  19. Думаю это ратио будет немного больше, чем qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)
    Так как Qcache_queries_in_cache будет заведомо меньше суммарного количества: qcache_hits + qcache_inserts + qcache_not_cached

  20. mcwees says:

    Заведомо меньше. Но вот сколько я не наблюдаю, картина у меня примерно следующая:

    Qcache_hits 274
    Qcache_inserts 1231
    Qcache_not_cached 711
    Qcache_queries_in_cache 833

    если считать по вашей формуле – 274/(274+1231+711) = .12365, т.е. 12%. Как вообще по этой формуле можно получить более 30%? Ведь Qcache_inserts всегда большt, чем Qcache_hits, т.е. выходит как минимум формула

    x/(x+2х) => 1/3. Т.е. если пользоваться вашей формулой, мы _в принципе_ не можем получить больше 33%.

    Замечу так же, что совершенно нереально получить ситуацию, чтобы hits были больше и равны queries_in_cache. Т.е. уже тут мы _никогда_ не получим 100%.

  21. mcwees says:

    Ну и отдельная тема – Qcache_not_cached – почему их надо учитывать, если считается, что они в принципе некешируемые?

  22. mcwees says:

    Вдумавшись, я прихожу к выводу, что из приведенных данных ratio не посчитаешь (или надо допускать, что занчение может быть больше 1) – стоит представить ситуацию, когда в кеше лежат 100 запросов, а хитов имеется 1000. Это говорит о том, что усредненно каждый из имеющихся запросов отдавался из кеша 10 раз. Разве это не ratio=10?

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

    Я так думаю.

  23. хм, вообще это формула эффективности Кэша. 100% эффективности (все запросы используют Кэш) может быть в случае отсутствия инсерт запросов и отсутствие не закешированных запросов.
    Это показатель эффективности работы, который рассчитывается исходя из состояния вашего сервера, и показывает какое количество из всех запросов работают с кэшом.

  24. GOJA says:

    Оно конечно человек старался, спасибо, но таки надо доки читать.
    thread_concurrency запрещена начиная с 5.6 версии, ну да бог с этим фактом. Важнее что этот параметр только для Solaris :-)

    This variable is specific to Solaris systems, for which mysqld invokes the thr_setconcurrency() with the variable value. This function enables applications to give the threads system a hint about the desired number of threads that should be run at the same time.

  25. Aleksey says:

    Не могу понять… где я ошибся… машина с общим объемом памяти 10Gb.

    [client]
    port = 3306
    socket = /var/lib/mysqld/mysqld.sock
    default-character-set = utf8
    [mysqld_safe]
    socket = /var/lib/mysqld/mysqld.sock
    nice = 0

    [mysqld]

    server-id = 1
    user = mysql
    pid-file = /var/run/mysqld/mysqld.pid
    socket = /var/lib/mysqld/mysqld.sock
    #port = 3306
    basedir = /usr
    datadir = /var/lib/mysql
    tmpdir = /var/tmp-mysql
    #tmpdir = /tmp
    skip-external-locking
    query_cache_size = 512M
    query_cache_limit = 256M
    table_cache = 4096
    thread_cache_size = 64
    max_heap_table_size = 128M
    tmp_table_size = 128M

    innodb_data_home_dir = /var/lib/mysql
    innodb_data_file_path = ibdata1:10M:autoextend:max:10G

    innodb_buffer_pool_size = 5144M

    innodb_thread_concurrency = 12

    innodb_additional_mem_pool_size = 40M
    innodb_log_file_size = 64M
    innodb_log_buffer_size = 4M
    read_buffer_size = 32M
    key_buffer_size = 3072M
    sort_buffer_size = 128M
    read_rnd_buffer_size = 2M
    join_buffer_size = 256M

    innodb_flush_log_at_trx_commit = 2
    innodb_flush_method = O_DIRECT
    transaction-isolation = READ-COMMITTED
    default-storage-engine = innodb
    bind-address = 0.0.0.0
    max_allowed_packet = 64M
    thread_stack = 128K
    myisam-recover = BACKUP

    binlog_cache_size = 64M
    log_bin = /var/log/mysql/mysql-bin
    binlog_format = MIXED
    binlog_do_db = mydb

    slave-compressed = 1

    expire_logs_days = 10
    max_binlog_size = 100M
    max_connections = 1000
    default-character-set = utf8
    character-set-server = utf8
    collation-server = utf8_general_ci
    init-connect = “SET NAMES utf8″
    skip-character-set-client-handshake

    [mysqldump]
    quick
    quote-names
    max_allowed_packet = 32M
    default-character-set = utf8

    [mysql]

    [isamchk]
    key_buffer = 3072M

Leave a Reply