mysql 使用 jemalloc 后内存统计结果和 top 得到不一致

2020-07-24 17:44:16 +08:00
 ksedz

由于 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

1685 次点击
所在节点    MySQL
3 条回复
louettagfh
2020-07-25 09:52:50 +08:00
buffer pool 配置了多大, MySQL 的 buffer pool 是 mmap 映射
louettagfh
2020-07-25 09:53:38 +08:00
"远超理论最大内存" 这个理论最大内存你是哪里得出的?
ksedz
2020-07-25 10:23:00 +08:00
@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,想定位多出来的这些是内存泄漏还是没有来得及回收。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX