一、前言

       在生產中,我們安裝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


(定義單個共享內存段的最大值,設置應該足夠大,能在一個共享內存段下容納下整個的SGA,設置過低可能會導致需要創建多個共享內存段)

建議值:取內存大小減1

ipcs -sa查看共享內存段的個數

cat /etc/sysctl.conf | grep kernel.shmmax

 舉例:

sga_target=1G,

kernel.shmmax = 102400000

如下圖所示,共享內存段分成了10個,導致oracle性能有一定的下降。

 

系統內核參數有問題導致postgresql數據庫無法啓動_共享內存

# 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參數指定了碎片整理時的最小內存。)

一直在路上!