我们正在运行 RHEL 4 Update 6,我正在安装 Oracle。根据 Oracle 安装指南,我正在尝试更新 shmmax 值。根据指南,我在 /etc/sysctl.conf 中添加了以下行:
kernel.shmmax = 5319303168
但是当我随后输入以下命令进行检查时:
/sbin/sysctl -a | grep shm
我可以看到该值仍然是 1024335872。如果我执行以下操作:
cat /proc/sys/kernel/shmmax
我还可以看到值 1024335872。我尝试过重新启动系统,但仍然不起作用。有什么办法可以让此设置生效吗?
答案1
首先,编辑 sysctl.conf 不会改变该值,直到您重新启动或执行:
sysctl -p
让它重新加载值。
您提到这是 32 位 Linux。这限制了 SHMMAX 的设置大小以及 Oracle SGA 的大小。请参阅在 FC2 上安装 Oracle9i有关您将遇到的限制的更多信息,请参见此处。最大的常用设置是:
kernel.shmmax=2147483648
而且由于您尝试的大小 >4GB,所以它完全失败了。
许多人似乎将某些指南或 Oracle 的建议用作此处的神奇数字,而没有真正考虑共享内存值是否真的适合他们的系统。我编写了以下小脚本来在 Linux 上为我生成设置。正如所写,它将共享内存块限制为总 RAM 的 50%,这对于您的 Oracle 使用来说可能很轻;很容易将其调整到更高的百分比。我讨厌看到人们将此值设置为高于其服务器中的 RAM 量。
#!/bin/bash
mem_bytes=`awk '/MemTotal:/ { printf "%0.f",$2 * 1024}' /proc/meminfo`
mem_max=`expr $mem_bytes / 2`
page_size=`getconf PAGE_SIZE`
shmall=`expr $mem_bytes / $page_size`
echo \# Maximum shared segment size in bytes
echo kernel.shmmax = $mem_max
echo \# Maximum number of shared memory segments in pages
echo kernel.shmall = $shmall
其输出可以直接写入 sysctl.conf 的末尾,运行“sysctl -p”,然后您就可以获得合理而安全的设置。
答案2
好的,我想我知道为什么了。这是 32 位版本的 Linux。在这种情况下,shmmax 的最大值似乎为 2GB。
答案3
我为 Oracle 拼凑的笔记显示了相同的说明。我唯一不同的是,我首先运行echo 5319303168 > /proc/sys/kernel/shmmax。我知道这是正在运行的配置,其他设置是为了让它在重启后继续运行。
哪个版本的 Oracle?我按照 9i 说明操作,但不确定是否可以在 4.x 上运行 9i 版本。我必须查看 10g 安装,因为我还没有安装过。