oracle 11.2.0.4,64G rhel7.6,分配了32G给sga 8G给pga,关闭透明大页(必备动作),hugepage设置了16390,交付使用后,用久了就内存不足,最终导致宕机。还提示
471说明dbw有问题
其实查看diag的trc文件,很多后台都是DEAD的。
什么原因呢?
来看看sar吧,看到出问题前
内存不足了
诊断内存问题三兄弟:top、ps、/proc/
meminfo
看top
看进程
-
Solaris: ps -eo user,pid,ppid,vsz,rss,time,comm | sort +4 -5 -n -r | head -50
-
Linux: ps aux | sort +5 -6 -n -r | head -50
-
AIX: ps aux | sort +5 -6 -n -r | head -50
-
HP-UX: ps -elf | sort +9 -10 -n -r | head -50
-
看数据库会话
-
SET LINESIZE 120
-
SET PAGESIZE 120
-
COLUMN spid HEADING 'OSpid' FORMAT a8
-
COLUMN pid HEADING 'Orapid' FORMAT 999999
-
COLUMN sid HEADING 'Sess id' FORMAT 99999
-
COLUMN serial# HEADING 'Serial#' FORMAT 999999
-
COLUMN status HEADING 'Status' FORMAT a8
-
COLUMN pga_alloc_mem HEADING 'PGA alloc' FORMAT 99,999,999,999
-
COLUMN pga_used_mem HEADING 'PGA used' FORMAT 99,999,999,999
-
COLUMN username HEADING 'Oracle user' FORMAT a12
-
COLUMN osuser HEADING 'OS user' FORMAT a12
-
COLUMN program HEADING 'Program' FORMAT a20
-
-
-
select * from (
-
SELECT p.spid,
-
p.pid,
-
s.sid,
-
s.serial#,
-
s.status,
-
round(p.pga_alloc_mem/1024/1024) alloc_m,
-
round(p.pga_used_mem/1024/1024) used_m,
-
s.username,
-
s.osuser,
-
s.program
-
FROM v$process p, v$session s
-
WHERE s.paddr( + ) = p.addr
-
ORDER BY p.pga_alloc_mem DESC) where rownum<21;
看/proc/meminfo,直接cat 这个文件
hugepage配置了,但是没用上。
突然想起前几天看到了
use_large_pages 这个参数,
就将其设置为 ONLY,结果启动实例提示ORA-27123错误
百度了一下,与 hugetlb_shm_group 有关(幸运)
-
-
用root解决
-
# id -g oracle
-
获取使用huge的用户ID
-
临时处理
-
# echo ID > /proc/sys/vm/hugetlb_shm_groug
-
永久生效
-
# echo "vm.hugetlb_shm_group = "ID >> /etc/sysctl.conf
-
重启实例后
参考:
如何在 Oracle Linux 中向 Hugetlb_shm_group 添加非 root 组(文档 ID 2491966.1)
使用大页内存,oracle官方正规解决方法:
1. 设置 /etc/security/limits.conf
* soft memlock 60397977
* hard memlock 60397977
oracle重新登录后 ulimit -l 确认
2. 禁用自动内存管理 (AMM) ,计算所需数量
./hugepages_settings.sh 文档401749.1
3. 设置 /etc/sysctl.conf
vm.nr_hugepages = 1496
4.重启服务器后检查
grep HugePages /proc/meminfo
为确保配置有效,HugePages_Free值应小于HugePages_Total。
如果所有 Oracle 数据库实例的 PRE_PAGE_SGA 为“false”,也应该有一些HugePages_Rsvd。HugePages_Rsvd计算保留供使用的空闲页面(请求 SGA,但尚未触及/映射)。PRE_PAGE_SGA 确定在实例启动时是否读入所有 SGA 页。如果参数设置为“true”,则为 SGA 的每个页面预构建 OS 页表条目,从而导致这些页面的 HugePages 保留。对于 12.1 之前的 Oracle 数据库版本,PRE_PAGE_SGA 的默认值为“false”。因此HugePages_Rsvd将高于 0。但自 12c 以来,PRE_PAGE_SGA 默认为“true”,这将导致HugePages_Rsvd为 0。
Hugepages_Free和HugePages_Rsvd的总和可能小于您的总 SGA 组合,因为实例根据需要动态和主动分配页面
参考:
Oracle Linux 64 位上的 HugePages(文档 ID 361468.1)
不起作用的原因:
1. huge page过小
2. NUMA 已启用 numactl --show
3. _db_block_cache_protect 设置为 TRUE
参考:
Oracle 不使用 Hugepages(文档 ID 803238.1)
阅读(2172) | 评论(0) | 转发(0) |