对MapGuide/AIMS进行压力测试StressTest并进行性能优化

你按照缺省配置部署AIMS或者MapGuide时也许发现,这个系统的性能并不是很好,并发用户稍微多一点就MapGuide Server就死掉了。这是因为MapGuide的缺省配置只是比较安全的一个设置,能确保在大多数机器配置下能够运行而已,但如果把这个缺省配置应用到正式生产环境中,性能就会出现问题,我们必须根据实际情况对MapGuide Server的配置进行优化。相关设置可以在serverConfig.ini里面调整,这个文件缺省在C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Bin目录下。

那么更改那些参数,改为多少合适呢? 为了更有针对性的对MapGuide中serverConfig.ini中的参数修改来达到性能优化,我们可以先通过压力测试一下,看看那个环节出问题。压力测试有不少工具,比如Grinder,LoadRunner,Microsoft Web Application Stress Tool等等,你可以选用你自己熟悉的工具。

下面我用Grinder来对我的AIMS站点来做个测试。Grinder是个开源的压力测试工具,可以从这里下载。我对Sheboyon示例数据做一下压力测试,这里有一个别人写好的测试脚本,这个脚本对下面8种常用操作做了压力测试,包括加载map viewer,要素查询,漫游,缩放,选择和清除选择等等,具体请参考测试脚本Script_BasicNet2010.py。

 

先说一下我的测试环境,我的笔记本:

Intel Core i7 Q820@1.73G

8G 内存 开始测试时已用内存3.2G,我开了一些常用的程序,包括现在正在用来写博客的LiveWriter。

Windows 7 64位

Autodesk Infrastructure Map Server 2013 64位

 

image

 

下面是测试方法:

1. 安装测试环境

Grinder是基于Java编写的,首先你需要配好Java环境,这里不细说,网上一搜一大堆。

下载Grinder

下载测试脚本,并解压。

2. 修改测试脚本参数

Grinder的MapGuide压力测试脚本修改,由于这段脚本是针对Sheboygan示例数据进行测试的,如果你没有这个示例数据,可以从OSGeo来下载,当然如果你需要测试你自己的数据,那么需要对测脚本进行更改,我这里先对Sheboygon数据来测试。

脚本缺省的设置http://localhost/mapguide 上的PHP版本的MapGuide做1个用户的测试。我安装的是Autodesk Infrastructure Map Server 2013的.net 版本,所以需要更改一下参数。

打开scripts/grinder.properties,更改为:

 

grinder.script = sheboyganNet.py             测试.net版本的AIMS
grinder.processes = 10                           10个并发用户
grinder.threads = 1
grinder.runs = 0 

 

然后打开SheboyganNet.py,更改RARAM_BaseUrl 为 http://localhost/mapserver2013/


 

execfile('.\scripts\Params_Basic2010.py')
execfile('.\scripts\Params_SheboyganCommon.py')

#Mapguide Server url
PARAM_BaseUrl = "http://localhost/mapserver2013/"

PARAM_WebLayout = "Library://Samples/Sheboygan/Layouts/SheboyganAsp.WebLayout"
PARAM_MapDefinition = "Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition"
PARAM_MapName = "Sheboygan"

PARAM_InitialLegendLayers = ["Library://Samples/Sheboygan/Layers/Islands.LayerDefinition",
    "Library://Samples/Sheboygan/Layers/Hydrography.LayerDefinition",
    "Library://Samples/Sheboygan/Layers/CityLimits.LayerDefinition",
    "Library://Samples/Sheboygan/Layers/Districts.LayerDefinition",
    "Library://Samples/Sheboygan/Layers/Parcels.LayerDefinition"]
   
execfile('.\scripts\Script_BasicNet2010.py')

 

3 运行测试

如果你是第一次运行Grinder,首先运行一下SetClasspath.bat把Grinder的相关库加入到classpath中去,运行一次就可以了。

双击StartConsole.bat 启动控制台

双击StartAgent.bat启动代理

然后的控制台中,通过Action菜单,启动进程start the process,这里有个关于grinder 控制台的文档

 image

 

 

对AIMS 2013的缺省安装设置进行10个并发用户的压力测试,不一会儿在Error.log里就出现了下面的错误,表明不能在创建新的的会话session了。

<2012-08-30T16:00:53>     74620        127.0.0.1    Administrator
Error: Cannot create repository: Session:d20be822-f278-11e1-8000-1cc1de9ea86d_en_MTI3LjAuMC4x0AF20AF10AF0//
StackTrace:
  - MgSiteServiceHandler.ProcessOperation() line 83 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\SiteServiceHandler.cpp
  - MgOpCreateSession.Execute() line 109 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\OpCreateSession.cpp
  - MgServerSiteService.CreateSession() line 762 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\ServerSiteService.cpp
  - MgServerResourceService.CreateRepository() line 491 file d:\build\ims2013\build_52.8\ent\os\server\src\services\resource\ServerResourceService.cpp   
<2012-08-30T16:00:53>     74820        127.0.0.1    Administrator
Error: Cannot create repository: Session:d203d196-f278-11e1-8000-1cc1de9ea86d_en_MTI3LjAuMC4x0AF20AF10AF0//
StackTrace:
  - MgSiteServiceHandler.ProcessOperation() line 83 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\SiteServiceHandler.cpp
  - MgOpCreateSession.Execute() line 109 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\OpCreateSession.cpp
  - MgServerSiteService.CreateSession() line 762 file d:\build\ims2013\build_52.8\ent\os\server\src\services\site\ServerSiteService.cpp
  - MgServerResourceService.CreateRepository() line 491 file d:\build\ims2013\build_52.8\ent\os\server\src\services\resource\ServerResourceService.cpp   

 

那么如何优化呢?我进入到serverConfig.ini里面,修改参数配置如下,请注意高亮的部分。

[ResourceServiceProperties]
# *****************************************************************************
# R E S O U R C E  S E R V I C E
#
# Property Name                    Description
# -----------------------------------------------------------------------------
# LibraryRepositoryPath            Path where the Library repository is stored
# LibraryResourceDataFilePath      Path where the Library resource data files
#                                  are stored
# PackagesPath                     Path where the resource packages can be found
# RepositoryCheckpointsTimerInterval Time duration in seconds for when the server
#                                  performs checkpoints for all the repositories
#                                       0 < Value <= 2147483647
# ResourceChangeTimerInterval      Time duration in seconds for when the server
#                                  dispatches resource change notifications
#                                       0 < Value <= 2147483647
# ResourceDataFileTrashFolderName  Folder where the repository trash files are
#                                  stored
# ResourcePermissionCacheSize      Max # of resources with permission
#                                  information to be cached
#                                       0 <= Value <= 2147483647
# ResourceSchemaFilePath           Path where the resource schema files are
#                                  stored
# SessionRepositoriesConfig        Sets whether to use a single file session
#                                  repository or a session repository file per session.
#                                       SingleFile or FilePerSession
# SessionRepositoriesLimit         The total number of active session files allowed.
#                                  This setting only works when FilePerSession
#                                  is used.

# SessionRepositoryPath            Path where the Session repository is stored
# SessionResourceDataFilePath      Path where the Session resource data files
#                                  are stored
# SiteRepositoryPath               Path where the Site repository is stored
# *****************************************************************************
LibraryRepositoryPath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Repositories\Library\
LibraryResourceDataFilePath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Repositories\Library\DataFiles\
PackagesPath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Packages\
RepositoryCheckpointsTimerInterval = 600
ResourceChangeTimerInterval = 5
ResourceDataFileTrashFolderName = Trash
ResourcePermissionCacheSize = 1000
ResourceSchemaFilePath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Schema\
SessionRepositoriesConfig = FilePerSession
SessionRepositoriesLimit = 2000
SessionRepositoryPath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Repositories\Session\
SessionResourceDataFilePath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Repositories\Session\DataFiles\
SiteRepositoryPath = C:\Program Files\Autodesk\Autodesk Infrastructure Map Server 2013\Repositories\Site\

[SiteServiceProperties]
# *****************************************************************************
# S I T E  S E R V I C E
#
# Property Name                    Description
# -----------------------------------------------------------------------------
# SessionTimeout                   Time duration in seconds for when an idle
#                                  session is expired
#                                       0 < Value <= 86400
# SessionTimerInterval             Time interval in seconds for when the server
#                                  checks for idle sessions
#                                       0 < Value <= 2147483647
# *****************************************************************************
SessionTimeout = 400
SessionTimerInterval = 200

 

其中SessionRepositoriesLimit的值表示允许创建的活动会话Session的个数,缺省值是200,这个太小了,我把这个值增大为2000. 下面还对SessionTimeout  和 SessionTimerInterval 的值进行了更改,SessionTimeout表示session过期的时间,SessionTimerInterval 表示隔多长时间来检查session是否过期。在session过期时MapGuide Server就会释放掉相应的内存,这里把session过期时间缩短和检查间隔缩短,以便MapGuide Server能及时清理不用的Session。经过这样的设置之后,我上面的错误信息消失了。

 

下面是100个并发用户的压力测试截图,没有任何错误信息:

image

image

image

CPU及内存使用情况:

image

 

根据前一篇博客Counting the active session number and tune up concurrent performance of MapGuide/AIMS中介绍的Session计算方法,大约有700个活动的会话。

image

 

活动session数是和你的可用内存息息相关的,可能话尽量多配内存,并使用64位版本,另外增加配置文件中的允许session数并缩短session时间和过期检查事件以便及时清理掉不用的session。

好了,看到这里,你对MapGuide的性能有信心吗?


Related Posts Plugin for WordPress, Blogger...