GreatSQL社区

搜索

[讨论中] MySQL内存占用问题

536 5 2023-12-14 15:56
1、外部查看MySQL内存占用80%




2、内部查看MySQL使用的内存情况
(1)方式一:SELECT (@@key_buffer_size  + @@innodb_buffer_pool_size + @@innodb_log_buffer_size + (select count(HOST) from information_schema.processlist)/*@@max_connections*/*(@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@binlog_cache_size  + @@tmp_table_size +@@thread_stack))/1024/1024/1024\G

(2)方式二:计算以下两种内存之和
select * from memory_global_total;
                     +
select * from memory_by_thread_by_current_bytes;


3、疑问:从内部查看MySQL的使用内存情况总小于外部查看的内存占用情况?有时候发现小的还挺多的,有点对不上
全部回复(5)
yejr 2023-12-15 08:45:47
可以参考本贴 https://greatsql.cn/thread-90-1-1.html
以及 https://greatsql.cn/thread-167-1-1.html

或者在搜索引擎中输入关键字 "site:greatsql.cn 内存" 即可搜索本站内容
fander 2023-12-20 10:30:43
官方sys库关于内存的统计,我认为不准确。暂时没有发现非常准确的方法,凑合用。
KAiTO 2023-12-21 17:06:35
有没有可能外部查看的是整个MySQL进程占用的虚拟内存,包括代码、栈、堆、共享库等。内部查看的只是MySQL自己管理的内存池(如buffer pool、key buffer等)。

而且MySQL内部的内存统计也可能有失真。例如线程栈空间的统计不完全准确。
yejr 2023-12-21 17:16:32
关于内存统计结果中的RES和VIRT差距可能较大的问题,以下来自CHATGPT的回复,仅供参考:


在 Linux 系统中,VIRT(虚拟内存)和 RES(常驻集大小)是两个不同的内存消耗度量指标,它们之间的差距通常是由于操作系统的内存管理机制引起的。

虚拟内存(VIRT):

VIRT 表示进程可访问的所有虚拟内存的总和,包括实际物理内存(RES)和交换空间(如果有)。
它包括了进程代码、数据、共享库、堆、栈等等。在 32 位系统中,由于地址空间的限制,VIRT 可能会受到更大的限制。
常驻集大小(RES):

RES 表示进程实际占用的物理内存大小,即驻留在RAM中的部分。这是进程实际使用的内存,不包括交换空间。
RES 通常是我们关注的重点,因为它表示进程当前真正使用的物理内存。
差距可能出现的原因:

共享内存:多个进程可以共享相同的库和代码,这些部分会出现在 VIRT 中,但只计算一次在实际物理内存中(RES)。

内存映射:VIRT 中包含了通过内存映射加载的文件,这些文件可能只在实际访问时才加载到内存中。

未分配的虚拟内存:VIRT 包括了进程可能访问但尚未分配物理内存的区域,而 RES 只计算了已经分配的部分。

栈空间:VIRT 中包括了栈的虚拟内存大小,但实际上只有栈中的部分被实际使用。

总的来说,VIRT 是进程地址空间的完整映像,而 RES 是进程实际使用的部分。因此,它们之间的差异是正常的,不一定表示浪费或问题。在分析内存问题时,更关注 RES 更为实际和有意义。
innerDBA 2023-12-21 17:58:11
内存分三部分
1 服务层内存
2 引擎级内存
3 线程级内存
4 共享级内存
5 内存引擎内存

InnerCodeDBA
小城

1

主题

0

博客

2

贡献

新手上路

Rank: 1

积分
3

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-5-7 01:46 , Processed in 0.021084 second(s), 12 queries , Redis On.
快速回复 返回顶部 返回列表