Intereting Posts

请求频率下降时为什么响应时间会爆炸?


更正 :响应时间( %D )是μs而不是ms! 1

这并不能改变这种模式的怪异性,但这意味着它实际上不那么具有破坏性。


为什么响应时间与请求频率成反比?

在处理请求不太忙时,服务器不应该更快响应吗?

任何build议如何使Apache“利用”较less的负载?

在这里输入图像描述

这种模式是周期性的。 这意味着,如果展示次数低于每分钟200个请求(这是由于自然的用户活动)从深夜到清晨,就会显示出来。


这些请求是非常简单的发送less于1000个字符的JSON POST – 这个JSON被存储(附加到一个文本文件) – 就是这样。 答复只是“ – ”。

图中显示的数据是用Apache本身logging的:

 LogFormat "%{%Y-%m-%d+%H:%M:%S}t %k %D %I %O" performance CustomLog "/var/log/apache2/performance.log" performance 

    这是数据中心的常见行为。 您的响应时间较慢的时间对应于通常称为批处理窗口的时间。 这是用户活动预期较低的时间段,可以运行批处理stream程。 备份也在这段时间内完成。 这些活动会导致服务器和networking的资源紧张,从而导致性能问题,例如您所看到的。

    有几个资源可能会导致问题:

    • 高CPU负载。 这可能会导致apache等待一个时间片来处理请求。
    • 高内存使用率。 这可以刷新缓冲区,使apache服务资源,而无需从磁盘读取。 它也可能导致apache工作人员的分页/交换。
    • 高磁盘活动。 这可能会导致磁盘I / O活动在服务内容中相应延迟排队。
    • 高networking活动。 这可能会导致数据包排队等待传输,增加重试次数,降低服务质量。

    我用sar来调查这样的发布。 可以使用atsarsar数据收集到日常数据文件中。 可以检查这些可以看到当性能正常时白天的系统行为是什么样的,并且当性能是可变的时候会发生错误。

    如果您正在使用munin或其他系统收集和绘制资源利用情况来监视系统,那么您可能会发现一些指标。 我仍然觉得sar更精确。

    niceionice这样的工具可以应用于批处理过程,以将其影响降到最低。 它们只对CPU或I / O问题有效。 他们不太可能解决内存或networking活动的问题。

    将备份活动移至单独的networking并减lessnetworking争用。 可以configuration一些备份软件来限制将要使用的带宽。 这可以解决networking争用。

    根据批处理过程的触发方式,您可能会限制并行运行的批处理进程的数量。 这可能实际上提高了批处理的性能,因为它们可能经历了相同的资源争夺。

    如果请求发送者在提交新的请求之前等待先前的请求完成,则这种关系可能发生在另一个方向上。 在这种情况下,由于客户端排队,stream量会随着请求时间的增长而下降(无论出于何种原因)。

    或者它可能是您测量的工件 – 如果上面的图表显示已完成的请求 ,而不是到达的请求 ,则速率将随着请求处理时间增长(假设有限容量:D)而下降。

    虽然@ BillThor的答案可能是正确的,但低负荷时期似乎不太可能完全被备份过程所占用(即时期恰好相符)。

    另一种解释是简单的caching。 如果一个给定的脚本/数据库/最近没有使用过,那么相关的caching数据可能已经被删除,以便为操作系统的其余部分释放内存。 这可能是数据库的索引,或者是与文件有关的O / S缓冲区,或者其他类似的东西。 如果查询自上次查询以来已经过了一段时间,则查询将不得不重构这些信息。 在繁忙的时期,这将不会发生,因为最后一个查询会频繁。 这也可以解释为什么你在忙碌的时候会看到低响应时间高响应时间。

    在这里看到的对我来说就像是一个统计问题。 这可能不是,@ BillThor的答案可能是正确的,但我会张贴完整性。

    响应时间图是基于百分位数的。 一个800-1000个请求的样本池是一个很好的样本数量,50-100个请求可能不是那么多。

    如果您认为缓慢请求的数量不是请求数量的线性函数,请求数量增加一个数量级不会导致缓慢请求数量级的增加,则会导致请求数量增加平均请求时间较短。

    有谎言,大谎言和统计数字。

    我的假设:你有三个不同types的请求:

    1. 包含大部分请求的正常可变数据stream都在200-300μs内完成。
    2. 小stream量,每分钟20个请求(甚至在晚上)的恒定速率。 每个需要约2.500μs来完成。
    3. 微小stream量,每分钟10个请求(甚至在晚上)的恒定速率。 每个都高于4.000微秒。

    在晚上,每分钟50个请求相应的20 + 20 + 10。 所以,50%百分点的结果现在强烈依赖于stream2的结果.95%的百分点依赖于stream3,所以它甚至不能显示在图上。

    白天,2 + 3stream很好地隐藏在百分之95以上。

    我看的越多,我越倾向于认为数据收集存在问题。

    首先,你的TPS有一些奇怪的事情发生。 虽然整体形态看起来很正常,但是在晚上9点左右发生了非常剧烈的突破,然后又在早上7点左右。 在过渡到非高峰时段,正常的图表会更平滑。

    这表明configuration文件有变化,您可能有两种不同types的客户端:

    1. 一个只在上午7点(ish)和晚上9点(ish)之间运行,大量运行
    2. 另一个可能在24小时运行,而且运行量较小。

    第二个提示是在18:00左右。 大部分时间前后,我们都有音量 – 高TPS和低延迟。 但在18:00左右,800-1000RPM会突然降到400RPM以下。 可能是什么原因造成的?

    第三个提示是第5个百分点响应时间的降低。 我更喜欢看最小响应时间(但是第5百分位可能更好),原因有两个:它告诉我服务时间 (即响应时间减去排队),响应时间倾向于遵循威布尔分布,这意味着模式(或最常见的值)刚好在最小值以上。

    所以第五百分位的降位对我说,这个系列中有一个突然的中断,即使方差和平均响应时间大大增加,服务时间也实际上下降了。

    下一步

    在这个阶段,我会深入研究原木,以发现18:00低容量样品与之前和之后的高容量样品相比有什么不同。

    我会寻找:

    • 地理位置的差异(如果延迟影响了$ request_time)
    • url的差异(应该是没有的)
    • HTTP方法(POST / GET)的区别(应该是none)
    • 来自同一个IP的重复请求
    • 和其他的区别

    顺便说一句,18:00的“事件”对我来说是充分的证据,这与数据中心拥塞/活动无关。 为了确实如此,拥堵将不得不导致TPS下降,这可能在18:00,但是在9点到7点之间极可能导致TPS持续平稳地下降10个小时。