为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:Kylinv10
【CPU】:x86
【问题描述】*:
如图,这个服务器当前跑了双实例(一个生产一个测试),当前生产的进程占用了20G内存,服务器总内存30G
当前看内存的余量不大了,现在的问题是如何可以将使用的内存降下来。
生产的dm.ini中memory相关参数如下
疑问:MEMORY_POOL*MEMORY_N_POOLS是共享内存池能申请的最大值吗?
【MEMORY_POOL初始为2000/11 MB,有11个相同的分片(也就是最开始总共申请了大约2000MB),后续不够用时每次扩展MEMORY_EXTENT_SIZE的大小,可以扩大到总共MEMORY_POOL * MEMORY_N_POOLS 2000 * 11MB,但总量超过MEMORY_TARGET后,内存空闲时,缩回到3000MB(也就是22000MB缩回到3000MB);这样理解是否正确】
【BUFFER申请的内存是共享内存池的一部分吗?
从网上找到一个sql如下:
SELECT
(
SELECT
SUM(CAST(PAGE_SIZE AS NUMBER) *CAST(N_PAGES AS NUMBER))/1024/1024
FROM
V$BUFFERPOOL
) ||'MB' AS 缓冲区总大小,
(
SELECT
SUM(TOTAL_SIZE)/1024/1024
FROM
V$MEM_POOL
)||'MB' AS 池总大小,
(
SELECT
SUM(CAST(PAGE_SIZE AS NUMBER) *CAST(N_PAGES AS NUMBER))/1024/1024
FROM
V$BUFFERPOOL
) +
(
SELECT
SUM(TOTAL_SIZE)/1024/1024
FROM
V$MEM_POOL
) ||'MB' AS 总内存大小
FROM DUAL;
通过这个sql查出来的值差不多能跟top的情况对应上,那么可以理解为dmserver主要申请的内存占大头的就是memory_pool相关跟buffer相关的内容吗
】
MEMORY_POOL初始为2000,有11个分片,可以扩大,但总量超过MEMORY_TARGET后,内存空闲时,缩回到3000MB。
释放内存
一方面,应用连接池要做好空闲连接的控制,减少maxidle/minidle,避免大量空闲会话占用内存,以下SQL按用户/IP/状态分组查询统计,关注状态是IDLE的数量:
SELECT COUNT(*) AS CNT, USER_NAME, SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':', -1) - 1) AS IP, STATE FROM V$SESSIONS GROUP BY SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':', -1) - 1), USER_NAME, STATE ORDER BY CNT DESC;
另一方面,VIRT/RES差距大,数据库归还的内存可能被系统glibc截留了,注意看看数据库启动脚本bin/DmServiceXXX环境变量
MALLOC_ARENA_MAX
值,默认8或没有配置,建议修改/添加值为1或者4最后,除了以上MEMORY参数,还有会话参数也影响,也注意看看是否超过了以下建议值:
SORT_BUF_SIZE=2 #排序内存 VM_POOL_TARGET=8192 #运行内存 SESS_POOL_TARGET=8192 #会话内存 MAX_SESSIONS=300 # 总连接数,30G物理内存建议总连接数不超过300个,这个环境还有另外一个实例占内存