Недавно у меня были проблемы с перебоями из-за нехватки памяти. (Всего у моего VPS 256M)
Я пытаюсь настроить MySQL с помощью mysqltuner.pl и получаю следующие результаты:
-------- General Statistics -------------------------------------------------- [--] Skipped version check for MySQLTuner script [OK] Currently running supported MySQL version 5.0.51a-3ubuntu5.4-log [OK] Operating on 64-bit architecture -------- Storage Engine Statistics ------------------------------------------- [--] Status: +Archive -BDB -Federated -InnoDB -ISAM -NDBCluster [--] Data in MyISAM tables: 114M (Tables: 454) [!!] Total fragmented tables: 34 -------- Performance Metrics ------------------------------------------------- [--] Up for: 40s (570 q [14.250 qps], 23 conn, TX: 154K, RX: 23K) [--] Reads / Writes: 100% / 0% [--] Total buffers: 338.0M global + 2.7M per thread (20 max threads) [!!] Maximum possible memory usage: 392.9M (153% of installed RAM) [OK] Slow queries: 0% (5/570) [OK] Highest usage of available connections: 15% (3/20) [!!] Key buffer size / total MyISAM indexes: 8.0M/9.4M [!!] Key buffer hit rate: 57.1% (7 cached / 3 reads) [OK] Query cache efficiency: 21.9% (7 cached / 32 selects) [OK] Query cache prunes per day: 0 [OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1 sorts) [OK] Temporary tables created on disk: 0% (0 on disk / 32 total) [OK] Thread cache hit rate: 86% (3 created / 23 connections) [OK] Table cache hit rate: 26% (128 open / 484 opened) [OK] Open file limit used: 25% (259/1K) [OK] Table locks acquired immediately: 100% (492 immediate / 492 locks) -------- Recommendations ----------------------------------------------------- General recommendations: Run OPTIMIZE TABLE to defragment tables for better performance MySQL started within last 24 hours - recommendations may be inaccurate Reduce your overall MySQL memory footprint for system stability Variables to adjust: *** MySQL's maximum memory usage is dangerously high *** *** Add RAM before increasing MySQL buffer variables *** key_buffer_size (> 9.4M)
Но я немного не понимаю, как снизить максимальное использование памяти? Кажется, это основано на key_buffer и max_connections, но должно же быть что-то еще?
my.cnf:
key_buffer = 8M max_allowed_packet = 12M thread_stack = 128K thread_cache_size = 8 max_connections = 20 table_cache = 128 tmp_table_size = 256M max_heap_table_size = 256M join_buffer_size = 256K query_cache_limit = 8M query_cache_size = 64M
Я пытался прочитать статьи по настройке MySQL, но, похоже, они ориентированы на людей, которые уже знают, что делают! Любая помощь будет оценена. Спасибо!
У вас есть сервер с 256 МБ, но вы не можете использовать все это - помните, что есть некоторые накладные расходы ОС. Добавьте к этому тот факт, что вы слишком много совершаете, как уже упоминали другие люди, и вы определенно разберетесь здесь. 256 МБ достаточно только для небольшой БД, 20 подключений - это много с тем, что вы настроили.
1) уменьшите максимальное количество подключений до 4 (вы используете 3 из 20)
2) лучше оптимизировать кеш запросов; 8 миллионов действительно большие, а всего 64 миллиона - это много, если судить по количеству просмотров / чернослива; попробуйте комбинацию 4/32 и посмотрите, как получится. На самом деле я думаю, что вам подойдет комбинация 2/24.
3) у вас нет сортировок, требующих временных таблиц, почему там глагол max_heap_table_size? Закомментируйте это, используйте значения по умолчанию
4) у вас вообще 128 таблиц? Попробуйте сократить этот table_cache пополам до 64 или 48
5) уменьшите thread_cache_size до 4
6) оптимизируйте эти таблицы, чтобы уменьшить фрагментацию
Вот с чего стоит начать. Похоже, вы добавили кучу чисел в конфигурацию без какого-либо фактического профилирования, чтобы знать, что вам нужно, и создали беспорядок; если ничего не помогает, вернитесь к значениям по умолчанию, избавьтесь от своих пользовательских настроек и начните заново, используя некоторые руководства по настройке производительности, которые вы можете найти в Google. Получите выходные данные SHOW VARIABLES и SHOW STATUS, найдите любое из руководств по настройке bajillion и вставьте свои фактические, действительные числа в их уравнения, и они сообщат вам точные числа, которые вам нужно ввести в файл конфигурации.
Я не гуру MySQL и не могу диагностировать проблему с помощью этой информации, но я попытался найти формулу в исходном коде. Вот:
server_buffers + total_per_thread_buffers * max_connections
Куда:
server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size
и:
total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size
Теперь вам нужно проверить каждое из этих значений и выяснить, какое из них отвечает за это огромное количество. И не доверяйте этому сценарию безоговорочно - я попытался запустить его на одном из моих серверов БД, и он подсчитал, что максимальный объем памяти составляет 140% от общего объема физической памяти, но система работала годами без каких-либо проблем со стабильностью.
Удачи!
Если я правильно помню, MySQL Tuner использует следующую формулу для оценки максимального использования:
read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size
Имейте в виду, что это не на 100% правильно, и на самом деле это всего лишь оценка, поскольку некоторые настройки в MySQL не имеют определенного ограничения.
Вы можете уменьшить некоторые настройки в файле конфигурации и снова запустить тюнер, но я бы посоветовал обратиться за помощью к специалисту, если у вас нет времени тратить зря на изменение my.cnf, его перезапуск и запуск тюнера.
Использование программного обеспечения mysqlcalculator.com может сэкономить вам много часов.