Kubernetes CPU使用率和Docker容器指标冲突


9

我们最近将生产环境切换到Kubernetes。我想对容器实施CPU限制。我遇到了不一致的CPU指标冲突。这是我的设置:

  • DataDog代理以 Daemonset
  • 现有应用程序不受CPU限制地运行
  • 有问题的容器是多线程Ruby应用程序
  • 两个指标:kubernetes.cpu.usage.{avg,max}docker.cpu.usage
  • c4.xlarge 群集节点(以Kubernetes的术语来说是4个vCPU或4000m)

kubernetes.cpu.usage.max报告有问题的集装箱约600m。docker.cpu.usage报告约60%。因此,在正常操作下1000m CPU限制将绰绰有余。

我将限制设置为1000m。然后docker.container.throttles明显上升kubernetes.cpu.usage.maxdocker.cpu.usage保持不变。在此期间,系统全都屈服了。这对我来说没有意义。

我研究了Docker统计信息。似乎docker stats(和底层API)根据CPU内核规范了负载。因此,以我的情况来说,docker.cpu.usage以Kubernetes计,60%(4000m * 0.60)达到2400m。但是,这与任何Kubernetes编号都不相关。我做了另一个实验,以检验我的Kubernetes数不正确的假设。我将限制设置为2600m(以获得一些额外的净空)。这没有导致任何节流。但是Kubernetes观察到CPU使用率没有变化。这让我感到困惑。

所以我的问题是:

  • 这是否感觉像Kubernetes中的错误(或堆栈中的某物?)
  • 我的理解正确吗?

我的后续问题与如何正确确定Ruby应用程序的CPU有关。一个容器使用彪马。这是具有可配置线程数量的多线程Web服务器。HTTP请求由线程之一处理。第二个应用程序是使用线程服务器的节俭服务器。每个传入的TCP连接均由其自己的线程处理。连接关闭时线程退出。Ruby作为GIL(全局解释器锁),因此一次只能有一个线程执行Ruby代码。这确实允许多个线程执行IO之类的操作。

我认为最好的方法是限制每个应用程序中运行的线程数,并根据线程数近似计算Kubernetes CPU的限制。进程不是分叉的,因此很难预测CPU的总使用量。

这里的问题是:如何正确预测这些应用程序的CPU使用率和限制?


您是否尝试过在1cpu节点和2cpu节点上查看数字之间的相关性(或不相关)?
2015年

Answers:


4

这里有很多事情:

  1. 您使用的是AWS ec2,因此您在实例上进行的用于测量CPU的工作都是在虚拟机管理程序级别而不是实例级别上计算CPU。为此,请运行任何负载测试并检查iostat -ct 1和cloudwatch中的CPU使用率。cloudwatch中的CPU使用率始终比iostat所报告的要高10-20%,这是因为iostat可以在虚拟机管理程序级别上提供CPU使用率。

  2. 作为docker来了解kubernetes和docker指标的比较,我建议使用--cpuset = 1或任何数字运行容器,以允许所有容器仅使用单个vCPU。

  3. 同样在AWS 1 CPU = 2vcpu中。它是2的超线程。您可以在计算时考虑到这一点。

  4. 最后,用于查看特定应用程序的CPU使用率的最佳指标是使用htop并与您的cloudwatch指标相关联。

  5. 我还观察到有时docker守护进程会将其自身固定到一个虚拟CPU上,因此当您将其减少到1000m时,整个设置可能会变慢,因为在任一vpcus上都在进行减少。您可以使用mpstat来了解此细节。

  6. 最后,在主机级别,您可以将docker固定到单个CPU并观察更多。

希望这能使您更加接近。如果您已经找到解决方案,请给我更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.