在 AIX 上通过 pollset 接口实现高效的 I/O
2009-09-05 00:00:00 来源:WEB开发网图 5. Petstore 环境
图 5 说明我们的实验环境,它包含三层:模拟的客户机、应用服务器和后端数据库服务器。对于模拟客户机,我们使用 8 台基于 Linux® 的刀片服务器,它们运行一个基于开放源码 Grinder 工具的客户机模拟程序(见 [GRIDER])。对于我们的 Ajax 实验,模拟总共 1280 个客户机,每个客户机在循环中随机选择一个宠物条目并向应用服务器发送 Ajax 请求,请求获取关于这个宠物的信息。对于应用服务器,使用在 IBM BladeCenter® JS22 服务器上运行的 Glassfish 应用服务器(见 [GLASSFISH]),这台服务器使用 4GHz 的 4 核 POWER6™ 处理器。另外,使用在 IBM BladeCenter HS21 上运行的 MySQL 数据库,这台机器使用 8 核 Intel Xeon E5320 处理器。
实验结果
我们通过在一个 Java 驱动程序中使用 pollset API 来评估性能改进。在实验中,我们主要关注前面介绍的 Ajax 请求,因为这个场景代表 Web 2.0 应用程序中常见的客户机 - 服务器交互模式。图 6 显示对于两个驱动程序测得的吞吐量性能结果:一个使用 poll(),另一个使用 pollset()。结果表明,与使用 poll API 的老驱动程序相比,使用 pollset API 的驱动程序的吞吐量性能提高了 13.3%。
图 6. 两个驱动程序的吞吐量性能,一个使用 poll(),另一个使用 pollset()
我们还使用 curt 命令进一步分析了系统时间。这个命令是 AIX 跟踪工具的一部分(见 [AIX TOOL]),我们通过它了解 pollset API 可以减少多少系统时间。图 7 显示在修改 java.nio.pollset.RegistrationPerCall 的值时,每毫秒两个系统调用(pollset_ctl() 和 pollset_poll())的数量。随着 java.nio.pollset.RegistrationPerCall 值的增加,pollset_ctl() 的 CPU 时间减少,这是因为每个 pollset_ctl() 处理的套接字数量增加了。
图 7. 每毫秒系统调用数量
图 8 显示 poll()、pollset_ctl() 和 pollset_poll() API 的 CPU 时间比例。原来的驱动程序在调用 poll() 方面花费 5.3% 的 CPU 时间(见 图 8 中最左边的条),新的驱动程序在调用 pollset_ctl() 和 pollset_poll() 方面只花费 3% 的 CPU 时间。因此我们的实验结果表明,pollset API 有助于减少系统时间,而且我们的实现对于 java.nio.pollset.RegistrationPerCall 参数不敏感,修改这个参数对系统时间和吞吐量性能影响不大。
图 8. CPU 时间花费
结束语
本文通过一个宠物商店应用程序展示了使用 pollset 接口对性能的益处。另外,pollset 接口只查询繁忙的文件描述符,这减少了内核和用户空间之间传输的数据量。在文件描述符集不需要频繁更新的情况下,最适合使用 pollset 接口。
更多精彩
赞助商链接