O processo mysql parece não ter limite de ram. Eu tentei um tamanho de buffer pool de 9gb e ele travou (eu tenho 13 gb de ram), agora são 7gb e o problema continua. O perfil de ram usando preformance_schema diz que ele não deve usar mais do que 9,6 gb de ram, nenhuma variável em performance_schema parece consumir muita memória. Mas o processo mysqld consome quase 12 gb e cresce
A configuração do mysql se parece com isso:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /var/lib/mysql/mysql.sock
mysql_native_password=ON
# Basic Settings
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
pid-file = /var/run/mysqld/mysqld.pid
# log_error = /var/log/mysql/error.log
# Server Performance
skip-name-resolve
max_connections = 3000
table_open_cache = 4000
table_open_cache_instances = 8
thread_cache_size = 50
# Memory Settings
innodb_buffer_pool_size = 9G
innodb_buffer_pool_instances = 9
innodb_log_file_size = 2G # Adjust this based on your transaction log needs
innodb_log_buffer_size = 64M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_thread_concurrency = 16
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 250
innodb_io_capacity_max = 500
innodb_purge_threads = 4
# Caching and I/O
# query_cache_type = 0
# query_cache_size = 0
tmp_table_size = 256M
max_heap_table_size = 256M
# join_buffer_size = 16M
# sort_buffer_size = 4M
# read_buffer_size = 4M
# read_rnd_buffer_size = 8M
# Character Set and Collation
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# Binary Logging - Recommended for Replication and Point-in-Time Recovery
# log_bin = /var/log/mysql/mysql-bin.log
# expire_logs_days = 7
# sync_binlog = 1
# binlog_format = ROW
# Error Log Settings
# log_error_verbosity = 3
# Security
max_allowed_packet = 64M
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
innodb_strict_mode = 1
# Additional Settings
performance_schema = ON
event_scheduler = ON
default_storage_engine = InnoDB
# Adjusting InnoDB Autoinc Lock Mode
innodb_autoinc_lock_mode = 2
[mysqldump]
quick
quote-names
[mysql]
no-auto-rehash
Não quero dizer que ele não deva consumir mais memória do que o buffer_pool_size. Usando esta consulta, calculo o uso total de ram:
SELECT
@@innodb_buffer_pool_size AS innodb_buffer_pool_size,
@@innodb_log_buffer_size AS innodb_log_buffer_size,
@@key_buffer_size AS key_buffer_size,
@@tmp_table_size AS tmp_table_size,
@@max_connections * (
@@read_buffer_size +
@@read_rnd_buffer_size +
@@sort_buffer_size +
@@join_buffer_size +
@@binlog_cache_size +
@@thread_stack
) AS max_connections_memory,
(@@innodb_buffer_pool_size +
@@innodb_log_buffer_size +
@@key_buffer_size +
@@tmp_table_size +
@@max_connections * (
@@read_buffer_size +
@@read_rnd_buffer_size +
@@sort_buffer_size +
@@join_buffer_size +
@@binlog_cache_size +
@@thread_stack
)) AS total_memory_usage
\G
E a saída:
innodb_buffer_pool_size: 6039797760
innodb_log_buffer_size: 67108864
key_buffer_size: 8388608
tmp_table_size: 1000000
max_connections_memory: 99942400
total_memory_usage: 6216237632
A saída não é a mesma do mysqlconfig porque eu fiz buffer_pool_size menor e reduzi o max_connections para que ele não consuma toda a memória disponível. Se a consulta estiver correta, ela deve usar no máximo cerca de 6,5 gb, mas usa 10, 11 e cresce
A versão do MySQL é 8.4.0