注册
数据库内存排查思路
技术分享/ 文章详情 /

数据库内存排查思路

Chai 2024/01/03 1443 1 0

1.通过SQL语句:
select --数据库层面查看内存占有多少
(select sum(cast(n_pages as bigint)* page_size)/1024/1024 from v$bufferpool)||'MB' as BUFFER_SIZE,
( select sum(cast(total_size as bigint))/1024/1024 from v$mem_pool)||'MB' as mem_pool,
(select sum(cast(n_pages as bigint) * page_size)/1024/1024 from v$bufferpool)+(select sum(cast(total_size as bigint))/1024/1024 from v$mem_pool)||'MB' as TOTAL_SIZE
From dual;
然后使用top命令检查数据库服务器的res值和virt值对比这两个值的情况,如果差距比较大可能就是存在内存泄漏的情况,如果比较均衡,则考虑数据库和操作系统交互过于频繁,可以在服务脚本中添加环境变量export MALLOC_ARENA_MAX=4来解决处理
值差距较大的情况,可以使用以下SQL:
select
name, --内存池名称
is_shared, --是否是共享的
is_overflow, --是否用到了备份池
org_size/1024.0/1024.0, --内存池初始大小
TOTAL_size/1024.0/1024.0, --内存池总大小(包括扩展的)
RESERVED_SIZE/1024.0/1024.0, --当前已分配大小(包括扩展的)
DATA_SIZE/1024.0/1024.0, --实际有效字节
EXTEND_SIZE, --每次扩展多少
TARGET_SIZE, --目标大小
N_EXTEND_NORMAL , --TARGET范围内累计扩展次数
N_EXTEND_EXCLUSIVE --超过TARGET累计扩展次数
from v$mem_pool
order by TOTAL_size desc;
(1)N_EXTEND_EXCLUSIVE 如果长期大于 0,说明长期从池外扩展,可能存在内存泄露,需要重点关注。

(2)若使用到备份池,则需要保持高度关注。

(3)内存池创建的线程号 creator 可以与 session 的 thrd_id 关联,查看对应的某个会话的内存使用情况,查看方法可以参考5.3章节-单个会话内存使用情况。

(4)若 RESERVED_SIZE 比 org_size 小,说明内存池非常空闲,可以减小对应的初始内存,避免浪费。

(5)若 TOTAL_size 比 TARGET_SIZE 大,说明内存池不够,经常向池外申请,需要把对应参数调大。

此外还可以打开 MEMORY_LEAK_CHECK
alter system set 'MEMORY_LEAK_CHECK'=1 ;
查询 V$MEM_REGINFO 视图,关注 REFNUM 字段,若该字段值很大,则说明存在内存堆积的情况。
select * from V$MEM_REGINFO ORDER BY REFNUM DESC;
以上查询结果中,字段含义如下:
fname 指定该内存池的内存来源文件。
lineno 指定相关内容在文件中的行数。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服