大頁內存可減少TLB(Translation Lookaside Buffer)未命中,降低頁交換頻率,顯著提升Oracle SGA的內存訪問效率。
配置步驟:
grep Huge /proc/meminfo(若輸出包含"HugePages_Total"則表示支持);/etc/sysctl.conf文件,添加或修改以下參數(your_calculated_value需根據SGA大小計算,通常為SGA大小的1/4至1/2,且為2的冪次方,如SGA為8GB則設置為2048):vm.nr_hugepages = your_calculated_value
vm.hugetlb_shm_group = 0 # 允許Oracle用戶使用大頁
sysctl -p;grep Huge /proc/meminfo(HugePages_Free應接近0,表示大頁已被Oracle使用)。修改/etc/sysctl.conf文件,優化以下關鍵參數以支持Oracle內存需求:
kernel.shmmax = 物理內存大?。ㄈ?GB則為8589934592) # 單個共享內存段最大大小,需大于SGA大小
kernel.shmmni = 4096 # 系統中共享內存段的最大數量(默認足夠,無需修改)
kernel.shmall = 物理內存大小/4(單位:頁) # 系統共享內存總大?。摚?,如8GB則為2097152
fs.file-max = 65536 # 系統最大文件句柄數(Oracle連接會占用文件句柄)
net.ipv4.ip_local_port_range = 1024 65000 # 應用程序可使用的端口范圍(避免端口沖突)
修改后執行sysctl -p使配置生效。
SGA是Oracle實例的共享內存區域,包含數據庫緩沖區緩存、共享池、重做日志緩沖區等組件,其大小直接影響數據庫緩存命中率和性能。
Oracle提供三種SGA內存管理模式,推薦使用自動共享內存管理(ASMM),簡化內存分配:
MEMORY_TARGET=0、MEMORY_MAX_TARGET=0(需在spfile中修改);SGA_TARGET為物理內存的70%-80%(如8GB物理內存設置為5-6GB),SGA_MAX_SIZE大于等于SGA_TARGET(如6GB)。ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=5G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=6G SCOPE=SPFILE;
DB_CACHE_SIZE(數據緩沖區)、SHARED_POOL_SIZE(共享池)、LARGE_POOL_SIZE(大池)等參數,適用于高級調優場景。若使用自動共享內存管理,Oracle會自動分配各組件內存;若手動管理,需根據業務負載調整:
DB_CACHE_SIZE):緩存數據塊,減少磁盤I/O,通常設置為SGA的40%-70%(如SGA為5GB則設置為2-3.5GB);SHARED_POOL_SIZE):存儲SQL、PL/SQL代碼和數據字典,通常設置為SGA的15%-30%(如SGA為5GB則設置為0.75-1.5GB);LARGE_POOL_SIZE):用于并行查詢、RMAN備份等,通常設置為SGA的5%-10%(如SGA為5GB則設置為0.25-0.5GB);LOG_BUFFER):緩存重做日志條目,通常設置為1-2MB(無需頻繁調整)。PGA是Oracle進程的私有內存區域,包含排序區、會話信息、游標狀態等,主要用于內存密集型操作(如排序、哈希連接)。
Oracle推薦使用自動PGA內存管理(APMM),通過PGA_AGGREGATE_TARGET參數統一管理PGA內存:
PGA_AGGREGATE_TARGET為物理內存的10%-20%(OLTP系統)或20%-30%(DSS系統),如8GB物理內存設置為1-2GB(OLTP)或1.6-2.4GB(DSS);ALTER SYSTEM SET PGA_AGGREGATE_TARGET=1G SCOPE=SPFILE;
WORKAREA_SIZE_POLICY=MANUAL,并手動調整SORT_AREA_SIZE、HASH_AREA_SIZE等參數(適用于高級調優)。通過以下視圖監控PGA使用情況,評估配置合理性:
V$PGASTAT:查看PGA內存使用統計(如total PGA allocated、total PGA inuse);V$PGA_TARGET_ADVICE:查看PGA目標值調整建議(如增加PGA_AGGREGATE_TARGET是否能提升性能);SELECT round(m.value/(m.value+d.value),4)*100|| '%' memory_disk_sort_ratio FROM (SELECT value FROM v$sysstat WHERE NAME = 'sorts(memory') m, (SELECT value FROM v$sysstat WHERE NAME = 'sorts(disk)') d;:查看內存排序占比(理想值為100%,表示無磁盤排序)。SCOPE=SPFILE需重啟生效,SCOPE=BOTH立即生效),可根據業務負載動態調整;