Tenho um cluster de servidores de BD Primário->Primário executando o MariaDB 11.4.5. O SO neles foi atualizado do Ubuntu 22.04 para o 24.04 ontem, pois parecia haver algum tipo de vazamento de memória que ocasionalmente fazia com que o OOM Killer matasse o banco de dados e isso parecia uma coisa lógica a se tentar. A versão do BD permaneceu a mesma em todas as atualizações do SO.
Infelizmente, desde então, o aplicativo está consumindo toda a memória disponível no servidor até que o reiniciemos ou ele seja eliminado pelo OOM killer.
Os servidores tinham 40 GB de RAM disponíveis e 11 GB de swap. Usando este SQL (encontrado em outro thread do SE DB
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`;
A quantidade máxima de memória que deve ser usada é 15 GB. Estou usando btop para assistir os servidores e MemB está atualmente em 35 GB (e subindo)
Voltei ao artigo da KB aqui - https://mariadb.com/kb/en/mariadb-memory-allocation/ e atualizei estas configurações:
query_cache_size= 0 query_cache_type = DESLIGADO key_buffer_size = 10M
e defina o seguinte no servidor Defina swappiness para 5 Desativado Numa
Também alterei as configurações do systemd para o serviço mariadb para ter:
LimitNOFILE=100000
LimitMEMLOCK=524288
# Set maximum allowed memory
MemoryMax=26GB
MemorySwapMax=8GB
OOMScoreAdjust=-600
BlockIOWeight=1000
TasksMax=99%
Nice=-5
Environment=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
A saída das variáveis de exibição está disponível aqui - https://docs.google.com/spreadsheets/d/1ev9KRWP8l54FpRrhFeX4uxFhJnOlFkV4_vTCZWipcXA/edit?usp=sharing
O que mais pode estar causando isso?
Notei nos logs de erros que, mesmo que o ouvinte de eventos de pressão de memória do InnoDB seja iniciado, ele nunca é chamado até que a memória do servidor esteja prestes a acabar.
Também aumentei a RAM do servidor para 50 GB, mas isso é mais um emplastro do que uma solução, para me dar tempo de investigar mais a fundo.
Obrigado Derick
Editar - o link agora também tem saída de show global status; e show engine innodb status;