ArcGIS性能调优

我们可以把arcgis平台想象成一间咖啡店。客人来到咖啡店,从菜单里挑选自己需要的饮料或者食物,咖啡店的工作人员为客人提供他们要求的服务。在每天的不同时间段里咖啡店的繁忙程度也不相同,比如早上上班时间或者午饭时间来咖啡店的客人就特别多,经常会有人排队等在门口。作为咖啡店的老板,为了在减少客人排队等候时间的同时扩大咖啡店的生意,就需要提高整个店的运营效率,也就是进行性能调优的工作。


(《Computer Networks (5th Edition) 》by Tanenbaum )

概念

首先介绍几个相关的概念。性能,指的是完成某项任务的速度,或者也可以用时长来衡量,完成的速度越快,响应时间越短,那么性能就越好。可伸缩性,指的是在维持现有性能的前提下,完成更多任务、输出更多结果的能力。比如一条公路原本有2条车道,车流量有1000辆车每小时,平均车速在60公里左右,现在要求在平均车速不降低的条件下,将车流量增加到2000辆车每小时,那么就可以通过增加两条车道的方式扩展这条公路的通行能力。容量,指的是系统的最大承载能力,比如四环路的最大容量是一万辆车每小时,那么超过这个容量的话很有可能就会造成系统的拥堵或者故障。瓶颈,指的是会影响性能和容量的关键限制因素,比如高速公路的收费站,就算路很宽、车速很快,但是在收费站也会被拦截下来,影响整体的通行速度。

系统设计

在理想情况下,我们在搭建arcgis平台之前,首先应该先对整个系统做好规划。在做规划的时候需要思考很多问题,比如系统需要支持多少用户的访问?需要配置哪些硬件设备?需要多少核的cpu支持?用户的工作流都有哪些?工作流的服务时间要多长?系统的容量需要多大?等等。

如果系统设计规划的好的话,能够使资源的利用率最大化,用更少的硬件和花费得到更好的性能和可扩展性,同时也能使用户得到较好的使用体验。相反,如果在系统搭建前期没有做出合理的规划和设计的话,有可能会在使用中发现不可避免的问题,这样不得不推翻重建,会大大的增加人力和物力的投入,是非常不划算的做法。如果老板在开咖啡店前没有事先做好市场调研和准备工作,草率的开了一家店铺后发现根本无法应对客户过多的状况,还要再对店面进行施工,大把的时间和金钱都白白浪费掉了。所谓磨刀不误砍柴工,系统设计能够为整个平台的运作带来巨大的好处,是不可轻视的一项工作。

在进行系统设计之初就需要考虑硬件条件的限制。CPU的性能和核数会对服务响应速度及系统容量造成影响,在服务数量增多时,内存会成为一个重要的影响指标,当然CPU核数越多、内存越大,整个系统的性能会越好。影像服务和多数地理处理服务都依赖于磁盘的读写,所以硬盘的容量和读写速度等也会对系统造成比较大的影响。网络条件,比如带宽和延迟等在Web GIS系统中是重要的影响因素,尤其是在低带宽部署系统时需要特别慎重的考虑。

根据英特尔创始人之一戈登·摩尔(Gordon Moore)提出来的摩尔定律,每一美元所能买到的电脑性能,将每隔一年半到两年翻一倍。我们看到左边的表格是硬件系统性能增长的情况,右边的表格是ArcGIS for Server动态地图服务性能的增长情况,基本上还是达到了摩尔定律的标准的。

在进行arcgis平台的系统设计时我们可以使用esri官方提供的工具System Designer,可以在arcgis online网站上免费下载安装。

客户端

客户端是整个平台中最直观体验到性能问题的一层,比如在手机上加载地图很慢。客户端就好像在咖啡店里点餐的顾客,如果服务员把顾客点的东西用笔记在纸上,再拿去制作的话,速度就很慢。如果升级成现代的电子点餐的系统,就可以大大提高效率。同样,在我们的客户端也可以采用一些优化方式来提升性能。

在客户端使用的地图应用大体可分为底图和业务数据两大类,其中底图又可以分为传统的栅格切片和最新推出的矢量切片。从上午的演示中大家应该已经看到了,矢量切片本身的文件大小很小,所以在前端加载时能够极大的提升显示速度,并且还可以支持动态的更改样式等新的特性。在开发前端应用程序时,选择合适的开发包也可以提升应用程序的性能,比如使用最新的Runtime Quartz版本不仅可以支持矢量切片,内部对其他功能也进行了优化,带来性能的提升。另外,可以选择当前潮流所指的敏捷开发方式,使用Web AppBuilder、AppStudio等来进行应用程序的配置,在很短的时间内不需要写任何代码就可以完成应用程序的开发,大大缩减了需要投入的学习成本和维护人员投入。

Portal for ArcGIS

Portal作为arcgis平台的门户,是平台的控制访问中枢,用于整合资源和协同分享。Portal就像是咖啡店的店面,店面里既有需要现点现做的咖啡,也有由别的供货商提供的现成的、做好的罐装颜料、蛋糕、三明治等等,顾客来到店里可以自由选择,自由组合。我们在用Portal共享地图时也可以使用Portal中提供的Analysis工具对数据进行优化,从Data中提取Information,既能美化可视化效果,又能减少前端网络通信量。

ArcGIS for Server

客户端通过Portal访问到的服务,实际上是由arcgis server提供的。server就像是咖啡店的服务员,为客人提供所要求的服务。当客流量变大时,为了减少客人排队等候的时间,一是可以加快单次服务的速度,也就是提高系统性能;二是可以增加人手,也就是增大系统容量。首先从server的部署架构上来说,从10.4版本开始默认开启了单集群模式。单集群模式听起来好像不如多集群的好,实际上却能带来更稳定的效率。多集群模式的设计意图是为了能够尽快的响应请求,在集群内进行负载均衡,将请求转发给空闲的机器。但是这样的话为了保持机器间状态的更新,需要进行大量的网络通信,由此带来的网络带宽占用和不稳定性很可能会有更大的负面影响。所以对于一般情况,使用单集群模式会为平台整体带来更好的性能。但是对于特别的业务流程,可能多集群模式的利会远大于弊,这时还可以手动开启多集群模式。具体情况需要根据对实际使用情况的监控来调整。

不同类型的服务本身的性能也有高低之分。以最常用的功能,REST导出地图为测试基准,我们可以看到缓存过的服务要比动态地图服务的性能高。动态地图服务会在前端加载时进行动态投影,以及在服务器上动态的渲染出图,响应速度相对就会下降,而缓存服务已经预先在硬盘上生成了切片文件,出图时直接去读取相应的瓦片,几乎不涉及内存运算,处理速度快,CPU占用率低。而一些复杂的服务,比如地理处理服务或者网络分析服务,往往涉及较多的内存运算,所以在性能上来说是比较低的,需要相对比较长的时间来响应请求。既然缓存地图在性能上占优,我们就应该尽量多的使用缓存服务。


(http://blog.csdn.net/linghe301/article/details/20469591)

矢量切片的生成速度非常快,但是传统的栅格切片生成速度就比较慢,所以在使用栅格切片时也有一些技巧需要注意。首先是在更新缓存时,尽量隔离出需要更新的区域,只更新这个范围内的切片,可以节省大量时间。这个可以通过在生成切片时指定一个要素类的范围来完成。另外就是按需生成缓存,某些不常用的地区可以设置为在有客户端第一次访问的时候才生成切片。当缓存量很大时,将数据源拷贝到服务器所在机器,缓存创建速度会更快且更稳定。创建缓存时会对数据进行成千上万次请求,如果数据在本地,切片绘制会更迅速。理想的方法是在站点的每台GIS服务器的相同路径下放置相同的文件数据库。对文件数据库进行注册,在地图文档中,数据源使用本地路径。如果缓存速度与缓存占用磁盘空间相比,更在意创建速度的话,那么就应该避免使用PNG格式而用mixed格式,因为png格式会计算最佳位深,虽然能够减少文件大小,但是会大大增加计算时间。

服务实例数的设置是影响服务性能最主要的因素。在服务管理器的池化设置中可以指定某个服务最小和最大的实例数是多少。实例就是用来处理请求的最小的单位,一个实例在系统资源管理器中对应一个arcsoc.exe进程,比较特殊的是gp服务,一个gp服务的实例会启动两个arcsoc进程。在服务启动时,会根据配置的最小实例数启动相应的arcsoc进程,当服务请求增加时,server会自动启动更多的进程,但是不会超过设置的最大实例数。

最大最小实例数的设置是针对站点内的单台机器的。比如站点内一共有三台机器,服务1的最大实例数设置为2,服务2的最大实例数设置为3,那么因为在站点内共有三台机器,实例数的设置乘以3倍,也就是整个站点内服务1的总实例数为6,服务2的总实例数为9。

那么为服务配置多少个实例数合适呢?这个是需要根据请求量和cpu的核数来决定的。在服务启动时会根据最小实例数启动相应的soc进程,负载增加后server会在最大实例数范围内自动配置更多实例来响应请求,也就会启动更多的soc进程,更多的进程就要求cpu有更多的核数来处理。根据esri官方的测试结果,推荐的最大实例数设置为:为一般的动态地图服务配置cpu核数的3-5倍的实例数,而gp服务的话配置核数+1个实例数。比如一台8核的服务器,可以为动态地图服务配置24-40个实例数,为gp服务配置9个实例数。缓存服务的话由于cpu占用率很低,可以多根据使用情况多配置一些实例数。内存的话官方推荐每核配置3个G的内存,其中操作系统会占用一半左右,剩下的1.5G对于每核3-5个实例数的配置可以保证比较好的稳定性。

举个例子,假如预估的用户并发量有1000个,我们可以先记录下平均操作一次时长,比如需要0.2秒,假设用户在等待响应返回的可承受时长为1秒,那么1个实例就可以处理5个请求,1000个并发就需要200个实例,如果设置为每核5个实例数的话,就需要40个cpu核数,每核3G内存,一共需要120G的内存。当然这是理论值,可以为系统建设提供有效的参考数值,具体情况还需要对系统进行更全面的测试和监控才行。

我们都知道潮汐车道,早高峰的时候进城的车辆多,就把进城方向的车道调整的宽一些,晚高峰的时候出城的车辆多,再把出城方向的车道调整的宽一些。同样,在内存和CPU有限的情况下,需要对资源进行动态合理的调配,将空闲的实例释放掉,以供其他服务来使用。我们可以在服务器管理器中设置超时时长,比如减少客户端可占用服务的最长时间,在高峰时调高客户端可等待的最长时间,以及缩短空闲实例可运行的时间,当实例空闲一段时间后,就会被放回到进程池中,减小CPU的占用率。

另外还可以设置服务进程为高隔离或低隔离。高隔离的情况下,一个soc进程只对应一个实例,而低隔离的情况下一个soc可以对应多个实例。低隔离对内存的占用量比较下,但是稳定性比较差,而且如果进程终止的话会影响多个实例。高隔离虽然对内存的占用量比较高,但是稳定性好,进程终止时也只会影响一个实例。所以推荐的方式是使用高隔离的设置。需要注意对于gp服务这种需要比较复杂计算的服务来说,为了保证性能和稳定性,系统中默认设置为了高隔离,而不能够变成成为低隔离方式。

进程的回收指的是每隔多少个小时server会将该服务关闭再重新启动,定期回收有助于维护性能和稳定性。我们可以通过监测请求量,定期在访问最少的时间段内执行回收重启的操作。

server的日志中提供了统计server各项数据的功能,还可以自定义项目生成统计数据。这些数据都是我们进行系统性能优化时很好的参考数据。

在arcgis online上还可以下载其他的一些测试工具,比如system test和system monitor等等,这些工具都是esri官方提供的,专门针对arcgis平台进行测试的工具,可以提供对于空间数据和gis流程自动化测试的功能。我们可以在arcgis online上搜索拥有者是EnterpriseImp团队,并且勾选上桌面应用程序,就能下载到这些工具了。

(2016开发者大会讲座记录)