由于 mysql 内存持续增长,远超理论最大内存,使用 jemalloc 进行统计
[mysqld_safe]
malloc-lib=/usr/lib64/libjemalloc.so
一段时间后 jemalloc 的 stats 如下
Allocated: 5886533096, active: 6123192320, metadata: 137662464 (n_thp 0), resident: 10975715328, mapped: 11279020032, retained: 3251097600
然而使用 top 可以看到 mysql 进程为
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6204 mysql 20 0 26.9g 21g 14m S 17.3 17.5 214:25.46 mysqld
为什么两者显示进程的内存大小差距这么大?可能有部分内存申请不走 jemalloc 吗
mysql 版本 5.7.22
jemalloc 版本 5.2.1
1
louettagfh 2020-07-25 09:52:50 +08:00
buffer pool 配置了多大, MySQL 的 buffer pool 是 mmap 映射
|
2
louettagfh 2020-07-25 09:53:38 +08:00
"远超理论最大内存" 这个理论最大内存你是哪里得出的?
|
3
ksedz OP @louettagfh buffer pool 配置的 12G
内存计算用的这个: key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + max_connections * (sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size) 其中 max_connection 设置的 1600,实际连接 980 左右,总耗用内存大概应该是 32M + 64M + 24M + 12G + ? + 32M + 1600 x (4M + 2M + 3M + 6M + 192K + 512K) 约等于 37G 线上有的可以到 60G 测试环境有个连接数设置为 200,最大内存应该在 16G 左右,实际使用内存也达到了 23G,想定位多出来的这些是内存泄漏还是没有来得及回收。 |