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

Использование памяти MariaDB превышает настроенный размер

Я заметил устойчивое увеличение использования системной памяти в% 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:

https://www.mysqlcalculator.com/

Если вы хотите ограничить общее использование памяти 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