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

MySQL: как уменьшить «Максимально возможное использование памяти»?

Недавно у меня были проблемы с перебоями из-за нехватки памяти. (Всего у моего 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 может сэкономить вам много часов.