测量 COM+ 性能






4.53/5 (7投票s)
测量 COM+ 性能。
引言
COM+ 在不同 Microsoft Windows 版本上的性能表现不同。例如,Windows Server 2012 上的 COM+ 性能比 Windows Server 2003 上的差。此工具有助于测量 COM+ 性能。
背景
在许多应用程序中,业务逻辑和数据访问层运行在 COM+ 组件中。因此,这些组件的性能至关重要,因为它们会显著影响应用程序的整体性能。COM+ 和 .NET 在大多数 Windows 版本上都可用,因此迁移 COM+ 应用程序无需更改代码。理想情况下,性能在不同 Windows 版本之间也应该保持一致,但事实并非如此。
此工具会生成多个线程,每个线程通过调用一个非事务性 COM+ 组件从数据库读取一条记录,然后通过调用一个事务性 COM+ 组件将该记录写回数据库。性能设置是通过执行此过程一定次数(例如 1000 次)所需的时间来衡量的。此工具还提供了不使用 COM+ 的测试,以及读写文件的测试。
Using the Code
项目 ComPlusPerf
提供了 Visual Studio 2010 项目 ComPlusPerf.vbproj,其中包含以下项:
- ComPlusPerf.snk:包含用于签名程序集的强名称。注册到 COM+ 的程序集必须进行强签名。
Form1
:用于配置和运行测试的用户界面ModSettings
:用于读取和写入用户设置的模块SQLDataAccessComPlusR
:用于读写数据库的非事务性 COM+ 组件SQLDataAccessComPlusU
:用于写数据库的事务性 COM+ 组件SQLDataAccessNormal
:用于读写数据库的类,非 COM+
编译和注册
- 在 Visual Studio 2010 中打开 ComPlusPerf.vbproj。较新版本的 Visual Studio 也应该可以正常工作。
- 生成项目。这将创建一个目标平台为
AnyCPU
的程序集,这意味着它既可以在 32 位机器上注册,也可以在 64 位机器上注册。 - 对于 32 位机器,双击 RegisterComPlusPerf.bat 即可在 COM+ 中注册该程序集。
- 对于 64 位机器,请在 RegisterComPlusPerf.bat 的第一行将 "
Framework
" 更改为 "Framework64
"。 - 在 开始/运行 comexp.msc 中执行,应会显示 COM+ 资源管理器,您可以在其中查看
ComPlusPerf
组件是否已安装。 - 根据安全设置,您可能需要设置 COM+ 组件的标识(右键单击
ComPlusPerf
组件,选择“属性/选项卡标识”)。错误消息:“COM+ 无法与 Microsoft 分布式事务协调器通信”表明必须设置正确的标识。
窗体描述
双击 bin/ComPlusPerf.exe。将出现以下窗体:
- 窗体顶部的
列表框
包含可运行的不同测试。每次迭代都会执行选中的测试。提供的测试如下:DbNormalAdd
:使用普通组件(非 COM+)向数据库的 Table1 添加一条记录。Table1
有 94 个字段。第 56 个字段是varchar(max)
类型,包含 4000 个字符。DbNormalUpdate
:从属性网格的 "表名
" 字段中指定的表中读取一条记录,将属性网格的 "列名
" 字段中指定的列更新为当前日期和时间,然后使用普通组件(非 COM+)将记录写回数据库。DbComplusAdd
:与DbNormalAdd
类似,但使用 COM+ 组件。DbComplusUpdate
:与DbNormalUpdate
类似,但使用 COM+ 组件。SleepComplus
:调用一个 COM+ 组件,该组件的睡眠时间由属性网格的 "毫秒
" 字段定义。ReadFile
:读取属性网格的 "路径
" 字段中指定的文件。WriteFile
:写入属性网格的 "路径
" 字段中指定的文件。文件大小由属性网格的 "大小
" 字段指定。
- 窗体中间的
属性网格
定义了上述测试使用的参数。- 数据库
列名
:要更新的列名,必须是日期列。连接字符串
:用于访问数据库的连接字符串。用户必须拥有删除和创建表以及选择、插入和更新记录的权限。起始记录号
:表必须有一个名为 "Id
" 的列。测试将从该值定义的记录开始向上操作,例如,如果值为 1,则测试从第一条记录开始;如果值为 100,则测试从第 100 条记录开始。表名
:要运行测试的表。该表至少应包含两列:"Id
" 列(类型为int
,主键)和字段 "列名
" 中定义的列(日期类型)。
- Execute
块大小
:每个线程处理一定数量的数据块,然后处理下一个块。块中的记录数由此参数指定。迭代次数
:要执行的总迭代次数。线程数
:并行运行的线程数。开始时,每个线程都会获得一个工作块。一旦线程完成一个块的工作,它就会开始处理下一个块。测试在所有块都处理完毕(即所有迭代都完成)时结束。
- 文件
路径
:读取或写入的文件路径大小
:要写入的文件大小
- COM+ 睡眠
毫秒
:COM+ 组件中睡眠的毫秒数。
上下文菜单
:右键单击属性网格会弹出一个上下文菜单,其中包含以下项:Table1 创建
:在指定连接字符串的数据库中创建Table1
、Table1_Audit
表和一个用于Table1
的触发器。此表有 94 列,类似于实际情况。获取行数
:计算并显示属性网格中定义的表中的行数。重置设置
:将所有值重置为原始设置。
- 开始按钮位于窗体底部。测试开始后,其文本和功能将变为停止按钮。
- 进度条显示已完成迭代的百分比。
- 进度条旁边的标签显示测试至今已花费的总时间(小时、分钟和秒)。
- 数据库
测试
此程序已在 Windows 7、Windows Server 2003 和 Windows Server 2012 上进行测试。要运行该程序,请按照以下步骤操作:
- 运行 ComplusPerf.exe。
- 在属性网格中,更改连接字符串以指向 SQL 服务器上的测试数据库。
- 在
属性网格
上右键单击,然后从上下文菜单中选择 "Table1 创建
"。这将创建名为Table1
的表。 - 在列表框中,勾选
DbNormalAdd
,然后单击“开始”按钮。这将向Table1
添加由属性网格的 "迭代次数
" 字段定义的记录数。 - 在
属性网格
上右键单击,然后选择 "获取记录数
"。这将显示属性网格的 "表名
" 字段中定义的表中的记录数,默认情况下为Table1
。 - 在属性网格中,取消勾选
DbNormalAdd
,勾选DbComplusUpdate
,然后单击“开始”按钮。这将更新属性网格的 "表名
" 字段中定义的表中的记录数,数量为属性网格的 "迭代次数
" 字段定义的数量。右下角的标签指示了测试的运行时间。 - 您也可以尝试其他测试,并更改执行参数,看看在不同线程数下的测试性能如何。
- 如果您更改表名,您也会体验到不同的性能。列数少的小表性能会好很多。
结果
在一台装有 4 个 Intel(R) Xeon(R) CPU E5-4660 v2 @ 2.20 GHz 处理器和 32GB 内存的机器上运行了多项测试。一台机器安装了 Windows Server 2003,另一台安装了 Windows Server 2012。在两台机器上,程序集都使用 32 位 regsvcs 注册。运行了一些测试,并使用 64 位 regsvcs 注册了程序集。32 位和 64 位版本之间的性能差异不大。
DbComplusUpdate
此测试使用 COM+ 向数据库读写 5000 条记录,分别使用 10 个和 100 个线程。在 Windows Server 2012 上,还额外运行了应用程序池分别为 2、4 和 10 的测试。应用程序池决定了每个 COM+ 应用程序创建多少个 dllhost 进程。结果表明,Windows Server 2012 比 2003 慢,但应用程序池为 2 和 4 时,性能显著提高。列“秒”表示测试的运行时间,列“差异”表示 Windows Server 2012 与 Windows Server 2003 的性能差异百分比。
编号 | 测试 | seconds | diff | |||
---|---|---|---|---|---|---|
1 | Win 2003,5000 次迭代,10 个线程 | 41 | ||||
2 | Win 2012,5000 次迭代,10 个线程 | 54 | 31,71% | |||
3 | Win 2003,5000 次迭代,100 个线程 | 38 | ||||
4 | Win 2012,5000 次迭代,100 个线程 | 47 | 23,68% | |||
5 | Win 2012,5000 次迭代,100 个线程,应用程序池 2 | 43 | 13,16% | |||
6 | Win 2012,5000 次迭代,100 个线程,应用程序池 4 | 41 | 7,89% | |||
7 | Win 2012,5000 次迭代,100 个线程,应用程序池 10 | 42 | 10,53% |
DbNormalUpdate
此测试与上一个测试相同,但未使用 COM+。在这种情况下,Windows Server 仍然略慢,但慢得不多。这表明主要是 COM+ 在 Windows Server 2012 上变慢了。
编号 | 测试 | seconds | diff | |||
---|---|---|---|---|---|---|
1 | Win 2003,5000 次迭代,10 个线程 | 27 | ||||
2 | Win 2012,5000 次迭代,10 个线程 | 31 | 14,81% | |||
3 | Win 2003,5000 次迭代,100 个线程 | 21 | ||||
4 | Win 2012,5000 次迭代,100 个线程 | 22 | 4,76% |
SleepComplus
在此测试中,调用 COM+ 组件中的一个函数,该函数会睡眠 10 毫秒。同样,Windows Server 2012 较慢,并且随着线程数(即 COM+ 中激活的对象数)的增加而显著变慢。这表明 COM+ 在 Windows Server 2012 上的扩展性不如 Windows Server 2003。
编号 | 测试 | seconds | diff | |||
---|---|---|---|---|---|---|
1 | Win 2003,10000 次迭代,10 个线程 | 15 | ||||
2 | Win 2012,10000 次迭代,10 个线程 | 17 | 13,33% | |||
3 | Win 2003,10000 次迭代,100 个线程 | 12 | ||||
4 | Win 2012,10000 次迭代,100 个线程 | 16 | 33,33% |
历史
- 使用 COM+ 和不使用 COM+ 在数据库中读取和更新一条记录的测试,以及读取和写入文件的测试