您的位置:首页 > 其它

Pooling 池化和非池化

2015-04-20 13:28 169 查看
  转载:
可以通过更改service的属性来使得service是池化(pooled)或者是非池化(non-pooled)。Pooled service可以被多个应用程序sessions共享。因此pooled services用在无状态的操作下。相反的non-pooled services则只被一个应用程序session使用,并且用于有状态的操作,比如编辑(editing)。Non-pooled services被用来进行数据编辑,而且只使用ArcGIS Server Local connection的连接方式。

  在配置Pooled和non-pooled services时都需要你设置最大和最小实例数。当启用service配置是,GIS server就会预先生成和初始化最小数量的实例。当应用程序向SOM所管理的service请求实例时,该应用程序就会得到一个预先生成的实例的引用。如果所有的预先生成的实例都没用了,那么server就会生成新的一个实例,并且随后的每次请求都会这样生成一个新的实例,直到到了你所设置的最大的实例数位置。

Pooled service

  一个使用pooled service的应用程序一般用于向server请求完整的请求,比如画一个地图或者是进行一次地理编码。当请求完成后,应用程序会把实例又直接放回池中(pool)。应用程序的用户们在使用时可能会得到池中(pool)不同实例的引用。实际上池中的实例对于用户来说是完全透明的,所有实例的状态都是一致的。

  例如,一个无状态的应用程序想要画一个地图,需要从pool中得到map service的实例,然后在map service上执行一个方法来画地图,画完后又把实例放回pool中。下次当应用程序还需要画地图时,也重复上面的操作。但是,每次画地图时可能会用到pool中的不同的实例。因此pool中的实例必须是相同的(有相同的layers、相同的renders等等)。如果一个用户改变了pool中实例的状态,比如加了一个图层或者是改变了图层的渲染,那么他在进行Pan或者是改变地图大小操作的时候会看到不同的效果。这是因为那个被改变状态的实例已经被放回池中(pool),而用户不能保证每一次向server提供请求时能从池中得到一个特定的实例。开发者的责任就是要确保应用程序在执行过程中没有改变实例的状态。

Pooling service允许GIS server支持许多的用户同时访问特定service上的资源。因为应用程序可以分享pool中的实例。



 

Non-pooled service



  

一个使用non-pooled service的应用程序在应用程序会话期间将保存它对service的引用。当应用程序和server断开时,这个实例将被摧毁。GIS server将创建一个新的实例以维持数目。由于这个原因,non-pooled用户可以改变service中的数据。

  使用non-pooled service。用户和实例的数量是1:1。

 

任务管理器中的进程

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启动的。

对于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)。可以看出,对于经常不用的服务,我们可以将它设置成手动启动,一来节约内存,二来加快机器启动速度。

参考资料:

1、ArcGIS Server 帮助文档

2、diligentpig版主在ESRI(北京) bbs上发表的《任务管理器中arcsom.exe和arcsoc.exe的个数问题》

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/carlbiao/archive/2009/07/26/4382047.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arcgis server