gpt4 book ai didi

docker - 在负载下微服务之间的 http 调用的时间差异

转载 作者:行者123 更新时间:2023-12-02 11:44:22 25 4
gpt4 key购买 nike

Docker/Kubernetes 上的 Asp.Net Core 微服务在调用者和被调用者之间的服务间调用的持续时间上存在分歧。

调用者日志可以比被调用者多显示几毫秒到整整 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 开发机器上重现该问题
  • 监控 CPU、内存、线程计数、GC 收集、打开句柄(均处于合理水平)
  • 调整了 k8s 规范 CPU 和内存请求/限制(各种级别有一些效果,但不能缓解问题)
  • 使用环境变量打开服务器 GC:COMPlus_gcServer=1
  • 问题发生在资源限制内且不需要自动缩放的服务上
  • 更改为新的 Kestrel 套接字传输(而不是 libuv)
  • 更改为新的 .Net Core 2.1 SocketsHttpHandler

  • 系统拓扑

    Asp.Net Core 2.1 自托管 Kestrel
    .Net Core 2.1.5 运行时
    docker/Kubernetes 1.10.5
    K8s 插件:kube-proxy、weave、etcd、SkyDNS
    AWS c5.4xlarge

    更新
  • 发现时间间隔有时可能在被调用者开始/完成之前或之后
  • 最佳答案

    在这种情况下,此问题已通过删除 k8s 规范 CPU 限制得到修复。

    监控container_cpu_cfs_throttled_seconds_total metric 发现其中一个服务容器非常频繁地暂停。这些暂停主要发生在 S2S 调用的调用方。这增加了调用者报告的耗时。

    删除 k8s 规范中的 CPU 限制可防止 k8s 通过 --cpu-quota--cpu-period docker parameters .这是控制容器暂停的原因。

    关于docker - 在负载下微服务之间的 http 调用的时间差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52789134/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com