Задать вопрос

Почему mySQL постоянно уходит в swap?

Есть Ubuntu 12.04 server c 8GB памяти. На нем стоит mysql 5.5.24-0ubuntu0.12.04.1-log
Конфиг вот такой

key_buffer              = 128M
thread_stack            = 256K
thread_cache_size       = 8
myisam-recover         = BACKUP
table_cache            = 8192
table_definition_cache = 8192
max_heap_table_size    = 256M
query_cache_limit       = 8M
query_cache_size        = 128M
open_files_limit=10000
innodb_buffer_pool_size = 2GB
innodb_additional_mem_pool_size = 80M
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_file_size = 256M
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_file_per_table

expire_logs_days        = 10
max_binlog_size         = 100M
log-error = /var/log/mysql/mysqld.err


Спустя несколько дней после перезапуска уходит в свап, хотя по параметрам конфига памяти должно хватать с запасом. На сервере крутится порядка 1500 небольших баз данных.
  • Вопрос задан
  • 11555 просмотров
Подписаться 15 Оценить 2 комментария
Решения вопроса 1
script88
@script88
Слишком много! Надо попробовать уменьшить
table_cache            = 8192
table_definition_cache = 8192


query_cache_limit       = 8M уменьшите до 2M
innodb_buffer_pool_size - желательно ставить по объему страниц
max_heap_table_size    = 256M уменьшите до 64M


а также добавьте
tmp-table-size = 64M


временные таблицы – в памяти
tmpdir = /dev/shm
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@Nail
У InnoDB есть свой справочник таблиц, который оно держит в памяти. Там содержится инфа обо всех открывавшихся таблицах, в стандартной версии MySQL он никогда не очищается — отсюда рост памяти.

В Percona xtradb против этого добавили настройку innodb_dict_size_limit
www.percona.com/doc/percona-server/5.5/management/innodb_dict_size_limit.html

Once a table is opened, it is never removed from the data dictionary unless you drop the table or you restart the server. In some cases, the data dictionary grows extremely large. If this consumes enough memory, the server will begin to use virtual memory. Use of virtual memory can cause swapping, and swapping can cause severe performance degradation. By providing a way to set an upper limit to the amount of memory the data dictionary can occupy, this feature provides users a way to create a more predictable and controllable situation.
Ответ написан
Комментировать
@balloon
Исходя из Innodb_buffer_pool_pages_free = 0 предположу, что следует увеличить innodb_buffer_pool_size.
Ответ написан
@egorinsk
Так а в чем ваша проблема? MySQL выделяет столько памяти, что ОС вынуждена часть его вытеснить в свап, или MySQL потребляет столько, сколько и должен, просто частично вываливается в свап? Во втором случае вам надо играть с параметрами ядра, отвечающими за swappiness и подобные вещи. В первом — смотреть, почему так много памяти потребляется.
Ответ написан
demimurych
@demimurych
Используйте
mysqltuner.pl/mysqltuner.pl

или аналоги
Ответ написан
pentarh
@pentarh
Одно из двух.

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

Ситуация 2 может возникнуть например, при вашей настройке innodb_buffer_pool_size (2Г) и общим объемом таблиц INNODB в 100М.

innodb_buffer_pool_size должен быть на уровне 130-200% от планируемого объема таблиц. Остальная память попросту может не использоваться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы