一、前言
在生產中,我們安裝oracle數據庫時,為達到最優我們需要對操作系統的內核參數進行一定的調整。主要從內存、cpu、io以及網絡等方面,根據實際情況進行調整。以下參數可供大家參考,如有不當之處還望大家指出,一起研究學習。
二、參數調整建議
參數名稱 | 含義 | 建議值 |
kernel.shmmax | 單個共享內存段的最大值 | 取內存大小減1,單位為byte |
kernel.shmall | 控制共享內存頁數 | 4294967296 |
kernel.shmmni | 共享內存段的最大數量 | 4096 |
kernel.sem | 信號集容納最大信號數量 所有信號的最大數量 調用單個信號集中最大信號數量 信號集的最大值 | 5010 641280 5010 128 |
fs.file-max | 系統中所允許的文件句柄最大數目 | 512 乘以 processes |
fs.aio-max-nr | 限制並發未完成的請求 | 10485760 |
net.ipv4.ip_local_port_range | 系統開放端口范圍 | 9000 65500 |
net.core.rmem_default | 接收套接字緩沖區大小的默認值 | 262144 |
net.core.rmem_max | 接收套接字緩沖區大小的最大值 | 4194304 |
net.core.wmem_default | 發送套接字緩沖區大小的默認值 | 262144 |
net.core.wmem_max | 發送套接字緩沖區大小的最大值 | 1048576 |
vm.nr_hugepages | 大頁,直接分配並保留對應大小的內存區域 | sga/2M稍微大一點,可參考MOS:749851.1 |
vm.vfs_cache_pressure | directory和inode cache保持在一個合理的百分比 | 200 |
vm.swappiness | 內存使用率剩余多少時開始使用swap | 10 |
vm.min_free_kbytes | 最低保留多少內存 | 524288 |
vm.dirty_ratio | 臟頁數量達到系統總內存的多大比例觸發pdflush/flush/kdmflush等后台回寫進程 | 5 |
vm.dirty_background_ratio | 所有全局系統進程的臟頁數量達到系統總內存的多大比例觸發pdflush/flush/kdmflush等后台回寫進程 | 5 |
vm.dirty_writeback_centisecs | 喚起去刷新臟數據的時間 | 100,單位1/100秒 |
vm.dirty_expire_centisecs | 指定臟數據能存活的時間 | 100,單位1/100秒 |
vm.drop_caches | 清空緩存機制 | 3 |
vm.overcommit_memory | 內存申請分配機制 | 2 |
vm.overcommit_ratio | 物理內存分配時的比例 | 90 |
kernel.panic | 系統發生panic時內核重新引導之前的等待時間 | 10 |
kernel.panic_on_oops | 當系統發生oops或BUG時,所采取的措施 | 1 |
kernel.sysrq | 文件指定的值為非零,則激活鍵盤上的sysrq按鍵 | 1 |
net.ipv4.conf.bond1.rp_filter | 開啟源地址校驗規則 | 2 |
net.ipv4.ipfrag_high_thresh | 碎片整理時的最大內存 | 33554432 |
net.ipv4.ipfrag_low_thresh | 碎片整理時的最小內存 | 31457280 |
三、參數詳解
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 34359738368
(定義單個共享內存段的最大值,設置應該足夠大,能在一個共享內存段下容納下整個的SGA,設置過低可能會導致需要創建多個共享內存段)
建議值:取內存大小減1
ipcs -sa查看共享內存段的個數
cat /etc/sysctl.conf | grep kernel.shmmax
舉例:
sga_target=1G,
kernel.shmmax = 102400000
如下圖所示,共享內存段分成了10個,導致oracle性能有一定的下降。
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
(kernel.shmall 參數是控制共享內存頁數。該參數大小為物理內存除以pagesize;默認值已經是4294967296*4k/1024/1024/1024=16T足夠大了,一般不用改。)
[root@ceshi ~]# getconf PAGE_SIZE
4096
一個共享內存頁為4k
kernel.shmmni = 4096
(shmmni 內核參數是共享內存段的最大數量,缺省值 4096 ,一般肯定是夠用了)
kernel.sem = 5010 641280 5010 128
(信號集容納最大信號數量 所有信號的最大數量 調用單個信號集中最大信號數量 信號集的最大值)
fs.file-max = 6815744
(該參數決定了系統中所允許的文件句柄最大數目,文件句柄設置代表linux系統中可以打開的文件的數量,fs.file-max為512 乘以 processes)
fs.aio-max-nr = 10485760
(此參數限制並發未完成的請求,應該設置避免I/O子系統故障)
net.ipv4.ip_local_port_range = 9000 65500
(當前系統開放端口范圍,默認是32768到61000,對於繁忙的網絡服務器需要增加網絡端口范圍來增強它的處理能力)
[root@ceshi ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
net.core.rmem_default = 262144
(接收套接字緩沖區大小的默認值)
net.core.rmem_max = 4194304
(接收套接字緩沖區大小的最大值)
net.core.wmem_default = 262144
(發送套接字緩沖區大小的默認值)
net.core.wmem_max = 1048576
(發送套接字緩沖區大小的最大值)
vm.nr_hugepages = 16400
(在系統啟動時,直接分配並保留對應大小的內存區域,使用改參數時需要禁用AMM)
計算公式:sga/2M稍微大一點即可或者使用腳本計算,可參考MOS:749851.1
vm.vfs_cache_pressure=200
(缺省值100表示內核將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;該值低於100,將導致內核傾向於保留directory和inode cache;該值超過100,將導致內核傾向於回收directory和inode cache)
vm.swappiness=10
(表示內存使用率超過90%時開始出現有交換分區的使用)
vm.min_free_kbytes=524288
(最低保留多少內存,設置過高會觸發kswapd0進程消耗大量 CPU一般512M即可)
vm.dirty_ratio = 5
(單個進程的臟頁數量達到系統總內存的多大比例后,就會觸發pdflush/flush/kdmflush等后台回寫進程運行。)
vm.dirty_background_ratio=5
(所有全局系統進程的臟頁數量達到系統總內存的多大比例后,就會觸發pdflush/flush/kdmflush等后台回寫進程運行)
vm.dirty_writeback_centisecs=100
(單位:1/100秒;表示每1秒pdflush會被喚起去刷新臟數據,如果刷新臟數據的時間超過了這個時間,完成后將會sleep1秒)
vm.dirty_expire_centisecs=100
(單位:1/100秒;指定臟數據能存活的時間,超過該時間就會從內存中寫入磁盤)
vm.drop_caches=3
(1表示清空頁緩存;2表示清空inode和目錄樹緩存;3表示清空所有緩存)
注意:手動清理時需要執行sync命令將數據同步到磁盤
sync
echo 3 > /proc/sys/vm/drop_caches
vm.overcommit_memory=2
(0表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。1表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。2表示內核允許分配超過所有物理內存和交換空間總和的內存)
vm.overcommit_ratio=90
(當vm.overcommit_memory=2時生效,為物理內存分配時的比例)
結合以上兩個參數可以計算可以:
使用的內存大小為= SWAP內存大小 + 物理內存 * overcommit_ratio / 100
kernel.panic = 10
(單位秒,系統發生panic時內核重新引導之前的等待時間,0表示禁止重新引導)
kernel.panic_on_oops = 1
(當系統發生oops或BUG時,所采取的措施0:繼續運行;1:讓klog記錄oops的輸出,然后panic,若kernel.panic不為0,則等待后重新引導內核)
kernel.sysrq=1
(該文件指定的值為非零,則激活鍵盤上的sysrq按鍵。這個按鍵用於給內核傳遞信息,用於緊急情況下重啟系統。當遇到死機或者沒有響應的時候,甚至連 tty 都進不去,可以嘗試用 SysRq 重啟計算機。)
net.ipv4.conf.bond1.rp_filter = 2
(0:不開啟源地址校驗。1:開啟嚴格的反向路徑校驗。對每個進來的數據包,校驗其反向路徑是否是最佳路徑。如果反向路徑不是最佳路徑,則直接丟棄該數據包。2:開啟松散的反向路徑校驗。對每個進來的數據包,校驗其源地址是否可達,即反向路徑是否能通(通過任意網口),如果反向路徑不同,則直接丟棄該數據包)
net.ipv4.ipfrag_high_thresh = 33554432
(系統中當數據包傳輸發生錯誤,會進行碎片整理,有效的數據包被保留,而無效的數據包被丟棄,ipfrag參數指定了碎片整理時的最大內存。)
net.ipv4.ipfrag_low_thresh = 31457280
(系統中當數據包傳輸發生錯誤,會進行碎片整理,有效的數據包被保留,而無效的數據包被丟棄,ipfrag參數指定了碎片整理時的最小內存。)