【问题标题】:Cause of Lag in Axis2 Web ServiceAxis2 Web 服务延迟的原因
【发布时间】:2012-01-09 23:49:55
【问题描述】:

我有一个最初在 Axis 1 中设计的 Java SOAP Web 服务,它不符合我的性能要求。

我最关心的请求是用于向数据库添加大量(数百万行)数据的请求。在客户端,我只是循环文件,将这些数据推送到我的 Web 服务。每行包含三个元素,因此请求类似于:

<SOAP Envelope/Header/Body>
<AddData>
  <Data>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
    <Age>42</Age>
  </Data>
</AddData>
</SOAP Envelope/Body>

我发现以下性能趋势:

  • 当我每个请求执行一行时,我每分钟可以获得大约 720 行。
  • 当我将多行封装到一个请求中时,我每分钟最多可以获得 2,400 行(每个请求 100 行)。

不幸的是,该性能无法满足我们的要求,因为我们有数亿行要插入(以每分钟 2,500 行的速度,加载所有数据大约需要 2 个月)。

所以我一直在研究应用程序,看看我们的瓶颈在哪里。每个 100 行的请求大约需要 2.5 秒(我尝试了几个不同的服务器并得到了相似的结果)。我发现了以下内容:

  • 客户端开销可以忽略不计(通过监控我自己的客户端的性能和使用 SOAP UI)
  • 数据库活动只占总时间的 10% (.2s) 左右,因此 Hibernate 缓存等不会有太大帮助。
  • 网络开销可以忽略不计(从客户端到服务器的 ping 时间 10MB/s 的吞吐量)。

所以这留下了大约 2 秒的时间。我可以指出的这个难题的唯一另一部分是在服务器端反序列化传入请求的开销。我注意到 Axis 2 声称在这方面提高了速度,因此我将此功能移植到 Axis 2 Web 服务上,但没有得到我想要的加速(每个请求的总时间提高了大约 10%)。

我是否低估了反序列化上述 100 个元素所需的时间?我无法想象反序列化可能需要大约 2 秒。

我可以做些什么来优化这个 Web 应用程序的性能并减少 2 秒的开销?

提前致谢!

========= 第二天.... =========== 剧情变厚了……

在@millhouse 的推荐下,我对生产服务器的单行请求进行了更多调查。我发现它们可以在良好的硬件上运行得相当快。因此,我尝试使用从 1(1,000 个单独请​​求)到 1,000(单个请求)的增量添加 1,000 行。

  • 1 行/请求 - 14.5 秒
  • 3/req - 5.8s
  • 5/req - 4.5s
  • 6/req - 4.2s
  • 7/req - 287s
  • 25/req - 83s
  • 100/req - 22.4s
  • 1000/req - 4.4s

如您所见,额外的 2 秒延迟会在每个请求中产生 7 行(与每个请求 6 行相比,每个请求大约额外增加 2 秒)。我可以始终如一地重现这一点。更大数量的请求都有类似的开销,但是当每个请求插入 1,000 行时,这种开销就变得不那么明显了。数据库时间呈线性增长,与整体请求时间相比仍然可以忽略不计。

所以我发现使用每个请求 6 行或每个请求数千行可以获得最佳性能。

有什么理由为什么 7 的性能会低于每个请求 6 行的性能?这台机器有 8 个核心,我们在会话池中有 10 个连接(即我不知道 6 的阈值是从哪里来的)。

【问题讨论】:

    标签: java web-services axis2


    【解决方案1】:

    大约 5 年前,我将 Axis2 用于类似的工作,但恐怕我无法提供任何真正的“灵丹妙药”来让它变得更好。我记得我们的服务以每秒数百次而不是每秒一百次的速度执行。

    我建议您分析您的请求处理,或者简单地添加大量日志记录(可能使用周围的许多秒表实现之一来提供详细的时间)并查看使用时间的内容。一个请求真的需要 2 秒才能通过 Axis 层到达您的代码,还是只是通过许多较小的东西累积?

    如果单独处理单个请求的速度很快,但是一旦您开始加载服务就会陷入困境,请检查您的应用服务器的线程设置。我似乎记得必须将我的处理分成同步和异步部分(即同步部分做最少的工作以向客户端提供合适的响应,并在池中的线​​程中完成繁重的工作),但这可能不适合您的情况。

    还要确保构造一个新的User 对象(或任何它)不会做任何太昂贵的事情(比如从一个包装了 DAO 的服务中获取一个新 ID,这会影响一个缓慢的数据库服务器,它运行一个写得不好的存储过程,它锁定了整个表;-))

    【讨论】:

    • 这是我见过的解决这个问题的最佳建议。在单独测试之后,我更加困惑(参见上面的编辑),但能够找到一个可以让我获得可接受性能的组合。
    • 我将推迟选择一个答案,看看是否有人可以提供一些见解,解释为什么每个请求 7 行与 6/req 有如此大的不同。但如果我们无法弄清楚这一点,我认为这可能是最好的建议!
    • 哇! 7排的表现真的是一落千丈不是吗?!?!是时候开始缩小罪魁祸首了。我会尝试用“模拟”实现替换数据库连接(或者如果您愿意,可以使用HSQL 之类的东西),看看这个奇怪的阈值是否仍然存在。我会说,某处某处正在锁定/等待/和/或超时。
    • 从来没有弄清楚是什么导致了 7 点的卡顿,但我在另一个我们正在开发的类似 Web 服务中发现了它。似乎与数据库无关,所以我认为这是 Axis 的反序列化。很奇怪。尽管如此,还是感谢您的建议!在我发现错误/错误配置之前,我认为这对于面临类似问题的人来说通常是很好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多