【问题标题】:Oracle memory leaks issue on 19c and 11g versions19c 和 11g 版本上的 Oracle 内存泄漏问题
【发布时间】:2021-09-20 10:05:49
【问题描述】:

我们在 Oracle Linux 8 机器上安装了 oracle DB (19c)。当我们将服务器与 19c db 连接时,DB 机器的内存开始增长。只要服务器处理负载并执行数据库操作,内存就会不断增长,几个小时后所有内存都会用完,并且没有更多可用内存。我们有简短的 PS/SQL 语句和存储过程,它们在执行不同的 CRUD、提交、回滚操作时执行。我们做了一些研究,发现这个命令可以释放内存,但这不起作用。

sync; echo 3 > /proc/sys/vm/drop_caches

注意:我们在 11g 数据库上发现了相同的行为,所以这不是特定于数据库版本的问题,我们也更改了数据库机器,但问题仍然存在。

附上我们机器内存已用完的屏幕截图。任何帮助将不胜感激。

【问题讨论】:

  • 记得关闭光标。
  • edit您的问题包含minimal reproducible example,包括:与内存泄漏相关的CREATE TABLECREATE PROCEDURE语句;您用于与内存泄漏相关的 CRUD 的代码; 为调试内存泄漏所做的工作的详细信息。从带有进程列表的屏幕截图中调试任何东西实际上是不可能的;您需要提供代码。

标签: database oracle memory-management memory-leaks oracle19c


【解决方案1】:

确保关闭所有数据库会话以及游标。您显示的所有这些进程似乎都是专用服务器进程,每次登录数据库时都会打开。这就是为什么您的内存一开始使用它就会增加:每次登录都需要自己的专用内存,除了后台服务器进程使用的内存。

See here 获取有关调整 Oracle 内存使用的信息。

还请注意,您的内存并非 100% 使用:29.9%最近在缓冲区中使用或保留,并准备好在需要时使用。如果它实际上是使用,那么使用的价值将是 100%,而你的交换使用量可能会高得多。

【讨论】:

    【解决方案2】:

    很难说你是否真的有内存泄漏。很可能没有。 Oracle 为每个连接生成专用进程。此进程“挂载”共享内存区域。这就是为什么您会看到如此巨大的内存分配。尝试使用 ps_mem.py 之类的工具,它可以更好地处理共享内存段。

    Oracle DB 有两个与内存相关的参数 SGA+PGA,通常 DB 使用的 RAM 不应超过定义的这两个参数的总和。

    只需执行vmstat 并检查您的服务器是否真的在交换内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-07-28
      相关资源
      最近更新 更多