Назад | Перейти на главную страницу

Как настроить сервер MySQL, когда ожидается большой пик использования

У меня довольно большие проблемы с настройкой моего сервера MySQL. Я ожидал, что на моем веб-сайте будет много людей после того, как я куплю телевизионную рекламу между 17:00 и 18:00, в то время у меня на веб-сайте было более или менее 300 человек в этот период. Я пробовал много настраивать в my.cnf, но каждую ночь все хуже и хуже ... Я был бы очень признателен за помощь, чтобы выяснить, в чем моя проблема ... Моя текущая инфраструктура следующая:

Один сервер для моего сайта

Один сервер для моей БД

Вот моя текущая конфигурация my.cnf:

innodb_file_per_table           = 1
innodb_buffer_pool_instances    = 13
innodb_buffer_pool_size         = 13375M
innodb_open_files               = 300
innodb_thread_concurrency       = 0
#innodb_read_io_threads          = 8
#innodb_write_io_threads         = 8
#innodb_flush_method             = O_DIRECT
#join_buffer_size                               = 30M
#sort_buffer_size                               = 10M
#read_buffer_size                               = 10M

wait_timeout                    = 180
interactive_timeout             = 180

max_connections                 = 250
max_heap_table_size             = 256M
tmp_table_size                  = 256M
table_cache                     = 20000
table_definition_cache          = 20000
#table_open_cache               = 20000
query_cache_type                = 0

И результаты mysqltuner:

 >>  MySQLTuner 1.6.9 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
[--] Performing tests on 127.0.0.1:3306
[OK] Logged in using credentials passed on the command line

[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.38-0+wheezy1-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -----------------------------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA
[--] Data in MyISAM tables: 32M (Tables: 126)
[--] Data in InnoDB tables: 10G (Tables: 1503)
[!!] Total fragmented tables: 359

-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 1m 59s (82K q [695.832 qps], 335 conn, TX: 538M, RX: 34M)
[--] Reads / Writes: 99% / 1%
[--] Binary logging is disabled
[--] Total buffers: 13.8G global + 2.7M per thread (300 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 13.9G (44.07% of installed RAM)
[OK] Maximum possible memory usage: 14.6G (46.49% of installed RAM)
[OK] Slow queries: 0% (1/82K)
[OK] Highest usage of available connections: 3% (11/300)
[OK] Aborted connections: 0.60%  (2/335)
[OK] Query cache is disabled by default due to mutex contention.
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 14K sorts)
[!!] Joins performed without indexes: 131
[OK] Temporary tables created on disk: 5% (927 on disk / 17K total)
[OK] Thread cache hit rate: 96% (11 created / 335 connections)
[OK] Table cache hit rate: 25% (1K open / 6K opened)
[OK] Open file limit used: 0% (301/40K)
[OK] Table locks acquired immediately: 100% (221K immediate / 221K locks)

-------- ThreadPool Metrics ------------------------------------------------------------------------
[--] ThreadPool stat is disabled.

-------- Performance schema ------------------------------------------------------------------------
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B

-------- MyISAM Metrics ----------------------------------------------------------------------------
[!!] Key buffer used: 18.2% (763K used / 4M cache)
[OK] Key buffer size / total MyISAM indexes: 4.0M/10.6M
[OK] Read Key buffer hit rate: 100.0% (562K cached / 0 reads)
[OK] Write Key buffer hit rate: 100.0% (14K cached / 0 writes)

-------- AriaDB Metrics ----------------------------------------------------------------------------
[--] AriaDB is disabled.

-------- InnoDB Metrics ----------------------------------------------------------------------------
[--] InnoDB is enabled.
[OK] InnoDB buffer pool / data size: 13.1G/10.7G
[OK] InnoDB buffer pool instances: 13
[!!] InnoDB Used buffer: 5.30% (45409 used/ 855985 total)
[OK] InnoDB Read buffer efficiency: 99.95% (85810161 hits/ 85850600 total)
[!!] InnoDB Write Log efficiency: 61.42% (519 hits/ 845 total)
[OK] InnoDB log waits: 0.00% (0 waits / 326 writes)

-------- TokuDB Metrics ----------------------------------------------------------------------------
[--] TokuDB is disabled.

-------- Galera Metrics ----------------------------------------------------------------------------
[--] Galera is disabled.

-------- Replication Metrics -----------------------------------------------------------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] This is a standalone server.

-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Adjust your join queries to always utilize indexes
Variables to adjust:
    join_buffer_size (> 128.0K, or always use indexes with joins)

В часы пик вот free -m :

             total       used       free     shared    buffers     cached
Mem:         32202      25261       6940          0        917      18794
-/+ buffers/cache:       5549      26652
Swap:         1532         21       1511

Я использую Prestashop для своего веб-сайта, и у меня есть довольно большая таблица… Я заархивирую и обрежу большую ее часть на этих выходных. Например :

SELECT COUNT(*) FROM ps_connections; => 1 330 373
SELECT COUNT(*) FROM ps_guest; => 6 970 248

Если у вас есть совет, было бы здорово! Спасибо Жюльен

NB: извините за мой плохой английский

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

1) У вас 32 ГБ ОЗУ, но вы используете только 14 ГБ для MySQL на выделенной машине. Почему бы не дать больше? Предполагается, что 75% ОЗУ должно использоваться MySQL на выделенном хосте (innodb_buffer_pool_size), но вы должны сначала проверить top, vmstat или любой долгосрочный мониторинг, чтобы убедиться, что есть запас для других служб или случайных событий, таких как резервное копирование. Примечание. Linux всегда выглядит так, как будто у него «закончилась RAM», потому что он динамически использует любую свободную RAM для буферов и кеша - как показывает ваш пример.

2) innodb_flush_method - большой фактор производительности, ваш параметр закомментирован, поэтому я не могу узнать фактическое (по умолчанию) значение. Проверьте переменные сервера, чтобы узнать, что это такое. Но - его изменение оказывает большое влияние на вашу целостность в случае сбоя.

3) У вас много фрагментированных таблиц. Это может привести к потере производительности - если они сильно фрагментированы. Есть много других сообщений [1], в которых обсуждается определение того, насколько фрагментированы таблицы и требуется ли дефрагментация, но, опять же, это немного сложно с разными механизмами хранения и таблицей для каждого файла и т. Д. Чтобы дефрагментировать их, вы можете использовать оптимизацию или alter, чтобы перестроить таблицу (конечно, они заблокируют таблицы, поэтому вам нужно убедиться, что это быстро, потренировавшись или организовав отключение).

1 [Как найти и исправить фрагментированные таблицы MySQL

4) «Соединения выполнены без индексов» - это может быть вашей самой большой проблемой, хотя 131 звучит не очень высоко.

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

Однако для решения этой проблемы вам необходимо найти запросы, проанализировать их, а затем соответственно добавить индексы. Чтобы найти запросы, я бы начал с журнала медленных запросов: у вас не так много медленных запросов, поэтому я предполагаю, что медленный порог установлен слишком высоко? Так что если вы можете снизить это значение, начните отбирать медленные запросы и анализировать их. Используя команду EXPLAIN, вы сможете увидеть, как в JOINS отсутствуют индексы (хотя понимание EXPLAIN - это отдельная тема). Тогда добавление индексов несложно, но также имеет свои плюсы и минусы (например, вставки могут выполняться медленнее, слишком много индексов может отрицательно повлиять на производительность), плюс процесс индексирования заблокирует таблицу на время.

Также есть проблемы с метриками буфера, но в настоящее время я не знаю об этом (это то, что привело меня к этому вопросу - у меня такая же проблема с эффективностью записи журнала, которую я еще не понимаю).