1. 程式人生 > >關於ArcGIS Server池化與非池化的理解

關於ArcGIS Server池化與非池化的理解

用ArcServer肯定會遇到池化與非池的問題,而且比較難以理解,我總結了幾種理解方式,可供參考。

一、首先看看Catolog上的說明:

池化:被許多使用者重複使用;

非池化:被單一使用者使用,使用完後被釋放掉。

二、一個形象的比喻

一個水缸裡有好多魚,你想餵魚。
池化是你任意抓住一條喂,餵了就放回去。
非池化是指定一條魚讓你喂,直到你不想再餵魚,就把魚殺了。

下樓有網友補充:
這個比喻有點意思,但是非池化還不僅是指定一條魚的問題,事實是這條魚原本並不存在,要現生成。所以從非池化獲得魚的速度比池化中從已有的魚中任意抓一條要慢

三、詳細解釋

(來自ESRI中國社群)

安裝了ArcGIS Server的機器,當開啟工作管理員的時候,會看到裡面有arcsom.exe和arcsoc.exe程序,但它們的數量具體是如何決定的呢?以下的分析僅針對單機配置的情況(假定所有部件都安裝在一臺機器上),對於分散式的安裝,可以此類推。
        GISServer是由一個SOM(Server Object Manager)和若干個SOC(Server ObjectContainer)機器組成。SOM會在機器裡以arcgissom賬戶啟動一個ArcSOM.exe的程序,這個程序負責管理(啟動和停止)其他SOC程序(ArcSOC.exe),SOC程序雖然是由SOM啟動,但是以arcgissoc賬戶執行的。arcsom.exe啟動時,會自動啟動兩個arcsoc.exe,一個用於記錄AGS的日誌,一個用於清空特定的工作目錄。這兩個arcsoc.exe在工作管理員中可以根據所佔用的記憶體數與其他arcsoc.exe區分開來,如圖,佔用記憶體較少的兩個arcsoc.exe便是由SOM程序自動啟動的,而其他的arcsoc.exe則是由具體service啟動的。

        插入一些概念。使用者請求一個service(服務)時,是和該service的一個instance(例項)打交道。service有pooled(池化)和nonpooled(非池化)兩種。對於pooledservice(池化服務)來說,一個使用者(或者應用程式)請求該服務時,會隨機獲得一個該服務已經建立的instance的引用,由該instance對請求做出響應;請求完成後,使用者會立即釋放該instance的引用,使其返回假想的instancepool中,使用者發出另一個請求,重複上面的過程。如果是non pooledservice(非池化服務),使用者第一次發出請求時,也會隨機獲得該service已經建立的一個instance引用,但請求處理完成後,該使用者繼續持有對該instance的引用,直到使用者斷開與伺服器的連線(結束程式),該instance會被銷燬,然後SOM會建立一個新的instance來維持數量。對於pooled service,又有low isolation和high isolation兩種。highisolation是指service的每個instance都會獨佔一個程序(arcsoc.exe),lowisolation則是指一個程序內可保有多個(預設是8哥,最多可達256個)instance(就是所謂的多執行緒)。lowisolation的好處是可以啟動相對少的arcsoc.exe來維持同樣數量的instance,節約伺服器的記憶體資源;但如果一個arcsoc.exe崩潰,那麼裡面的所有instance都會被銷燬,即使使用者正在使用它們。highisolation的優缺點則與之相反。一般來說,對於pooled service使用high isolation設定。non pooledservice的instance總是獨佔一個程序(同highisolation)。另外可以指定一個服務的最小和最大instance數目,服務啟動時會自動建立最小數目的instance等待呼叫;當建立的instance數目達到最大數量時,所有的請求都會進入等待佇列。


        至此,可以來分析一個具體的案例了。現在機器上總共有2個服務:
World:pooled,low isolation(8 instance per process),min-instance:9, max-instance:16   ,隨機啟動
China: non pooled ,min-instance:2, max-instance:4,手動啟動。
        開機,SOM啟動一個arcsom.exe,隨後啟動兩個arcsoc.exe;World服務啟動,建立9個instance,其中8個instance公用一個arcsoc.exe,剩下一個instance啟動另外一個arcsoc.exe。此時機器中共有1個arcsom.exe,4個arcsoc.exe。此時手動啟動China服務,建立2個instance,每個instance會啟動一個arcsoc.exe。此時,機器中共有1個arcsom.exe,6個arcsoc.exe。
        觀察統計可知,最小instance數量為1的服務啟動時間平均在17秒左右(cpu:Intel T7200)。可以看出,對於經常不用的服務,我們可以將它設定成手動啟動,一來節約記憶體,二來加快機器啟動速度。

四、個人理解

池化與非池化主要是為了解決併發衝突的,特別是提供資料的線上編輯時。對於池化連線方式,當用戶訪問時,從SOM已經建立好的連線池中隨機獲取一個服務例項(就像從一個水池中隨機抓住一條魚),一旦請求結束立刻自動釋放例項(就像魚被放回池中);對於非池化連線方式,使用者訪問時,SOM會動態建立一個新的服務例項為此使用者獨自佔有(就像失去了水池,不能抓魚了),直到使用者主動斷開連線才銷燬該例項。這樣理解就可以解釋為什麼線上編輯時,池化服務不能使用undo,redo了,就是因為每次編輯請求結束後,該例項已釋放,資料已儲存,而非池化服務中,使用者獨自佔有一個例項,所有的編輯操作只對此例項產生影響,並未儲存到資料庫中,只在使用者主動儲存資料(相當於斷開連線)時,資料才被儲存,例項被銷燬。