Я заметил устойчивое увеличение использования системной памяти в% age (по данным sar), которое я отслеживал в MariaDB. Кажется, это не связано с загрузкой базы данных: это увеличение не сопровождается увеличением числа запросов.
У меня следующая конфигурация размеров:
key_buffer_size = 400000000
innodb_buffer_pool_size = 1210612736
Всего есть 1,5 ГБ, но теперь он превышает 2,3 ГБ для RSS-памяти.
Почему он становится таким жадным? Могу ли я заставить его лучше придерживаться своих пределов? Или, возможно, он придерживается ограничений на InnoDB, но использует память для чего-то еще, если да, есть ли способ понять это, чтобы я мог настроить конфигурацию, чтобы сохранить общее использование памяти на определенном уровне? Или, возможно, это похоже на ядро Linux и просто использует всю свободную память для кеширования, пока она свободна, но с радостью отказывается от нее по мере необходимости?
Я использую MariaDB 10.3.22 на Debian 10 (Buster). Рабочая нагрузка - это веб-сервер (поэтому мне нужно оставить память для других процессов: nginx + php). С радостью выложу дополнительные настройки, если потребуется.
С благодарностью за forumla из-за ответа Гордона и ссылки в нем следующая команда сообщит вам, сколько нужно вашей базе данных MySQL / MariaDB:
SELECT ROUND(
( @@GLOBAL.key_buffer_size
+ @@GLOBAL.query_cache_size
+ @@GLOBAL.tmp_table_size
+ @@GLOBAL.innodb_buffer_pool_size
+ @@GLOBAL.innodb_log_buffer_size
+ @@GLOBAL.max_connections * (
@@GLOBAL.sort_buffer_size
+ @@GLOBAL.read_buffer_size
+ @@GLOBAL.read_rnd_buffer_size
+ @@GLOBAL.join_buffer_size
+ @@GLOBAL.thread_stack
+ @@GLOBAL.binlog_cache_size)
) / 1024 / 1024, 1) `total MB`;
(Я ОП, и это дает мне 2,9 ГБ в качестве общего настроенного использования - пора снизить некоторые цифры!)
Перечисленные вами настройки памяти являются общими. Также существуют различные буферы, которые выделяются для каждого потока. Вот ссылка на калькулятор памяти MySQL:
Если вы хотите ограничить общее использование памяти MariaDB, если вы установили его с apt
/ apt-get
, вы сможете сделать это с помощью systemd.resource-контроль (5).
Вызов с root:
systemctl edit mariadb.service
Введите следующую конфигурацию в появившемся редакторе, измените, если хотите:
[Service]
MemoryMax=1024M
MemorySwapMax=128M
Сохранить и выйти. Он вступает в силу немедленно и поддерживается контроллером памяти cgroup.
Разберем это отдельно:
( @@GLOBAL.key_buffer_size 40M unless using MyISAM tables
+ @@GLOBAL.query_cache_size 0 -- it is mostly useless, esp on production
+ @@GLOBAL.innodb_buffer_pool_size 1G if you have only 3G of ram
No more than 1% of RAM for these:
+ @@GLOBAL.tmp_table_size -- belongs in the group below
+ @@GLOBAL.innodb_log_buffer_size
@@GLOBAL.sort_buffer_size
+ @@GLOBAL.read_buffer_size
+ @@GLOBAL.read_rnd_buffer_size
+ @@GLOBAL.join_buffer_size
+ @@GLOBAL.thread_stack
+ @@GLOBAL.binlog_cache_size)
+ @@GLOBAL.max_connections * ( 100 is probably plenty
Не существует «идеальной» формулы. Сайт mysqlcalculator имеет много недостатков. Как и любой другой сайт, утверждающий, что у него есть формула.
Если вы используете MyISAM (или смесь MyISAM и InnoDB), см. http://mysql.rjweb.org/doc.php/memory