调整和配置服务
ArcGIS Server 为您设置了多个默认服务属性,因此可轻松地立即发布服务;但如果将有数百或上千用户访问您的服务,或者如果用户将执行有状态操作(例如对您的服务进行编辑),您将需要更改默认服务属性值以最好地适应您的部署。本主题将概述其中一些属性及可用于最好地配置服务的方法。
池化
可以修改服务的属性,使其成为池化服务或非池化服务。池化服务的实例可在多个应用程序会话之间共享。当某个应用程序会话将一个池化服务实例返回服务器时,其他应用程序会话便可使用该池化服务实例。因此,池化服务应仅用于无状态操作。
相反,非池化服务的实例将专门用于一个应用程序会话。应用程序会话将非池化服务的实例返回服务器时,该实例将被销毁。应用程序需要执行有状态操作(例如在启用撤消/恢复的情况下进行编辑)时,将使用非池化服务。
池化配置和非池化配置都要求您在添加服务时指定最小实例数和最大实例数。启动服务配置时,GIS 服务器将创建并初始化实例的最小数量。应用程序向服务器对象管理器 (SOM) 请求该服务的实例时,该应用程序将获得对其中一个实例的引用。如果所有实例都在使用中,服务器将创建一个新实例。服务器会为每个后续请求执行此操作,直到达到该配置允许的最大实例数或达到所有容器计算机的容量为止(达到两者之一即止)。
池化服务
使用池化服务实例的应用程序仅在完成一个请求的时间内使用该实例(例如,绘制地图或为地址进行地理编码)。完成请求后,应用程序即将它的引用释放到服务,并且直接将其返回可用的实例池。此类应用程序的用户在与应用程序交互时可能会对池中某个服务的多个不同实例进行处理。此情况对于用户是一目了然的,因为池中所有实例的状态都相同。
例如,要绘制地图某个范围的无状态应用程序将从池中获得对地图服务实例的引用,执行在地图服务上绘制地图的方法,然后将该参考释放回池中。应用程序下次需要绘制地图时,将重复此过程。每次绘制地图时都可能使用池化服务的不同实例;因此,每个实例必须始终保持相同(具有相同的一组图层、每个图层都对应相同的渲染器等)。例如,如果通过添加图层或更改图层渲染器更改了某个实例的状态,用户将在平移和缩放地图时发现不一致的结果。这是因为已将状态已更改的实例返回池中,而并未保证用户在每次请求服务时均可从池中得到该特定实例。确保应用程序不更改实例的状态且将实例及时返回池中是开发人员的责任。
利用池化服务,GIS 服务器可在为特定服务分配更少资源的情况下支持更多的用户。由于多个应用程序可以共享一个池中的实例,因此系统上的并发用户数量可以大于每个用户占用一个对专用实例的引用时的用户数量。
非池化服务
使用非池化服务实例的应用程序占用其实例引用的时间通常是该应用程序的会话持续时间。该应用程序释放实例时,该实例将被销毁,而且 GIS 服务器会创建一个新实例以保持可用实例的数量。因此,非池化服务的用户可以更改服务的基础数据。
对于非池化服务,系统上的用户数与运行中的服务实例数之比不得超过 1:1。因此,GIS 服务器可以支持的并发用户数等于该服务器可以随时一次有效支持的非池化实例数。
要尽可能使 GIS 服务器上的并发用户数达到最高,应避免使用非池化服务,除非您在有状态操作中(例如版本化数据的 Web 编辑)需要该服务。使用非池化服务开发应用程序时,需确保在不再需要这些服务实例时将其销毁。在使用非池化服务的管理器中构建 Web 编辑应用程序时,建议用户在退出应用程序时单击关闭链接。这样做可以确保立即销毁非池化服务实例,而不是在其超时时销毁。
切勿将非池化服务和 ArcGIS Server Internet 连接配合使用。而应使用 ArcGIS Server Local 连接。
回收
服务回收操作可以销毁不可用服务并将其替换为新服务,而且可回收被过时的服务占用的资源。
池化服务通常由多个应用程序以及这些应用程序的用户共用。在重用过程中,服务可能会发生一些问题,从而导致其无法供应用程序使用。例如,应用程序可能会错误地修改服务状态,或者,应用程序可能会错误地占用对服务的引用,使其无法用于其他应用程序或会话。在某些情况下,服务可能会损坏并无法使用。回收操作可用于将服务的池保持为最新状态并废弃过时或不可用的服务。请注意,回收操作不适用于非池化服务,因为所创建的非池化服务专门供特定客户端使用并将在使用之后销毁。
在回收期间,服务器会在池化服务配置中销毁每个实例,然后再重新创建。回收作为服务器的后台进程执行。尽管屏幕上不会显示任何通知回收正在进行的信息,但可在日志文件中查看与回收相关的事件。
回收操作将销毁服务的所有运行中的实例,并重新创建,无论这些实例的数量是否高于指定的最小值。要使运行中的实例数定期返回指定的最小值,必须停止服务并重新启动。创建可执行自定义 ArcGIS Server API 命令行可执行文件的 Python、shell 或 Windows 批处理脚本是自动执行此过程的好方法。此自定义可执行文件将包含服务器名称、服务名称、服务类型,并确定服务是否应按命令行参数启动或停止。该文件将使用 IServerObjectAdmin.StartConfiguration 和 IServerObjectAdmin.StopConfiguration 执行。
回收事件之间的间隔时间称为回收间隔。默认的回收间隔为 24 小时,可在服务属性 对话框中对此进行更改。您还可以选择初次回收配置的时间。从该时间开始,每当达到回收间隔时间时,将进行回收操作。
回收服务时,每次回收一个实例,这样可确保实例保持可用状态,而且可分摊为每个服务创建新实例时导致的性能损失。回收按随机顺序进行;但客户端正在使用的服务实例在被释放之前不会被回收。这样,执行回收操作不会对使用服务的用户造成干扰。
如果回收期间可用服务不足,请求将排队等候,直到实例变为可用为止。如果在此期间达到为 MaximumWaitTime 设置的值,日志文件将记录通常所记录的消息。
如果更改了服务的基础数据,将在回收后自动反映出此更改。例如,如果正在运行一个地图服务,并且更改了与该服务相关联的地图文档,则将在回收进行之后看到所做的更改。(要立即查看这些更改,可手动停止和启动该服务。)
隔离
创建服务时,请指定要设置为可用状态的实例的最小数量和最大数量。这些实例运行于容器计算机的进程中。隔离级别用于确定这些实例运行于独立进程中还是共享进程中。
使用高隔离级别时,每个实例都在其各自的进程中运行。如果某些问题导致进程失败,将只会影响在进程中运行的单个实例。
相反,低隔离级别允许同一服务配置的多个实例共用一个进程;因此,允许执行四个并发的独立请求。这通常被称为多线程处理。
使用低隔离级别时,同一服务配置默认的 8 个实例和最多 256 个实例可以共用一个进程。可在服务属性 对话框的进程 选项卡中设置每个进程的实例数。创建特定服务的此实例数之后,服务器将为下一组实例启动一个附加进程,依此类推。创建实例时,这些实例将填充正在运行的进程中的空间;销毁实例时,这些实例将腾空正在运行的进程中的空间。
低隔离级别的优势在于增加了单个进程支持的并发实例数。使用低隔离级别可以明显改善服务器的内存占用情况。但是,此改善存在一些风险。关闭进程或进程崩溃时,将会销毁共用该进程的所有实例。低隔离级别还会降低池收缩的效率,因为必须在停用进程中的所有实例之后,池收缩才可以移除该进程。
请注意,非池化服务始终运行于其各自的进程中;因此,隔离级别并不适用。
检查无效的数据连接
服务实例处于空闲状态时,服务器管理员很难确定与源数据的连接是否得到成功维护。ArcGIS Server 具有内置机制,可检查与 ArcSDE 地理数据库的无效连接。这些检查可避免您的服务在与 ArcSDE 的连接被删除或中断之后出现无响应的情况。
通过在 ArcCatalog 或管理器中打开服务属性 对话框的进程 选项卡,然后选中复选框定期检查并修复空闲实例的数据连接,可启用数据连接有效性检查。还需要以分钟为单位指定时间间隔,将以该时间间隔自动验证服务连接的有效性(并在需要时进行修复)。默认值 30 分钟通常比较合适。
此外,如果您的服务处于一段时间的空闲状态后,防火墙关闭了与 ArcSDE 连接的端口,启用这些检查同样可能有所帮助。在这种情况下,防火墙超时设置可能会对您所选择的时间间隔造成影响。
默认情况下,ArcGIS Server 已对忙碌 服务执行了检查,以验证及修复数据连接。每过 5 分钟,由服务接收的下一个请求将导致一次检查。可以通过将 ConnectionCheckInterval 标签添加到服务配置文件的 <属性> 部分来更改时间间隔或禁用此功能。有关 ConnectionCheckInterval 的附加信息,请参阅服务配置文件。
ConnectionCheckInterval 无法对空闲服务中的数据连接进行验证。
超时
客户端在获取对服务的引用之后,会在释放服务之前的特定时间内使用该服务。使用时间是从客户端获取对服务的引用开始至释放服务为止的时间。为避免客户端过长时间地占用对服务的引用(即客户端未正确释放服务),每个服务都具有客户端可使用一个服务的最长时间。如果客户端占用某一服务的时间超过最长使用时间,此服务将被自动释放,而客户端将失去对此服务的引用。
通过配置最长使用时间还可防止服务被用于执行过量的工作(超出管理员计划的工作量)。例如,由一个应用程序使用的执行地理数据库检出的服务可能具有 10 分钟的最长使用时间。与之相比,由多个应用程序使用的仅执行地图绘制的服务的最长使用时间可能只有 1 分钟。
当池化或非池化服务正在使用的实例达到最大实例数时,请求服务的客户端将排队等待,直至另一个客户端释放某一服务。从客户端请求服务开始至获得服务为止的时间为等待时间。每个服务都具有客户端获取一个服务将等待的最长时间。如果客户端的等待时间超过服务的最长等待时间,请求将超时。
第三次超时指示空闲实例可保持运行的最长时间。客户端停止使用服务期间,这些实例将仍然在服务器上运行,直到其他客户端需要实例为止。正在运行但未被使用的实例仍会占用一些服务器上的内存。您可以将运行中的服务数降至最低,以通过缩短此空闲超时来节省内存,默认的空闲超时为 1,800 秒(30 分钟)。空闲超时过短的缺点在于,当所有运行中的服务都超时的时候,后续的客户端便需要等待创建新实例。
当客户端由于服务器启动或为响应针对服务器的请求而在 GIS 服务器中创建服务时,客户端对服务进行初始化所用的时间被称为服务的创建时间。GIS 服务器具有启动超时值,用于指定启动尝试可经历的时间,超过该时间后,GIS 服务器将假定服务的启动处于挂起状态并取消创建服务。只可以通过手动编辑服务配置文件配置此属性。
GIS 服务器同时在内存和服务器的日志文件中记录有关等待时间、使用时间和在服务器内部发生的其他事件的统计数据。服务器管理员可使用这些统计数据可确定诸如某一服务的等待时间是否很长的问题,如果过长则可能表示需要增加该服务的最大实例数。
使用“容量”属性限制服务器的负载
容量用于限制可在服务器对象容器 (SOC) 计算机上运行的服务实例数。默认情况下,容量不受限制。但是,如果您的计算机的内存有限,则可设置容量限制以确保运行中的实例的内存需求量不会超出计算机的负荷。
SOC 上的运行服务实例数达到此容量后,服务器将不会在该计算机上创建任何新实例。如果所有 SOC 计算机都已经达到容量,则池收缩将发挥作用。
选择容量值时,请注意不要将运行中的实例与“使用中”的实例相混淆。运行中的实例占用内存,但不占用 CPU。使用中的实例同时占用内存和 CPU。仅能同时支持四个使用中的实例的服务器如果具有足够的 RAM,或许能够支持数目远大于四的运行中的实例。您可能要运行这些实例,以使其随时立即可用。
如果您的计算机内存充足,应将容量设置为无限制。
服务器始终会运行附加的后台 ArcSOC.exe 进程,该进程可对服务器目录的使用进行管理。此进程不计入容量。
服务器如何根据需要进行调整:池收缩
当某个 GIS 服务器的所有容器计算机都达到容量时会发生什么?ArcGIS Server 将使用池收缩概念移除不常用配置的服务实例,并且用较为常用的配置的实例进行替代。
每个 SOC 计算机上正在运行的服务实例数达到容量时,池收缩即生效。已发生此情况且 SOM 接收到服务请求时,服务器将创建请求的实例,并且销毁最近最少使用的服务配置的一个实例。以下各点对池收缩的功能和限制进行了更为详尽的说明:
- 池收缩不会销毁应用程序正在使用的服务的实例。如果所有 SOC 都已经达到容量且所有运行中的服务器对象实例都正在使用中,那么所有新的实例请求都必须排队等待。
- 池收缩受制于您为服务配置设置的最小实例数;任何配置的运行实例数都绝不会小于其最小实例数。
- 池收缩对于池化和非池化服务的处理方式相同。
- 池收缩会当您在 GIS 服务器上为每个 SOC 计算机设置容量值后生效。
- 池收缩对于低隔离级别的服务配置效果较差。低隔离级别的服务可有多达四个实例共用一个 SOC 进程。由于池收缩会创建并销毁进程,它会影响低隔离级别进程中的所有四个实例。即使这些实例中只有一个实例正在使用中,池收缩也无法生效。
- 当服务器负载较大时,池收缩是对有限内存资源进行合理利用的有效方法;但如果经常发生池收缩,您的系统可以得益于附加硬件(如果可用)。仔细进行编码并调整服务属性也可以降低服务器的负载。
限制用户可对服务执行的操作
为了便于控制 Web 服务的使用方式,每种类型的服务都具有一组允许的操作。每个操作都包括一套以组为单位进行启用或禁用的方法。Web 服务的客户端只能调用允许的操作方法。
假设您要允许 Web 制图服务的客户绘制地图但不查询地图图层的数据源。则需要禁用查询操作并确保允许进行地图操作。
如果使用添加新服务 向导(与发布 GIS 资源 向导形成对照)创建一个服务,可在创建该服务时选择允许的操作。无论最初如何创建服务,都可通过编辑该服务的属性更改允许对现有服务进行的操作。在服务属性 对话框的功能 选项卡中列出了可用的操作。
下表列出了在每种操作所包含的方法:
地图服务操作
地图 | 查询 | 数据 |
---|---|---|
GetDocumentInfo | 识别 | 查找 |
GetLegendInfo | QueryFeatureCount | QueryFeatureData |
GetMapCount | QueryFeatureIDs | |
GetMapName | QueryHyperlinks | |
GetDefaultMapName | GetSQLSyntaxInfo | |
GetServerInfo | ||
GetSupportedImageReturnType | ||
ExportMapImage | ||
IsFixedScaleMap | ||
ToMapPoints | ||
FromMapPoints | ||
HasSingleFusedMapCache | ||
GetTileCacheInfo | ||
GetMapTile | ||
HasLayerCache | ||
GetLayerTile | ||
GetVirtualCacheDirectory | ||
GetCacheName | ||
ComputeScale | ||
ComputeDistance |
地图服务默认情况下允许的操作为“地图”、“查询”和“数据”。
地理编码服务操作
地理编码 | 反向地理编码 |
---|---|
GeocodeAddress | ReverseGeocode |
GeocodeAddresses | |
StandardizeAddress | |
FindAddressCandidates | |
GetAddressFields | |
GetCandidateFields | |
GetIntersectionCandidateFields | |
GetStandardizedFields | |
GetStandardizedIntersectionFields | |
GetResultFields | |
GetDefaultInputFieldMapping | |
GetLocatorProperties |
地理编码服务默认情况下允许的操作为“地理编码”和“反向地理编码”。
地理数据服务操作
查询 | 提取分析 | 复制 |
---|---|---|
Get_Versions | ExpandReplicaDatasets | CreateReplica |
Get_DefaultWorkingVersion | ExtractData | ExportAcknowledgement |
Get_DataElements | ExportReplicaDataChanges | |
Get_MaxRecordCount | ImportAcknowledgement | |
TableSearch | ImportReplicaDataChanges | |
GetNextResultPortion | ReExportReplicaDataChanges | |
Get_Replicas | UnregisterReplica | |
Get_WrappedWorkspaceType | ImportData |
地理数据服务默认情况下允许的操作为“查询”和“提取分析”,这些操作启用所有支持的方法查询和提取数据。“复制”选项为同步、数据变更、消息确认和方案启用所有支持的方法。
Globe 服务操作
Globe | 动画 | 查询 |
---|---|---|
Get_Version | Get_Animation | 识别 |
Get_LayerCount | 查找 | |
Get_LayerInfos | ||
Get_LegendInfos | ||
Get_Config | ||
Get_MQT | ||
Get_Configuration | ||
Get_Tile | ||
Get_Symbols | ||
Get_Textures | ||
Get_VirtualCacheDirectory |
globe 服务默认情况下允许的操作为 Globe、“动画”和“查询”。与地图服务不同,“查询”操作同时包括“识别”和“查找”。
影像服务操作
影像 | 目录 | 下载 | 元数据 | 像素 |
---|---|---|---|---|
ExportImage | 字段 | 下载 | 元数据 | GetNativePixelBlock |
ExportMapImage | GetCatalogItemCount | GetFile | GetRasterMetadata | GetPixelBlock |
GenerateServiceInfo | GetCatalogItemIDs | |||
GetImage | GetCatalogItems | |||
识别 | GetNativeRasterInfo | |||
ServiceInfo | GetRasterInfo | |||
版本 | GetThumbnail |
如果根据镶嵌数据集发布了影像服务,默认情况下将启用所有功能。如果根据某些其他源(如栅格数据集、已编译的影像服务定义或图层文件)发布了影像服务,则只有“图像”和“元数据”功能适用,而且这些功能将被启用。