在一個新聞網站的後台資料庫的監控過程中,經常出現資料庫開始使用交換分區的情況,並進而導致整個應用系統響應非常緩慢,不能夠提供服務。該伺服器的記憶體為8G,SGA設定為4G,PGA設定為1G。作業系統為64位。
按照道理,即使記憶體發生不夠的情況,應該是磁碟讀寫變得更加激烈,而不是開始頻繁的使用swap交換分區,沿著這個思路,尋找相關資料,發現如果配置大記憶體頁可以強行把SGA鎖定到記憶體中,大記憶體頁是不允許被交換的。而同時相關資料也說明,在記憶體比較大的情況下,當系統記憶體為8G以上時,如果不採用大記憶體頁(2M),那麼管理這些記憶體所需要的記憶體也會急劇增加。對於系統可以使用命令cat /proc/meminf查看PageTables項,由於沒有採用大記憶體頁管理而額外產生的記憶體消耗。
具體操作步驟:
1、查看系統記憶體
cat /proc/meminfo | grep MemTotal
MemTotal: 8177384 kB
2、查看SGA和PGA
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean TRUE
pre_page_sga boolean FALSE
sga_max_size big integer 4G
sga_target big integer 4G
SQL> show parameter pga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 1G
4、查看沒有使用大記憶體頁時的情況
more /proc/meminfo |grep -i HugePage
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 0
5、配置HugePages Pool大小
vi /etc/sysctl.conf
在最後添加如下的行www.linuxidc.com
vm.nr_hugepages = 2300 #(這個值應大於或等於 SGA/2m,即 4*1024m/2m)
6、配置oracle使用者最大線程數、檔案控制代碼和最大能鎖定的記憶體
vi /etc/security/limits.conf
在最後添加如下的行
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft memlock 5194304 #(這裡是以KB為單位,一般大於等於SGA)
oracle hard memlock 5194304
7、使配置生效
sysctl -p
8、重啟系統及啟動oracle執行個體,下面是我們使用大記憶體頁後的結果,
看到因為管理記憶體頁而額外需要的記憶體(PageTables)為55M
cat /proc/meminfo
MemTotal: 8177384 kB
MemFree: 950472 kB
Buffers: 16824 kB
Cached: 1365136 kB
SwapCached: 170652 kB
Active: 1274416 kB
Inactive: 1082156 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 8177384 kB
LowFree: 950472 kB
SwapTotal: 10420208 kB
SwapFree: 10056116 kB
Dirty: 148 kB
Writeback: 0 kB
AnonPages: 982112 kB
Mapped: 52944 kB
Slab: 64568 kB
PageTables: 55580 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 12153700 kB
Committed_AS: 2584964 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 267584 kB
VmallocChunk: 34359470407 kB
HugePages_Total: 2300
HugePages_Free: 264
HugePages_Rsvd: 13
Hugepagesize: 2048 kB
如上由於我們的系統資料庫SGA為4G,因此配置了2300個大記憶體頁,這樣能夠提供足夠多的大記憶體頁供資料庫的SGA使用。配置大記憶體的一個另外好處是可以清楚的看到系統使用記憶體的情況,否則Oracle會佔用buffer及cache記憶體,很難計算系統空餘的實際記憶體數量。
從記憶體meminfo資訊中可以看出,2300個大記憶體頁,被使用了2300-264=2036個(這個過程在啟動資料庫的時候是動態變化的,直到SGA用滿)。
在配置的過程中,發現我們的系統核心還不支援大記憶體頁,配置後看到HugePage_Total為0,說明配置無效,需要安裝新的核心。大記憶體頁的配置可以參考相關文檔。
當配置完成後,同時設定lock_sga為true,Oracle資料庫伺服器再也不發生大量使用swap分區的情況了,不再出現效能故障。