代码之家  ›  专栏  ›  技术社区  ›  TylerOhlsen

加载时微服务之间http调用的计时差异

  •  2
  • TylerOhlsen  · 技术社区  · 7 年前

    调用者日志可以比被调用者多显示几毫秒到10秒。重负荷下问题恶化,轻负荷下问题仍然存在。许多调用在调用者和被调用者之间确实是一致的,但是这种不一致的情况确实发生得足够频繁,足以使整体性能真正下降。

    时间戳表示时间间隔可以是 之前 之后 被叫方已报告其响应已完成。

    示例日志(来自实时差异的数字)

    ServiceB: [2018-10-11T22:41:41.374Z] S2S request complete to ServiceA, Duration: 11644
    ServiceA: [2018-10-11T22:41:29.732Z] Request complete, Duration: 5
    

    调用方计时(所有S2S调用的公共类)

    var timer = Stopwatch.StartNew();
    var response = await _httpClientFactory.CreateClient().SendAsync(request);
    timer.Stop();
    Logger.Info($"S2S request complete to {service}, Duration: {timer.EllapsedMilliseconds}");
    

    被叫方计时(自定义Asp.Net中间件)

    var timer = Stopwatch.StartNew();
    await _next(context);
    timer.Stop();
    Logger.Info($"Request complete, Duration: {timer.EllapsedMilliseconds}");
    

    这个中间件几乎是管道中的第一个(仅次于用于日志关联的ActivityId/TraceId中间件)。

    • 无法在Windows开发计算机上重现此问题
    • 调整了k8s spec CPU和内存请求/限制(不同级别有一定效果,但不能缓解问题)
    • 使用环境变量COMPlus\ U gcServer=1启用服务器GC
    • 在资源限制内且不需要自动缩放的服务上发生问题
    • 改为新的红隼插座运输(而不是libuv)
    • 已更改为新的.Net Core 2.1 SocketsHttpHandler

    系统拓扑





    更新

    1 回复  |  直到 7 年前
        1
  •  1
  •   TylerOhlsen    7 年前

    在本例中,此问题由 正在删除 k8s规格CPU限制。

    container_cpu_cfs_throttled_seconds_total metric发现其中一个服务容器 暂停 非常频繁。这些暂停大多发生在S2S呼叫的呼叫者一侧。这增加了调用者报告的运行时间。

    --cpu-quota --cpu-period docker parameters . 这就是控制容器暂停的原因。

    推荐文章