Mysql высокое использование памяти и использование подкачки

У меня есть база данных объемом 1,6 ГБ, которая ежемесячно добавляет около 200 МБ. У меня 12 ГБ ОЗУ (используется совместно с apache, mysql и os), mysql всегда использует swap, который мне нужен для перезапуска службы, как только она достигает предела пространства подкачки. Типичное использование памяти процессом mysql составляет 3,5 ГБ и увеличивается до 4,5 ГБ, когда на моем веб-сервере много активности.

  1. Как я могу избежать MySQL, используя своп?
  2. Нормально ли использование памяти процесса mysql 3,5 ГБ для базы данных размером 1,6 ГБ?
  3. Мой конфиг mysql выглядит следующим образом, моя конфигурация оптимизирована?
[mysqld]
innodb_file_per_table
datadir=/var/lib/mysql
tmpdir=/var/lib/mysqltmp
socket=/var/lib/mysql/mysql.sock
skip-locking
skip-name-resolve
table_cache=3072
thread_cache_size=16
back_log=100
max_connect_errors=10000
open-files-limit=20000
interactive_timeout=30
wait_timeout=40
max_connections=100
skip-name-resolve
max_allowed_packet=16M
tmp_table_size=1768M
max_heap_table_size=1768M
query_cache_size=64M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=32M
key_buffer_size=64M
myisam_sort_buffer_size=64M
innodb_log_file_size=100M
innodb_buffer_pool_size=1512M

1 ответ

Решение

Скорее всего виновником являются эти настройки:

tmp_table_size=1768M
max_heap_table_size=1768M

Это означает, что каждая отдельная временная таблица, созданная по запросу на вашем веб-сайте, может занимать до 1768 мегабайт памяти или 1,7 ГБ.

Я бы уменьшил их до 64M. Это уменьшит использование памяти, но может также заставить MySQL записывать данные временных таблиц для запросов на диск, что замедлит процесс.

Если MySQL часто использует диск для временных таблиц, вам нужно проанализировать ваше приложение и выяснить, где находятся запросы, которые генерируют большие временные таблицы, а затем реорганизовать код, чтобы большие временные таблицы не требовались.

Другие вопросы по тегам