關於Linux 下kernel.shmmax 的設定問題
下面是Oracle 文檔上的解釋, http://download-west.oracle.com/doc...e.htm#sthref107
SHMMAX Available physical memory Defines the maximum allowable size of one shared memory segment.
The SHMMAX setting should be large enough to hold the entire SGA in one shared memory segment. A low setting can cause creation of multiple shared memory segments which may lead to performance degradation.
shmmax 的含義是單個共用記憶體段的最大尺寸, 設定shmmax=1G,sga分配了1.2G,當啟動執行個體的時候就分配 2 塊共用記憶體給Oracle .
如果實體記憶體是 2 G, 假設這台DB Server上還有Apache 在運行,那麼shmmax 中設定的記憶體也會被Apache 來使用,那麼分配的 2 塊共用記憶體段給Oracle 是否就是 2 * 1G , 還是僅僅滿足 SGA需求的 1.2 G就停止分配 , 其他的記憶體的一部分分配給Oracle PGA 和軟體 Apache 來使用 ?
答:
看Oracle Document 說法 , 當需要分配多個 ( creation of multiple shared memory segments ) 共用記憶體段的時候會導致效能下降 。
如果偶爾分配需要 2 個共用記憶體段 ,效能應該不會受到太大影響吧 。
shmmax核心參數定義單個共用記憶體段的最大值,如果該參數設定小於Oracle SGA設定,那麼SGA就會被分配多個共用記憶體段。這在繁忙的系統中可能成為效能負擔,帶來系統問題。
設定:
一些資料說記憶體大過2g的,就按shmmax=shmall*1*1024 (shmall=實際記憶體*1024) ,有的說大過2g的就按2g的算,shmall=2097152=2048*1024,shmmax=shmall*1*1024=2147483648
現在的情況是我按第一種說法安裝9i,我的伺服器記憶體是8G的設,到最後報ORA-27012ut of memory 錯誤,資料庫無法啟動,而按第二種就沒事,請高手指點,這個值到底怎麼設定合理?
答:
對於32bit的linux來說,不管實際的記憶體有多大,shmmax的最大值不應該超過 4294967295。
對於rh3,正常情況下oracle的sga只能開到1.7G左右(即使你有8G的memory),即使經過某些調整,如Hugetlb,最多也只能將SGA<3G.
oracle在設定sga的時候,會參考系統的核心參數,如shmmax等。
配置 Linux 的核心參數
[root@myhost ~]# vi /etc/sysctl.conf
# For Oracle
kernel.shmmax = 1073741824(改成伺服器記憶體的一半,我的伺服器是1G,所以都算進去了,1024*1024*1024)
kernel.shmmni=4096
kernel.shmall=1073741824
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
修改/etc/sysctl.conf檔案。其中的幾個參數的含義是:
kernel.shmmax表示最大共用記憶體,如果小的話可以按實際情況而定,一般為實體記憶體的一半,不過我的虛擬機器只有256M,所以就全部算進去了。
shmmni表示最小共用記憶體固定4096KB
shmall表示所有記憶體大小
sem 4個參數依次是SEMMSL:每個使用者擁有訊號量最大數,SEMMNS:系統訊號量最大數,SEMOPM:每次semopm系統叫用作業數,SEMMNI:系統辛苦量集數最大數。這4個參數為固定內容大小。
file-max固定大小65536
ip_local_port_range表示連接埠的範圍,為指定的內容。
ORACLE的LINUX配置及環境變數配置:
建立Oracle使用者和組
以root身份執行下列命令:/usr/sbin/groupadd oinstall/usr/sbin/groupadd dba/usr/sbin/useradd -m -g oinstall -G dba oracle id oracle然後設定oracle賬戶的密碼:/usr/bin/passwd oracle建立目錄建立針對Oracle 10g軟體和資料庫的目錄。以root身份執行下列命令mkdir -p /u01/app/oraclemkdir -p /u02/oradatachown -R oracle:oinstall /u01/app/oracle /u02/oradatachown -R 775 /u01/app/oracle /u02/oradata修改核心參數以root身份編輯/etc/sysctl.conf檔案。添加以下內容:(可用:cat >> /etc/sysctl.conf <<EOF 來實現)
cat >> /etc/sysctl.conf <<EOF
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
EOF
/sbin/sysctl -p
儲存,退出。然後運行/sbin/sysctl -p啟用更改。為oracle使用者佈建shell限制 以root身份編輯/etc/security/limits.conf檔案。添加以下內容:
cat >> /etc/security/limits.conf <<EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF
然後再編輯/etc/pam.d/login檔案。添加以下內容:
cat >> /etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
EOF
oracle使用者的環境變數設定以oracle使用者身份登入系統。編輯.bash_profile檔案。添加以下內容:(具體值請根據自己的情況設定)export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/10gexport ORACLE_SID=DEMOexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/libexport LC_CTYPE=en_US.UTF-8並且把PATH=$PATH:$HOME/bin一行修改為 PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
到這裡,原來準備把變數LD_LIBRARY_PATH 加上一個:$ORACLE_HOME/lib64,但經過實驗,不必如此。儲存,退出。然後運行命令source .bash_profile 使環境變數生效。
注意事項:
1、以上可以在root下並su進行,但如果要進行下面的實際安裝,則必須登出,並以真實的ORACLE使用者登入來進行操作。如果真的要在root下,以su - oracle的話,可能要添加: export DISPLAY=IP:0.0 變數。
2、在安裝LINUX中,必須完整安裝“開發”中的所有”開發工具“以及”原有的軟體開發“項,以及後來的“相容性”的全部選項。
3、如果把LC_CTYPE的值改為:zh_CN.GB2312,並多加一個參數LANG,值也是如此,則ORACLE的安裝介面就變成了中文了!
4、安裝完成後,在建庫用命令:dbca 時,出現了 ora-12547:TNS:lost contact 錯誤。後來看網上說是64位的作業系統裝的確是32位的 libaio ,所以請將系統硬碟的第三張安裝:libaio-0.3.103-3.x86_64.rpm 。但我裝了64位的libaio後,並在$ORACLE_HOME/bin下relink all 後,仍然不行。後來就先刪除了:
rpm -e libaio_devel**
接著刪除了 rpm -e libaio**,最後再安裝一遍 libaio*64,再用ORACLE使用者進到$ORACLE_HOME/bin下,命令:relink all 。就OK了。
5、無論是安裝64位的作業系統還是32位的ORACLE提供的作業系統,在安裝ORACLE10g R2時,在建庫時,都遇到相同的錯誤,那就是:
TNS ora-12547:lost contact 錯誤!在32位的LINUX中,我用第三張盤重新安裝了libaio-0.****.rpm,然後,在$ORACLE_HOME/bin下運行:./relink all 使得dbca得以正常建庫。
安裝oracle
從oracle網站上下載10201_database_linux32.zip。解壓。進入到解壓後的目錄。運行./runInstaller安裝。按照預設值安裝既可
如果是cpio形式,需要進到此目錄後,執行命令:
cpio -idmv < oracle10g64.cpio
以上的實驗是在環境: Oracle Enterprise Linux (64位) +ORACLE 10gR2 (64位)
以及:Oracle Enterprise Linux (32位) +ORACLE 10g R2 (32位)