1. 程式人生 > >系統遷移效能問題解決

系統遷移效能問題解決

最近公司系統由原來小機遷移到IDC機房,應用在虛擬機器環境下執行,出現了效能問題,表現為使用者上來之後系統承受不住壓力而宕機,打不開介面。

經過一週的各種嘗試,最終得以解決,記錄一下以免下次犯同樣的錯誤,一週時間這個代價是非常大的。

經過就不多說了,直接說需要做什麼就OK.

1.首先需要測試服務環境,CPU,網路、IO,記憶體,儲存空間,可使用工具進行各項測試,本次我採用FTP上傳下載大檔案(2G)來進行實際測試。

2. 資料庫IO測試,

3.資料庫連線數,即:SESSION ,PROCESS引數設定。

   1).sessions

Sessions 引數指定了一個 Instance中能夠同時存在的sessions數量,或者說,就是能同時登陸到資料庫的併發使用者數。通常,我們設定這個數字時需要考慮我們可能會有多少個同時連線到資料庫的併發使用者,並加上後臺程序的程序數,最後乘與1.1.

比如說,估計系統中可能會同時有100個使用者連線到資料庫,那麼,你的session最少應該為

(100 + 10 ) * 1.1 = 121

當資料庫連線的併發使用者已經達到這個值時,又有新session連進來,就會報錯

00018, 00000, "maximum number of sessions exceeded"
// *Cause: All session state objects are in use.
// *Action: Increase the value of the SESSIONS initialization parameter.

   2). Processes

Processes引數指定了Instance在OS層面所能同時執行的程序數。基於和sessions設定同樣的考慮,我們在設定processes時,也應考慮我們可能會有多少個同時連線到資料庫的併發使用者,並加上後臺程序的程序數。

當然,在MTS(shared server)的配置下,這個值的確定會有所不同。應該是普通後臺程序+最大共享伺服器的程序數(max_shared_servers) + 最大Dispatcher程序數(max_dispatchers).

另外,由於在window平臺中,Oracle是以單一一個程序的形式存在,Processes 引數變成了限制Oracle程序裡的執行緒數了。

當Oracle需要啟動新的process而又已經達到processes引數時,就會報錯:

00020, 00000, "maximum number of processes (%s) exceeded"
// *Cause: All process state objects are in use.
// *Action: Increase the value of the PROCESSES initialization parameter.


3).通過SQLPlus修改

使用sys,以sysdba許可權登入:

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ---------------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 150

SQL> alter system set processes=2000 scope = spfile;
系統已更改。

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- -----------------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 2000

SQL> create pfile from spfile;
檔案已建立。

4.調整weblogic JDK ,使用1.6 64bit,設定weblogic 記憶體大小

5.調整weblogic 執行緒數

6.搭建weblogic 叢集,充分利用機器CPU,記憶體效能。

7.建立weblogic 連線池,這裡環境為:weblogic 10.3.6,oracle 10,所以不能採用GridLink 方式,

方式 1):
  在WEBLOGIC上配置了一個多池,利用WEBLOGIC提供的負載均衡策略,將併發均衡的分別到兩個節點上。
方式 2):
  直接使用了RAC的負載均衡策略。 
  配置資料來源時,URL修改為如下  
  jdbc:oracle:thin:@(description=(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.159)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.1.158)(PORT = 1521))(load_balance=yes)(failover=yes))(connect_data=(service_name= racdb)(instance_name=racdb1)(instance_name=racdb2)))
方式 3):
   oracle 11g 以後支援GrildLink 後續詳細學習( http://blog.sina.com.cn/s/blog_48567d850102v3rj.html?qq-pf-to=pcqq.c2c )

 測試結果,方式1 壓力全部集中在一個節點上。方式2 負載均衡的實現還是比較好的,基本上兩個節點的負載差別很小。
要想在任何情況下都獲得比較理想的負載均衡,最好使用Oracle的負載均衡策略,而不要使用WEBLOGIC的多池提供的LOAD-BALANCING策略

附通過資料庫檢視各節點連線情況:
SQL> SELECT INST_ID, STATUS, COUNT(*)
  2  FROM GV$SESSION
  3  WHERE USERNAME = 'NDMAIN'
  4  GROUP BY INST_ID, STATUS;
   INST_ID STATUS     COUNT(*)
---------- -------- ----------
         1 INACTIVE          8
         1 ACTIVE            1
         2 ACTIVE            2
         2 INACTIVE          7

同樣可以在weblogic 控制檯的監控中直觀的看到伺服器各節點JDBC的負載和活動情況。
 

8.測試負責均衡會話共享。

9 壓力測試併發訪問,需要達到15分鐘以上穩定執行。