1. 程式人生 > 其它 >linux kernel引發的oracle問題及解決

linux kernel引發的oracle問題及解決

最近測試環境的連線數老是不夠用,session/process 都相應的從5000提到了8000,但還是不夠,而且還是不斷有新環境需要增加。最後根據評估,session數需要50000左右

根據粗略的計算來說,process也需要調整,按照如下的公式.

sessions=(1.1*process+5)

把semmns做了大幅度的調整,從32000調到了70000

> cat /proc/sys/kernel/sem
250     32000   100     256
> sysctl -a |grep sem
kernel.sem = 250        70000   100     256 

第二天收到郵件說變更已經部上去了。說Process只調到了16000,當時看到郵件也沒在意。

以下是監控的指標圖,幾分鐘抓一個session報告。生成的圖表如下。

開始兩天,發現有了很大的改進,連線能夠正常關閉,而且session數不到7000的樣子。根據反饋沒發現連線數的問題。

過了兩天發現session數到8000以上就開始很吃力了。而且會時不時的有一些連線不上的情況。我寫了個指令碼,抓session快照的時候也有時候連不上庫。

檢視alert和listener日誌,有以下的錯誤資訊。

-->from Listener.log
03-DEC-2013 12:43:41 * (CONNECT_DATA=(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=testwrk34))(sid=TEST)) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.19.192.41)(PORT=56631)) * establish * TEST * 12518
TNS-12518: TNS:listener could not hand off client connection
TNS-12536: TNS:operation would block
  TNS-12560: TNS:protocol adapter error
   TNS-00506: Operation would block
Linux Error: 11: Resource temporarily unavailable
-->from DB alert log
Errors in file /opt/app/oracle/aaa/admin/TEST/diag/rdbms/TEST/TEST/trace/TEST_psp0_30562.trc:
ORA-27300: OS system dependent operation:fork failed with status: 11
ORA-27301: OS failure message: Resource temporarily unavailable
ORA-27302: failure occurred at: skgpspawn5
Tue Dec 03 12:38:05 2013

在MOS上檢視相關的資訊,說是nproc的配置太低了,無法分配程序了。

但是檢視nproc的情況,感覺沒什麼問題。

*               soft    nproc   32768
*               hard    nproc   65536

我就有些糊塗了。檢視機器上其它的例項程序數,加起來都不到200個。

繼續檢視session的情況。最後反覆驗證,確認session數到8000的時候就開始有問題了。就開始琢磨nproc為什麼沒生效。

想到幾天前的郵件,一檢視,終於發現了端倪。

他們當時起庫的時候,發現已經報了proc的錯誤,當調整process的時候,庫直接起不來了。

SQL> startup
ORA-27154: post/wait create failed
ORA-27300: OS system dependent operation:semids_per_proc failed with status: 0
ORA-27301: OS failure message: Error 0
ORA-27302: failure occurred at: sskgpwcr2
ORA-27303: additional information: semids = 264, maxprocs = 45000
SQL> exit                                             

起庫的哥們已檢視nproc的配置,db process設定為16000的時候庫才能起來,然後他就直接設定為了16000,然後還有一些其他的問題,直接順手解決了。

test2 @test1:/root > grep nproc /etc/security/limits.conf 
#        - nproc - max number of processes
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
*               soft    nproc   8192
*               hard    nproc   16384
SQL> startup
ORA-04031: unable to allocate 15193312 bytes of shared memory ("shared pool","unknown object","sga heap(3,0)","KEWS sesstat values")
SQL>
Tunning sga 
*.sga_max_size= 6442450944  ==> 8442450944
*.sga_target=6442450944     ==> 8442450944
SQL> startup
ORACLE instance started.
Total System Global Area 8417955840 bytes
Fixed Size                  2233168 bytes
Variable Size            3321892016 bytes
Database Buffers         5066719232 bytes
Redo Buffers               27111424 bytes
Database mounted.
Database opened.

檢視郵件的情況,才發現nproc是在第二天早晨被unix team從8000調到16000的。問題的原因就找到了。

kernel的變更沒有生效,只能稍候處理。

這個問題的定位確實有些曲折,希望在操作的時候保留日誌之類的東西,這樣診斷問題會有根據。