oracle自身不执行swap,但os内存不足时会将sga/pga进程页换出至磁盘,导致sga_target、pga_aggregate_target失效;判断依据包括v$sysstat中physical reads cache突增、vmstat显示si/so非零、/proc/pid/status中swap字段非0,以及pagetables异常升高。

Oracle中内存交换(swapping)不是数据库层直接行为,但会严重拖慢响应
Oracle自身不执行swap,但当操作系统内存不足时,Linux/Unix会把SGA或PGA所在的进程页换出到磁盘,导致sga_target、pga_aggregate_target实际失效。此时你看到的“慢”,本质是OS级page fault引发的毫秒级延迟叠加——单次逻辑读可能从0.1ms跳到20ms以上。
关键判断依据:v$sysstat里physical reads cache突增,而db block gets和consistent gets没变;同时OS层vmstat 1显示si/so(swap in/out)持续非零。
- 不要只看
v$pgastat里的bytes processed,它反映的是SQL工作区使用量,不是OS swap -
top或ps aux --sort=-%mem中Oracle进程RSS值远超sga_target + pga_aggregate_target总和,大概率已在swap - RAC环境中,某节点swap活跃而其他节点正常,优先查该节点的
/proc/meminfo中SwapCached和SwapTotal使用率
用v$process + /proc/pid/status交叉验证是否发生swap
Oracle进程本身不暴露swap状态,但Linux内核在/proc/<pid>/status</pid>里记录了Swap:字段。结合v$process可定位具体进程:
SELECT spid, program, pid FROM v$process WHERE program LIKE '%ora_%';
拿到spid后,在OS执行:
grep Swap /proc/<spid>/status</spid>
若返回Swap: 123456 kB(非0),说明该Oracle后台进程已被swap。常见高风险进程:ora_pmon_<sid></sid>、ora_dbw0_<sid></sid>、ora_smon_<sid></sid>——这些进程一旦swap,整个实例响应会明显卡顿。
- 注意:
ora_lgwr被swap会导致log file sync等待飙升,日志写入延迟超过500ms就是强信号 - 如果
Swap:为0但MemAvailable极低(
PGA_AGGREGATE_LIMIT触发的“伪swap”效应更隐蔽
当pga_aggregate_limit被击穿,Oracle不会真的swap,而是强制让新PGA请求等待(acknowledge over PGA limit事件)。这种等待表现为大量会话卡在PGA memory operation,看起来像锁等待或CPU空转,实则是内存配额耗尽。
查证方式:
SELECT event, COUNT(*) FROM v$session WHERE event = 'acknowledge over PGA limit' GROUP BY event;
若结果非空,说明已触发保护机制。此时v$sql_workarea_histogram中MULTIPASSES_EXECUTIONS会显著上升,且集中在HIGH_OPTIMAL_SIZE
- 临时缓解:设
ALTER SYSTEM SET pga_aggregate_limit=0 SCOPE=BOTH;(仅限紧急恢复,不解决根本问题) - 长期方案:按业务峰值事务量重算PGA需求,参考公式
PGA_AGGREGATE_LIMIT = 3MB * processes(单机)或5MB * processes(RAC),再加20%缓冲 - 别盲目调大
pga_aggregate_target——它只是软限制,pga_aggregate_limit才是硬闸门
SGA锁定内存(LOCK_SGA)不能替代swap规避
LOCK_SGA=TRUE只防止SGA被swap,对PGA无效,且要求OS配置memlock ulimit足够大。若ulimit -l小于SGA大小,实例启动失败,报错ORA-27102: out of memory。
真正有效的防线是OS层控制:
- 关闭
vm.swappiness(设为1,而非0,避免OOM killer误杀) - 确保
vm.overcommit_memory=2且vm.overcommit_ratio合理(建议80) - 监控
/proc/sys/vm/swappiness是否被其他脚本动态修改——这是生产环境常被忽略的“静默变更”
最易被忽略的一点:即使SGA锁定、PGA未超限,若系统总内存中PageTables占用过高(>2GB),也会触发内核频繁扫描页表,间接导致Oracle进程调度延迟。此时/proc/meminfo中PageTables值比平时高3倍以上,需检查是否有大量小PGA分配(如短连接+排序SQL),而非简单加内存。











