![RHEL 上的 Oracle 10g - 所有内存每晚 20.15 都会被耗尽](https://linux22.com/image/800042/RHEL%20%E4%B8%8A%E7%9A%84%20Oracle%2010g%20-%20%E6%89%80%E6%9C%89%E5%86%85%E5%AD%98%E6%AF%8F%E6%99%9A%2020.15%20%E9%83%BD%E4%BC%9A%E8%A2%AB%E8%80%97%E5%B0%BD.png)
好的,首先,我对 Oracle DB 还很陌生。我对 Microsoft 产品(嘘)和 Ubuntu Linux 有很丰富的经验,但 RHEL 和 Oracle 对我来说很新。
环境...Oracle DB 10g Standard v10.2.0.1.0 - 64位,在RedHat Enterprise Linux 5上。总数据库大小小于8GB。
问题是……每天晚上 20:15点,服务器的内存降为零。我们之前在服务器上有 4GB 的 RAM,所以我们的内存统计信息始终显示可用内存约为 100MB。直到最近我们才知道除了 RAM 不足之外还有其他问题。前几天,我们将 4GB 升级到 12GB,并看到一些合法的可用内存。请参考所附图片了解详情。
每日内存使用情况:此图显示了 24 小时的时间段,从开始到 20.15 显示了白天(用户对服务器的冲击很大)的内存使用情况。在 20.15,当所有用户离开大楼超过 2 小时后,内存几乎消失,直到服务器重新启动。
每周内存使用情况:此图显示了我们升级内存之前的时间段以及升级后的三天。如您所见,升级前基本上没有可用的物理 RAM,尽管有内存用于缓存。升级后,我们有大量可用的 RAM 和缓存——直到 20.15,这两者都消失了。每次您看到 RAM 数量跳跃都是在重新启动后立即发生的。这些可用 RAM 持续到您猜对了的 20.15。
构建此服务器的供应商绝对不答案。事实上,他们告诉我们的完全是荒谬的,让他们看起来非常无能。他们真的什么都不知道,这是显而易见的。所以我们不可能通过这种方式得到答案。大约一周前,我们保证服务器不需要更多 RAM,资源绰绰有余。它还只配备了两个物理硬盘(2x146GB 15K RPM),我相信设置为 RAID1。
我检查了(我认为是)所有调度程序作业、所有 cron 作业以及我能找到的任何其他定时任务/作业。我断开了所有空闲数据库会话,但无济于事。我能找到的唯一指向罪魁祸首的证据是 Oracle 进程在 20.15 之后开始占用约 50% 的 CPU。白天,有几十个(约 40+ 个)Oracle 进程每个显示约 2.2GB 的 VM 使用量——在重新启动后立即也是如此,在 20.15“事件”之后也是如此。
我彻底被难住了。我们的软件/硬件供应商毫无价值。
任何建议或帮助大大非常感谢!谢谢!~Laz Peterson
答案1
首先,Oracle 员工所说的并不是“荒谬的答案”,只是 Oracle 当时正在运行一些日常任务,可能通过cron
。如果那个时间不方便,您应该询问如何重新安排它们。
您的内存使用情况图表看起来不错。当 Linux 将数据加载到内存中时,它会一直保留在那里,直到需要空间用于其他内容(即free(1)
报告为缓存/缓冲区)。这背后的逻辑是删除它是显式的工作;如果再次需要数据,它可以免费使用。那里有 2GiB 真正可用。除非这种情况发生变化(即某处发生内存泄漏),否则我现在不会担心。
答案2
拍摄两次 Statspack 快照,20:00 和 00:00。在它们之间生成一份报告。它会告诉你是什么导致了高负载。特别要查找“前 5 个定时事件”,然后查找导致相关不当行为的 SQL 查询。此外,请查看 Oracle 的内存“咨询”以获取更多建议。
根据目前掌握的详细信息,我认为内存消耗本身不是问题。一些消耗负载的事务从 20:15 开始,这会导致从交换中获取缓冲数据。
看看 Red Hat 对 Oracle 的建议http://www.redhat.com/f/pdf/rhel/Oracle-10-g-recommendations-v1_2.pdf。特别是将“swappiness”设置为 0(或关闭)并使用大页面。