Oracle BUFFER CACHE内存不足的优化思路

导致BUFFER CACHE内存不足主要有以下3个因素:

BUFFER CACHE内存不足。这是客观因素,巧妇难为无米之炊。如果短时间内无法解决内存不足的问题,在I/O和CPU资源足够的前提下,可以考虑将部分表使用直接路径读取,从而减少BUFFER CACHE的争用。此外,可以考虑将一些使用频率较低的大表放进RECYCLE POOL,减少DEFAULT BUFFER POOL内存的使用。

糟糕的SQL语句写法或执行计划。在这种情况下会将大量不必要的数据块读取至BUFFER CACHE中,进而冲击BUFFER CACHE的其他数据块。比如,T1表占用10000个数据块,应用程序却只需要其中1个数据块的数据。但全表扫描会将10000个数据块全部读进BUFFER CACHE。虽然服务进程会将这10000个数据块放在LRU链的COLD区域尾端,但难免需要牺牲一些本来在BUFFER CACHE中的数据块。另外,从磁盘上读取数据块需要调用操作系统内核指令,进入到BUFFER CACHE之前获得一系列相应的LATCH,这些操作都是非常消耗CPU资源的,CPU资源不足又会反过来影响BUFFER CACHE中LATCH资源的获取效率,进而造成恶性循环。所以在CPU资源不足的系统中,如果不综合考虑,盲目增加BUFFER CACHE将会导致更多的数据块涌进BUFFER CACHE,这可能会造成更加严重的后果。此外,CPU资源不足可能还会影响SHARED POOL中的LATCH的释放和获取,从而引发更大面积的数据库性能问题。

DBWR进程数不足或者存储性能缓慢。DBWR进程扫描LRU-W列表,然后将脏块写进数据文件。在写操作完成之后,脏块在BUFFER CACHE中的位置就可以被其他数据块使用,并重新挂载到LRU辅助列中了。如果系统突然运行大批量的DML语句,将会导致LRU-W列表中的脏块数量剧增。如果DBWR进程数不足或者存储性能缓慢,那么脏块的产生速度将远大于DBWR的写出速度,从而出现FREE BUFFER WAITS或者WRITE COMPELETE WAITS等相关的等待事件。当出现此类问题时,一般来讲主要看依次查看存储以下5个指标:

(1)磁盘繁忙程度------是否达到100%。

(2)磁盘的响应时间------大的I/O不超过20ms,小的I/O一般在5ms左右。

(3)IOPS是否正常------平均每张盘在150个左右。

(4)存储的CACHE是否正常。

(5)和存储相关的硬件是否正常。

如果以上5个指标全部正常,那么就要考虑是否可以通过设置数据库参数db_writer_processes来加大DBWR进程数了。在多CPU系统中,一般建议DBWR的进程数不要超过CPU数(在Oracle 10g中,db_writer_processes设置不能超过20个)。其理由很简单,整个系统并不是只有DBWR进程在运行,我们需要预留CPU时间片来给其他进程。但并不是说DBWR数绝对不能超过CPU数,在特殊的场景下这可能还会有特殊的用途,不能一概而论。接下来主要讨论BUFFER CACHE内存紧张导致数据库性能问题的一个案例。

注意 :在系统出现FREE BUFFER WAITS等待事件时,不要贸然地执行刷BUFFER CACHE的SQL语句,执行该SQL语句反而会加大DBWR的负担,使得系统性能更加恶化。

相关推荐
像风一样!3 小时前
MySQL Galera Cluster部署如何实现负载均衡和高可用
数据库·mysql
last_zhiyin4 小时前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen4 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
小光学长5 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠5 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
周杰伦fans6 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver
码以致用7 小时前
StarRocks笔记
数据库·starrocks·olap·1024程序员节
auspicious航7 小时前
PostgreSQL数据库关于pg_rewind的认识
数据库·postgresql·oracle
武子康8 小时前
Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
java·数据库·mongodb·docker·性能优化·nosql·1024程序员节
zz-zjx8 小时前
MySQL 索引深度指南:原理 · 实践 · 运维(适配 MySQL 8.4 LTS)
运维·数据库·mysql