Предложения Mysqltuner и изменения в my.cnf - PullRequest
12 голосов
/ 20 сентября 2010

У меня был этот вопрос на Serverfault в течение нескольких дней безуспешно.

Я запустил mysqltuner.pl на VPS и у меня есть куча вопросов относительно предложений по изменению переменных.Я уверен, что это общие вопросы со сложными ответами.

Я недостаточно разбираюсь в том, чтобы писать запросы и тестировать их на сервере, но я просто пытаюсь повысить производительность сервера, который работаетпять сайтов WordPress с> 200 000 просмотров страниц в месяц.

Я оптимизировал базу данных с помощью phpmyadmin (и делаю это регулярно), но тюнер по-прежнему говорит, что есть фрагментированные таблицы.И поскольку это WordPress, я не могу изменить запросы в основном коде.

Но насколько я должен увеличить переменные, такие как query_cache_size и innodb_buffer_pool_size?А как насчет других переменных innodb?

Некоторые из предложенных переменных не существуют в my.cnf, например, table_cache, и помечены в отчете тюнера и т. Д. Могу ли я добавить их в my.cnf?

(И почему этот блок дублируется в my.cnf? Могу ли я удалить дубликат?)

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

Ниже представлен файл my.cnfи вывод mysqltuner:

Содержимое my.cnf:

query-cache-type = 1
query-cache-size = 8M

set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

old_passwords=1

skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

Выход mysqltuner:

------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.45
[!!] Switch to 64-bit OS - MySQL cannot currently use all of your RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 133M (Tables: 637)
[--] Data in InnoDB tables: 10M (Tables: 344)
[--] Data in MEMORY tables: 126K (Tables: 2)
[!!] Total fragmented tables: 69

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 6h 24m 13s (2M q [22.135 qps], 116K conn, TX: 4B, RX: 530M)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 35.0M global + 2.7M per thread (100 max threads)
[OK] Maximum possible memory usage: 303.7M (8% of installed RAM)
[OK] Slow queries: 0% (4/2M)
[OK] Highest usage of available connections: 53% (53/100)
[OK] Key buffer size / total MyISAM indexes: 8.0M/46.1M
[OK] Key buffer hit rate: 99.6% (749M cached / 2M reads)
[OK] Query cache efficiency: 32.2% (685K cached / 2M selects)
[!!] Query cache prunes per day: 948863
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 660K sorts)
[!!] Temporary tables created on disk: 46% (400K on disk / 869K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 24K opened)
[OK] Open file limit used: 10% (109/1K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[!!] InnoDB data size / buffer pool: 10.6M/2.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Set thread_cache_size to 4 as a starting value
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    query_cache_size (> 8M)
    tmp_table_size (> 32M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)
    table_cache (> 64)
    innodb_buffer_pool_size (>= 10M)

Ответы [ 5 ]

21 голосов
/ 06 октября 2010

Я сделаю все возможное, чтобы помочь здесь. Отчет MysqlTuner подразумевает, что у вас есть 4 ГБ ОЗУ в этом VPS, поэтому мои предложения основаны на этом.

query_cache_size - это объем оперативной памяти, которую MySQL может использовать для кэширования результатов запросов к базе данных. Результаты, хранящиеся в кэше запросов, возвращаются намного быстрее, чем обычные операции выбора, поэтому эта переменная может значительно ускорить процесс (в большей степени, чем любые другие предлагаемые изменения).

Именно то, что правильное значение для вас, потребует некоторых экспериментов. В настоящее время у вас есть этот набор до 8M. Если у вас есть 4 ГБ оперативной памяти в этом окне, я бы начал с 64 МБ, увеличившись до 128 М, а затем, если потребуется, до 256 МБ После каждого изменения оставьте вещи на несколько дней, а затем снова запустите MysqlTuner и сравните процент «эффективности кэширования запросов» с тем, что было раньше. Для сервера, на котором в основном размещено 5 блогов Wordpress, я сомневаюсь, что вы увидите улучшение за пределами 256M, и я бы не рекомендовал выходить за рамки одной восьмой от общего объема ОЗУ.

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

tmp_table_size - для некоторых сложных запросов (особенно тех, которые используют GROUP BY или сложную сортировку), MySQL должен сначала создать временную таблицу, содержащую данные, а затем выполнить некоторые операции над ней, чтобы создать результат задавать. Он попытается создать эти временные таблицы в памяти, поскольку это намного быстрее, чем создание их на диске; но для больших наборов результатов это не всегда возможно. tmp_table_size контролирует этот порог.

Я не могу себе представить, что Wordpress выполняет какие-то чрезвычайно сложные запросы, поэтому я бы не стал зацикливаться на этом. MysqlTuner предлагает значение, превышающее 32 МБ, поэтому начните с 64 МБ и посмотрите, как это повлияет на значение «Временные таблицы, созданные на диске», через несколько дней. Установите max_heap_table_size, пока вы на нем, как это предлагается.

thread_cache_size - Wordpress не использует постоянные соединения по умолчанию (что хорошо), поэтому каждый запрос устанавливает новое соединение с вашей базой данных, а затем закрывает его после создания страницы. Эти издержки не значительны, но использование thread_cache_size позволяет MySQL повторно использовать эти потоки соединения, что немного поможет.

Я бы пошел с предложенным значением 4, которое, я думаю, подойдет, если вы не получите большое количество одновременных пользователей.

table_cache - Я немного запутался, похоже, это связано с кэшем MySQL структуры таблицы. Я бы пошел с 128 для этого.

innodb_buffer_pool_size - это объем памяти, который MySQL может использовать для кэширования индексов и данных для таблиц InnoDB. Это немного озадачивает меня, так как я не думаю, что Wordpress вообще использует InnoDB - есть ли у вас другие сайты на этом сервере?

Чтобы ответить на другие ваши вопросы, конфигурация после [mysqld_safe] применяется только к демону MySQL в безопасном режиме, а не к MySQL в целом, поэтому некоторые переменные дублируются. Если вы измените innodb_buffer_pool_size, вы захотите изменить первый. Переменные, которых нет в файле, вы можете добавить, но добавьте их над блоком [mysqld_safe] по той же причине.

И наконец, поскольку вы настроены на оптимизацию, если вы еще не используете кеш байт-кода PHP, такой как APC , то это стоит изучить. APC может значительно улучшить скорость работы PHP-приложений без каких-либо негативных последствий.

3 голосов
/ 06 октября 2010

Существует множество инструментов для настройки базы данных MySQL: http://www.day32.com/MySQL/ и http://www.maatkit.org/doc/ и http://hackmysql.com/mysqlsla

В большинстве случаев вам не нужно писать запросыи проверить их на сервере.Просто включите медленный журнал запросов, чтобы идентифицировать ваши медленные запросы, объединить их с помощью mysqlsla и объяснить их с помощью maatkit:

Вы можете вставить самые медленные запросы из результатов mysqla в текстовый файл и выполнить их с помощью maatkit.

mk-visual-explain –host hostname –user username –password passwort –database \
databasename -c query1.sql >> query1_data.txt

-

mk-query-profiler –host hostname –user username –password passwort –database \
databasename query1_data.txt >> query1_data.txt

Часто охлаждение новой версии mysql имеет решающее значение для производительности.Я понял, что планы выполнения сложных запросов сильно отличаются, когда вы сравниваете, например, mysql 5.0.23 с 5.1.4.Они выполняются в нашей среде намного быстрее с 5.1.4.

Много полезной информации о mysql можно найти в http://www.mysqlperformanceblog.com/ и в книге "High Performance MySQL".

Tabe Cache: Согласно книге "в кэше таблиц хранятся объекты, представляющие таблицы. Каждый объект в кэше содержит проанализированный файл .frm связанной таблицы плюс другие данные, в зависимости от механизма хранения таблицы.

Дизайн кэша таблиц немного ориентирован на MyISAM - это одна из областей, где разделение между сервером и механизмом хранения не является полностью чистым по историческим причинам. Кэш таблиц немного менее важен для InnoDB,потому что InnoDB не полагается на него для стольких целей (таких как хранение дескрипторов файлов; для этого у него есть собственная версия кэша таблиц). Однако даже InnoDB извлекает выгоду из кэширования проанализированных файлов .frm. ".

Если вы подняли кеш таблицы, могут быть ошибки с ограничением количества открытых файлов.Вам также необходимо увеличить переменную open_files_limit на сервере и, возможно, лимит открытых файлов операционной системы: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/.

Кэш потоков:

Кэш потоков содержит потокикоторые в настоящее время не связаны с соединением, но готовы обслуживать новые соединения.Пока MySQL имеет свободный поток в кеше, он может очень быстро отвечать на запросы на подключение, потому что ему не нужно создавать новый поток для каждого подключения.

[!!] Временные таблицы, созданные на диске: 46% (400 КБ на диске / всего 869 КБ) Если tmp_table_size и max_heap_table_size еще не установлены, увеличьте их.Дисковые операции очень медленные по сравнению с RAM-операциями.WordPress использует много столбцов BLOB / текст?тогда вы не увидите особых преимуществ, поскольку столбцы BLOB и Text не допускаются в таблицах памяти.

[OK] Максимальное использование доступных соединений: 53% (53/100) Ксохранить оперативную память вы можете уменьшить максимально допустимое количество подключений.С другой стороны, в пиковые моменты времени у вас могут заканчиваться соединения.

Использование кэша кода операции для PHP - очень хорошая идея!

0 голосов
/ 27 декабря 2011

Это должно помочь, гораздо проще, чем пытаться изменить my.cnf

0 голосов
/ 06 октября 2010

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

Посмотрите, например, на "общий кэш w3". Использование его с APC должно быть самым простым подходом. Убедитесь, что вы ознакомились с размером apc.shm_size (в php.ini) и коэффициентом попадания в кеш (некоторая утилита apc info должна поставляться с w3tc).

Я видел, как экземпляры WordPress работали без проблем на одном сервере с такой настройкой и более чем 200 000 просмотров страниц в месяц.

0 голосов
/ 20 сентября 2010

Мои рекомендации по настройке MySQL для WP:

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

Я рекомендую использовать WP-DBManager Плагин, который обеспечивает эту функциональность, а также резервное копирование базы данных, все критически важные для любой установки блога.

WP-DBManager позволяет планировать и забывать, и он позаботится обо всей работе автоматически.

Другой альтернативой является ручная оптимизация и восстановление таблицы с помощью такого инструмента, как phpmyadmin .

MySQL Query Cache сохраняет результаты запросов в случае, если запрос приходит снова.Однако он знает только, как сохранять байтовый текст запросов, а не их скомпилированные версии, поэтому небольшие изменения в запросе создадут разные записи в кэше.Включите, если у вас нет уникальных идентификаторов в каждом запросе.Вы можете включить его, добавив следующее в /etc/my.cnf:

query_cache_type = 1
query_cache_size = 26214400
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...