达梦数据库使用内存监控指导
2.1 如何判断内存池空闲还是紧张
v$mem_pool 可以查看所有内存池的使用信息。当前系统的内存池总大小可以通过以下语句查询,单位是 M:
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 关联,查看对应的某个会话的内存使用情况。
4、如果 RESERVED_SIZE 比 org_size 小,说明内存池非常空闲,需要把对于的初始内存放小,否则浪费。
5、如果 TOTAL_size 比 TARGET_SIZE 大,说明内存池不够,经常向池外申请,需要把对于的参数调大。尽量保持每个池自持。
2.2 如何判断 BUFFER 空闲还是紧张
select name, --缓冲区名称
n_pages, --页数
free, --空闲页数目
N_DISCARD64 --淘汰的页数
from v$bufferpool
注意重点:
1、如果 free 很多说明该缓冲区很空闲,可以适当的调整降低 buffer 缓冲区参数值。
2、如果 free 项为 0,或者 N_DISCARD64 非零,表示该缓冲区经常淘汰。这种情况,就说明对应的缓冲区
参数太小,导致频繁淘汰,需要调整对应的缓冲区的参数。
2.3 达梦内存总量
达梦数据库使用的内存大致等于 BUFFER + MPOOL,对应的 SQL 语句为:
select
(select sum(n_pages * page_size)/1024/1024 from v$bufferpool)||'MB' as BUFFER_SIZE, ( select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as mem_pool, (select sum(n_pages * page_size)/1024/1024 from v$bufferpool)+(select sum(total_size)/1024/1024 from
v$mem_pool)||'MB' as TOTAL_SIZE
From dual;
2.4 使用内存最多的 sql
V$SQL_STAT 需 要 ENABLE_MONITOR=1 才 开 始 监 控 。 其 中 5~58 列 中 的 监 控 项 , 可 以 通 过
SP_SET_SQL_STAT_THRESHOLD()设置监控阀值,超过阀值才开始监控。
例如:监控 sql 执行在 1 秒以上的 SQL 语句使用的内存
SELECT "SESSID", MAX_MEM_USED||'KB',SQL_TXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;
通过此 SQL 语句确定使用内存较大的 SQL,进行针对性的优化,如消除 HASH,SORT,DISTINCT 等操作。该查
询只能查询当前活动 STMT 上的语句消耗情况,历史情况需要查询 V$SQL_STAT_HISTORY ,该视图上保留 1W 行 SQLSTAT 历史信息.
2.5 单个会话内存使用总量
SELECT
A.CREATOR , B.SQL_TEXT ,
11
SUM(A.TOTAL_SIZE)/1024.0/1024.0 TOTAL_M, --当前总量(包括扩展)
SUM(A.DATA_SIZE) /1024.0/1024.0 DATA_SIZE_M --实际使用量
FROM
V$MEM_POOL A, V$SESSIONS B
WHERE
A.CREATOR = B.THRD_ID
GROUP BY
A.CREATOR, B.SQL_TEXT
ORDER BY
TOTAL_M DESC;
2.6 内存增长监控
--打开内存泄露检查参数 MEMORY_LEAK_CHECK
alter system set 'MEMORY_LEAK_CHECK'=1 ; --执行查询
select * from V$MEM_REGINFO ORDER BY REFNUM DESC
如果看到 REFNUM 值特别的大,一直不会变小,说明该内存存在堆积,需要具体的分析。其中 fname 指定
了该内存池的内存来自哪个文件,lineno 指定是在该文件哪一行。
2.7 通过 v$sysstat 视图监控内存的使用情况
select name ,stat_val/1024.0/1024.0 from v$sysstat where CLASSID=11 ;
其中:
memory pool size in bytes: 内存池总的大小
memory used bytes: 内存池使用的内存大小
memory used bytes from os: 内存池从操作系统分配的大小