开源高性能服务器 c++_用于比较开源Java应用程序服务器的性能基准测试方法

开源高性能服务器 c++

越来越多的公司将其IT环境从昂贵的商业软件更改为免费的开源软件,以降低入门成本并在当今艰难的经济中生存。 开源Java应用程序服务器作为业务应用程序的核心,在这种趋势中起着重要的作用。

在选择可提高性能,易于管理且经济高效的Java应用程序服务器时,公司会花费大量时间和精力。 在开源Java应用程序服务器领域中有很多选择。 Geronimo,GlassFish,JBoss,JonAS,IBM®WebSphere®Application Server社区版,Apache Tomcat和Jetty是一些示例。 做出合适的解决方案的正确决定如此困难的一个原因是缺乏性能基准数据来进行比较。

有一个行业标准SPECjAppServer2004(Java应用程序服务器),它是用于衡量基于Java 2 Enterprise Edition(J2EE)技术的应用程序服务器性能的多层基准。 SPECjAppServer2004是一个端到端应用程序,它练习了由兼容的应用程序服务器实现的所有主要J2EE技术​​。 一些商业应用服务器供应商会定期发布其性能基准数据,例如BEA WebLogic和IBM WebSphere Application Server。 但是,没有开源Java应用程序服务器的数据。 为什么? 也许是因为它不是免费的。

在本文中,学习用于执行性能基准测试的简单开源方法。

性能基准的开源方法

开源Java应用程序服务器使用开源性能基准测试方法。 您可以通过以下步骤对Java应用程序服务器进行性能基准测试,采用简单易行的方法:

  1. 确定性能基准测试的要求。
  2. 确定衡量性能所需的工具。
  3. 准备性能测试,包括测试环境构建和冒烟测试。
  4. 运行测试并记录原始数据。
  5. 可视地显示结果以进行报告和分析。

步骤不是线性的。 在性能基准测试期间,您可能需要重复几次。 本文的其余部分将引导您完成这些步骤。

确定要求

首先,您需要确定性能基准的要求。 您必须具有一些要衡量的性能指标。 一些一般性问题可以得出绩效指标。 例如:

  • 应用服务器有多少吞吐量?
  • 应用程序服务器对客户端请求的平均响应时间是多少?
  • 引导应用程序服务器需要多少时间?
  • 运行应用程序服务器需要多少内存?

根据这些问题,您可以创建应用程序服务器性能指标矩阵,并将其用于记录性能基准测试结果。

您还必须考虑有关测试环境的几件事。 例如:

  • 运行应用程序服务器的典型硬件配置是什么? 是电脑吗? 低端服务器? CPU和内存配置如何?
  • 典型的软件配置是什么? 使用什么版本的JRE? 分配了多少JVM堆大小? 数据库软件的配置是什么?
  • 是否需要隔离的网络环境?

考虑这些问题将帮助您形成性能基准测试的实际测试拓扑。

确定工具

要对Java应用程序服务器进行性能基准测试,您需要一组设计良好的示例Java EE程序。 通过使用程序和记录数据,您可以获得性能指标的量化结果。 基准是关于比较的,因此Java EE样本程序集应该能够在您选择的不同应用程序服务器上运行。 很难从头开始。 幸运的是,在开源社区中有一个示例应用程序:Apache DayTrader。

样品申请

DayTrader,一个端到端的Web应用程序,是我们示例方法的核心。 DayTrader是模仿在线股票经纪业务的基准应用程序。 该应用程序使用户可以登录,查看其投资组合,查找股票报价以及买卖股票。 借助基于Web的负载驱动程序,DayTrader提供的实际工作负载可用于衡量和比较各种供应商提供的Java EE应用程序服务器的性能。 该应用程序还包含一组用于各种Java EE组件和通用设计模式的功能和性能测试的原语。

图1. DayTrader界面
图1显示了DayTrader登录屏幕

DayTrader利用J2EE组件(例如Servlet,JSP文件,企业Bean,消息驱动的Bean(MDB)和Java数据库连接性(JDBC))提供一组用户服务。 服务包括使用基于标准的HTTP和Web服务协议的登录/注销,股票报价,买卖,帐户详细信息等。 (有关DayTrader的更多详细信息,请查看应用程序中的“ FAQ”选项卡。)

在撰写本文时,DayTrader已更新为与Java EE 5功能兼容,例如具有Java Persistence API的EJB V3.0。 您可以自由地使用它来测量兼容Java EE 5的应用服务器的以下方面:

  • JSP / Servlet容器
  • EJB容器
  • 数据库连接
  • JPA功能
  • JTA功能

您还可以将DayTrader用于不兼容Java EE 5的应用程序服务器,例如Tomcat。

假设您有一个兼容Java EE 5的应用程序服务器,它由两个主要容器组成:Web容器和EJB容器。 Java EE工件(例如JSP和Servlet)正在Web容器中运行。 企业JavaBean(EJB)在EJB容器中运行。 这些工件是Java Web应用程序的主要组件。

DayTrader提供了一组工作负载原语来衡量Java应用程序服务器的功能。 每个原语在Java EE编程模型或工件上都有其特定的目标。 它们分为两类:Web容器原语和EJB容器原语。

表1描述了Web容器ping套件。

表1. Web容器原语
名称 描述
平板电脑 最基本的操作提供对静态HTML的简单“ Hello World”页面的访问。
显式GC 在AppServer上调用垃圾回收。 GC完成后报告堆统计信息。
PingServlet 通过服务器端servlet处理测试基本的动态HTML创建。
PingServletWriter 延伸PingServlet通过使用PrintWriter用于格式化输出与通过所使用的输出流PingServlet
PingServlet2Include * 测试响应包含。 Servlet 1包含Servlet 2的响应。
PingServlet2Servlet 测试请求分派。 控制器Servlet 1创建一个新的JavaBean对象,并将添加了Servlet 2的JavaBean转发给请求。Servlet 2通过Servlet请求对象获得对JavaBean的访问,并基于JavaBean数据提供动态HTML输出。
平JSP 测试对通过JSP脚本提供服务器端动态HTML的JSP的直接调用。
平捷 测试通过JSP脚本编写和使用新的JSP V2.0表达式语言对提供服务端动态HTML的JSP的直接调用。
PingServlet2JSP 测试一种常用的设计模式,在该模式下,向提供服务器端控制处理的Servlet发出请求。 Servlet创建一个具有动态设置属性的JavaBean对象,然后通过RequestDispatcher将Bean转发到JSP。 JSP获得对JavaBean的访问权,并提供格式化的显示以及基于JavaBean数据的动态HTML输出。
PingHTTPSession1 通过为每个用户创建唯一的会话ID,测试基本的HTTP会话功能。 该ID存储在用户的会话中,并在每个用户请求中被访问和显示。
PingHTTPSession2 通过使每五个用户访问的HTTP会话无效,进一步扩展了先前的测试。 这导致测试HTTPSession创建和销毁。

*可以通过加载重复参数来调整原语。 DayTrader应用程序具有更多详细信息。

表2描述了EJB 3容器ping套件。

表2. EJB V3容器ping套件
名称 描述
PingServlet2Session * 测试对无状态会话EJB的servlet调用的关键功能。 会话EJB执行简单的计算并返回结果。
PingServlet2Entity * 测试对EJB V3.0容器管理的实体的servlet调用的关键功能。 在此测试中,EJB实体表示数据库表中的一行。
PingServlet2Session2Entity * 测试完整的Servlet到Session EJB到Entity EJB的路径,以从数据库中检索单个行。
PingServlet2Session2EntityCollection * 测试通过调用会话EJB扩展了先前的EJB实体测试,该会话EJB在返回实体对象集合的实体上使用finder方法。 每个对象由servlet显示。
PingServlet2Session2CMROne2One * 测试驱动实体EJB通过EJB V3.0 CMR一对一关系获取另一个实体EJB的数据。
PingServlet2Session2CMROne2许多* 测试驱动实体EJB通过EJB V3.0 CMR一对多关系获取另一个实体EJB的数据。
PingServlet2Session2JDBC * 测试完整的servlet到Session EJB到JDBC的路径,以从数据库中检索单个行。
PingServlet2Session2JDBCCollection * 通过调用会话EJB到JDBC路径(从数据库返回多行)来扩展先前的JDBC测试的测试。
PingServlet2MDBQueue * 将消息驱动到基于队列的消息驱动的EJB(MDB)。 对Servlet的每个请求都会向队列中发送一条消息。 MDB异步接收消息,并在每100条消息上打印消息传递统计信息。

注意:不适用于性能测试。

PingServlet2MDBTopic * 将消息驱动到基于主题的发布/订阅MDB。 对Servlet的每个请求都会向主题发送一条消息。 TradeStreamMDB异步接收消息,并在每100条消息上打印消息传递统计信息。 主题的其他订阅者也将收到消息。

注意:不适用于性能测试。

PingServlet2TwoPhase * 驱动会话EJB,该会话EJB使用findByPrimaryKey (数据库访问)调用实体EJB,然后通过JMS队列将消息发布到MDB(消息访问)。 这些操作包装在全局两阶段事务中并提交。

*可以通过加载重复参数来调整原语。 DayTrader应用程序具有更多详细信息。

除了这些工作量原语之外,DayTrader还提供了一个复杂的交易方案来衡量Java EE应用程序服务器的整体性能。 该场景包括一个典型的Web应用程序模型,从Web容器到EJB容器再到数据库连接。 由于数据库连接的差异,复杂的贸易方案有两种区别:

  • 贸易场景– JDBC Direct
  • 贸易场景–完整EJB

浏览器中将出现“ 测试DayTrader方案 ”的链接。 单击重新加载以手动完成DayTrader场景。

您可以轻松访问部分或全部原语以及复杂的场景,以在Java应用程序服务器上进行性能基准测试。

负载生成工具

要测试性能,您将需要一个负载生成工具。 幸运的是,有许多免费的负载生成工具可供选择,例如Apache JMeter,Grinder和OpenSTA。 本文中的示例使用Apache JMeter。 只要满足您的要求,您就可以选择自己喜欢的任何工具。

建立测试环境

此时,您可以将您的计划在纸上应用到实际的运行系统中。 对于以下方法,建议您至少拥有三台计算机:一台用于应用程序服务器(或被测系统(SUT)),一台用于负载生成工具,一台用于数据库服务器。 该示例的测试使用了三台具有相同硬件配置的普通台式机:

  • CPU:Intel®Core 2 Duo E6750 2.66 GHz
  • 内存:2 G
  • 硬盘:希捷SATA 250G

为了避免意外的网络流量带来的影响,该示例将隔离的网络环境用于专用的性能基准测试。 使用10 / 100M交换机连接机器。

硬件准备好后,您需要安装操作系统。 该示例使用SuSELinux®Enterprise Server 10 SP2作为应用程序服务器的OS。 当前,大多数开源Java应用程序服务器都在Linux平台上运行。

安装操作系统后,您可能需要调整一些内核设置,以便应用程序服务器在大负载下正常运行。 要调整的典型参数是内核允许的进程处理程序编号。 默认情况下,该值为1024,但是对于应用程序服务器性能基准来说,该值是不够的。 您可以将其更改为更大的值: $ ulimit -n 10000

根据您选择的操作系统和安装类型,您可能需要调整其他设置(例如防火墙设置),以确保目标应用程序服务器上没有端口阻塞。 和网络设置,以确保它可以在目标负载水平下运行。

完成操作系统设置后,您将开始安装目标应用程序服务器和数据库软件。 按照目标应用程序服务器的手册,安装JDK和应用程序服务器。 一旦应用服务器启动并运行,您可能需要调整一些设置以进行大负载测试。 在性能基准测试中,负载生成工具将生成大型并发客户端,以将HTTP请求发送到应用程序服务器。 您需要将maxThreadsacceptCount扩展为更大的值。

以WebSphere Application Server CE和JBoss为例,关闭服务器并更改$ WASCE_HOME / var / config / config.xml中的tomcat6模块,如清单1所示。

清单1.更改Tomcat模块
...
<module name="org.apache.geronimo.configs/tomcat6/2.1.4/car"> 
        <gbean name="TomcatWebConnector"> 
            <attribute name="host">${ServerHostname}</attribute> 
            <attribute name="port">${HTTPPort + PortOffset}</attribute> 
            <attribute name="redirectPort">${HTTPSPort + PortOffset}</attribute> 
            <attribute name="maxHttpHeaderSize">8192</attribute> 
            <attribute name="maxThreads">3000</attribute> 
            <attribute name="minSpareThreads">25</attribute> 
            <attribute name="maxSpareThreads">75</attribute> 
            <attribute name="enableLookups">false</attribute> 
            <attribute name="acceptCount">4000</attribute> 
            <attribute name="connectionTimeout">${WebConnectorConTimeout}</attribute> 
            <attribute name="disableUploadTimeout">true</attribute> 
        </gbean>
...

为了保持与JBoss相同的级别,您需要更改$ JBOSS_HOME / server / standard / deploy / jbossweb.sar / server.xml,如清单2所示。

清单2.保持相同的级别
...
<Service name="jboss.web"> 

      <!-- A HTTP/1.1 Connector on port 8080 --> 
      <Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" 
        connectionTimeout="20000" redirectPort="8443" maxThreads="3000"
       minSpareThreads="100" maxSpareThreads="700" 
enableLookups="false" acceptCount="4000" disableUploadTimeout="true"/>
...

上面显示的更改是基本设置。 根据测试目标,您可能需要调整其他设置。 例如,您可能需要更改数据库服务器上的最大数据库连接数。 对于开箱即用的环境,这些设置应该足够了。

现在,您可以启动服务器并部署DayTrader。 默认情况下,DayTrader构建为可以在WebSphere Application Server CE / Geronimo上运行,但是有一个自述文件,其中包含在JBoss中运行该文件的说明。 要在其他应用程序服务器中运行它,您可以自己进行一些资源配置。 当然,如果您将设置贡献回开源社区以帮助DayTrader得到更广泛的使用,将不胜感激。

在部署DayTrader并成功运行之后,您需要按照其指示来配置运行时参数并初始化数据库。 DayTrader支持三种类型的数据库:DB2,Oracle和Derby。 该示例使用DB2®作为后端数据库。

冒烟测试

首次组装后进行第一次测试,以确保被测系统不会发生灾难性故障。 在冒烟测试证明该软件不会完全崩溃之后,该程序集即可进行更具压力的测试。

DayTrader启动并运行后,您就可以让负载生成工具对其施加一些负载。 通常,需要进行烟雾测试。 通过烟雾测试,您可以:

  • 准备加载脚本
  • 暴露潜在的配置问题
  • 了解环境的限制

在执行有效的性能基准测试时,了解这些因素很重要。 通过烟雾测试可以找到前面提到的内核和应用程序服务器配置。

在准备加载脚本时,请记住,不同的加载生成工具具有不同的语法和格式。 通常,对于负载生成脚本,应考虑:

  • 模拟并发客户端号
  • 重复号码
  • 重复间隔
  • 日志内容和格式

在开始正式执行之前,您可能需要多次重复调试和丰富您的加载脚本。 根据测试目标和所选的负载生成工具,这可能会花费大量时间。 (就个人而言,我认为Apache JMeter入门非常容易。GUI可以为您节省大量的脚本准备时间。)

烟雾测试的另一个好处是,您可以了解SUT的极限。 进行正式的性能基准测试时,可以为测试结果设置置信度。

运行测试并记录原始数据

进行冒烟测试后,您应该准备好所有加载脚本,以便正式执行性能基准测试变得容易。 您需要记住以下几点:

  • 对于每个加载脚本,进行预热运行以获取已编译或加载的目标基元。 之后,持续运行一段时间以获得稳定的结果。 对于该示例,每个加载脚本运行了20分钟。
  • 为了获得客观的结果,您应该考虑多次重复相同的加载脚本。 例如,对于每个DayTrader原语,将其重复三次以获取平均值。
  • 每次在TradeScenario上执行加载脚本时,都需要重新初始化数据库。 执行TradeScenario将增加数据规模,这将导致下一次与数据库相关的执行速度下降。

您可以准备一个数据表来记录测试结果,以轻松地将它们转换为图表以进行比较。 图2显示了样本数据表。

图2.用于记录原始数据的样本数据表
图2显示了样本数据表

显示结果以进行报告和分析

完成测试并记录结果后,您需要将数据转换为可见的显示(电子表格,图表,图形)以进行报告和分析。 例如,对WebSphere Application Server CE和JBoss进行了基准测试,结果如图3所示。

图3.样本吞吐量图表
对WebSphere Application Server CE和JBoss进行了基准测试,并得出了图表中所示的结果
表3.样本吞吐量数据表
原始 WebSphere Application Server CE(页/秒) JBoss(页/秒)
网页 PingServlet 22241.191 21353.691
PingSession1 19300.566 17323.521
平JSP 8160.188 7253.987
PingServletWriter 22232.547 20823.371
PingServlet2Servlet 21341.996 19742.348
PingJspEL 4008.242 3823.502
PingJDBCRead 4854.584 3704.013
PingServlet2JNDI 21188.262 13274.154
EJB3 PingServlet2Session 11396.99 2680.211
PingServlet2Entity 5066.833 4434.003
PingServlet2Session2EntityCollection 1306.057 635.269
PingServlet2Session2CMROne2一个 5152.952 1271.41
PingServlet2Session2CMROne2Many 1155.966
贸易方案 JDBC直接 696.466 265.345
完整的EJB3 572.112 258.502
图4.样本平均响应时间图
样本平均响应时间图
表4.样本平均响应时间数据表
原始 WebSphere Application Server CE(秒) JBoss(秒)
网页 PingServlet 0.012 0.013
PingSession1 0.014 0.016
平JSP 0.034 0.027
PingServletWriter 0.013 0.013
PingServlet2Servlet 0.013 0.014
PingJspEL 0.046 0.048
PingJDBCRead 0.061 0.08
PingServlet2JNDI 0.014 0.023
EJB3 PingServlet2Session 0.026 0.112
PingServlet2Entity 0.058 0.067
PingServlet2Session2EntityCollection 0.229 0.468
PingServlet2Session2CMROne2一个 0.058 0.236
PingServlet2Session2CMROne2Many 0.255
贸易方案 JDBC直接 0.359 1.122
完整的EJB3 0.5 1.152

下一个逻辑任务是性能分析,但是该讨论不在本文讨论范围之内。

摘要

在本文中,您了解了如何使用DayTrader示例应用程序在Java应用程序服务器上执行基准测试。 本文探讨了需求收集,工具,测试环境,测试执行和报告结果。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-perfbenchmk/index.html

开源高性能服务器 c++

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值