我有以下疑问,我有一个带有 Oracle 9i 的服务器和另一个带有 Oracle 12c 的服务器,在这两种情况下,我都怀疑当 Oracle 达到定义的内存参数(SGA 和 PGA)所施加的限制时会发生这种情况?... 假设示例:我有一个具有 32GB RAM 的服务器,其中我只运行了一个分配了以下参数的 oracle 12c 实例:
sga_max_size = 19327352832
sga_target = 19327352832
pga_aggregate_target = 10737418240
pga_aggregate_limit = 12884901888
如果达到这些参数的极限会发生什么?,操作系统(RedHat)会开始交换吗?
SGA:没什么大不了的,它是一个固定大小的内存区域,一旦满了,数据库就会重用很少使用 LRU(最近最少使用)算法访问的内存
内存架构
PGA:一旦
PGA_AGGREGATE_LIMIT
达到,数据库将中止对具有最不可调(如 PL/SQL 集合)PGA 内存的会话的调用,并且这些会话会收到ORA-04036
错误。如果这没有帮助并且 PGA 使用量仍然高于限制,那么数据库甚至可能会终止这些会话:PGA_AGGREGATE_LIMIT
(19327352832 + 12884901888)/1024/1024/1024 = 30
您的服务器中有 32 GB 内存,您已为数据库分配了 30 GB 内存,正如您所说,它上面没有运行其他任何东西。通过正确的配置和大小调整,在正常情况下您应该看不到交换:
hugepages
用于减少页表filesystemio_options=setall
用于直接 I/O 并避免文件系统缓存vm.swappiness
设置为 10 甚至更低这并不意味着系统永远不会交换。例如:
PGA_AGGREGATE_LIMIT
. 您仍然可以让流氓进程消耗超过限制的 PGA 内存,从而导致交换。应用程序将开始失败,因为它们想要分配比您设置的限制更多的内存。