網上關於oracle併發連接數的優化文章千篇一律,幾乎都是把最大processes從150改爲300,至於爲什麼改爲300,最大能支持多少都沒有說清楚。於是準備去官方文檔一探究竟。
首先是processes和sessions這兩個關鍵參數。
processes
Property | Description |
---|---|
Parameter type | Integer |
Default value默認值 | 100 |
Modifiable | No |
Range of values取值範圍 | 6 to operating system dependent.最小6,最大取決於操作系統 |
Basic | Yes |
Real Application Clusters RAC集羣 | Multiple instances can have different values. RAC集羣多實例可以支持不同的參數。 |
以上內容來自官方文檔 PROCESSES
根據Oracle定義的PROCESSES的默認值,這個值應該說是默認100,但是實際上到現在我看到的Oracle這個默認值都是150,所以這個默認值具體是怎麼依賴機器配置的未知。
PROCESSES指定了可以同時連接到Oracle的最大操作系統用戶進程數,包括後臺進程、鎖、作業隊列和並行執行的進程。而且SESSIONS和TRANSACTIONS參數的默認值都是從此參數派生的。所以,當調整PROCESSES時,也要相應的調整這兩個參數。
那麼,併發進程數的調整,首先應該看常規配置下單機能支撐多少進程,然後相應的對session和transactions進行修改。
再來看sessions:
sessions
Property | Description |
---|---|
Parameter type | Integer |
Default value | Derived: (1.5 * PROCESSES) + 22 |
Modifiable | No |
Range of values | 1 to 2^16 |
Basic | Yes |
更多解釋見官方文檔 PROCESSES
根據文檔看下來,sessions的默認值的計算公式是:
默認sessions = (1.5 * processes) + 22
session的定義是客戶端與Oracle服務器的一次登錄請求,每次登錄請求會產生一個session。sessions有效的確定了數據庫的最大併發用戶數。應該始終將此參數顯式設置爲等於最大併發用戶數的估計值,加上後臺進程數,再加上遞歸會話的大約10%。
ENQUEUE_RESOURCES和TRANSACTIONS也受sessions影響,所以改變sessions後,還要改變這兩個參數。
pga_aggregate_target
這個參數是PGA內存的大小,跟併發數有關。當PROCESSES調大的時候,PGA相應的也要給大。
pga_aggregate_target=併發數量 * 4M
通過這個sql可以看每個連接進程消耗的pga大小:
select sum(pga_used_mem)/1024 total_used, sum(pga_used_mem)/count(1)/1024 used_avg, sum(pga_alloc_mem)/1024 total_alloc, sum(pga_alloc_mem)/count(1)/1024 alloc_avg from v$process;
Tips:修改processes參數之後,sessions參數和transactions參數在重啓後自動調整了。其影響順序是:processes > sessions > transactions . 調整前面的,後面的會自動調整,但是調整後面的,前面的不會調整。