我有两个Java应用程序,分别是X和Y。X向集群外的服务器发送流量,Y从集群外的客户端接收流量。X和Y都通过单独的自定义入口和出口网关发送和接收流量。X和Y都是在Java Sping Boot 中开发的。当单独运行多个副本时,两者都可以以3000 tps的速度非常有效地接受流量。所有pod的CPU使用率也在60%到70%之间,延迟可接受。但是,当它们是命名空间内的双向流量时,问题就开始了。也就是说,X的副本发送业务,而Y的副本同时接收业务。这两个服务的CPU使用率增加到85%以上。由于CPU的增加,延迟也增加。预计这两个服务将彼此独立。唯一常见的依赖项是部署在其他名称空间中的数据库服务器。但我们希望这不应该是一个问题,因为我们已经使用了缓存和调度程序查询数据库,每隔30秒就可以。但CPU利用率仍在增加。除了数据库之外,唯一常见的是kubernetes基础设施。我们在公共prometheus使用的两个服务上设置了度量和KPI,以便每隔10秒进行一次抓取。
我们尝试将调度器时间从30秒增加到非常高的值。但仍然没有观察到变化。已尝试增加调度程序线程,但仍没有发现任何改进。使用JFR对应用程序进行了分析,但仍然没有观察到任何有价值的见解。已尝试增加就绪性和活动性探测器获取间隔,但仍不成功。我们希望这两个服务应该是相互独立的。也就是说,每个服务的CPU不应该因为其他服务的使用而受到影响。我们正在寻求方法和建议,以指出问题的根源和纠正问题。任何有价值的见解都会有所帮助。
1条答案
按热度按时间jw5wzhpr1#
根据现有的信息,当X和Y服务同时运行时,可能有几个因素导致CPU增加。如果没有更具体的细节,很难确定确切的根本原因。考虑到这一点,这里有一些你可以考虑的潜在领域:
共享资源:如果服务共享任何Kubernetes资源,您可能需要检查,因为这也可能导致当两个服务都处于活动状态时CPU使用率增加。
网络开销:当服务一起运行时,Kubernetes集群内的网络流量可能会增加,这可能会导致更高的CPU负载。
普罗米修斯刮片:您提到Prometheus每10秒抓取一次指标,这取决于抓取和处理的数据量,可能导致利用率飙升
数据库加载:即使使用缓存,也可能存在某种不明显的争用或资源使用。分析数据库或监视其性能可能会揭示有用的信息,以减轻利用率。
负载测试和隔离是解决问题的一个很好的起点。此外,这里有一些指向Kubernetes文档和其他可能有用的资源的链接:[1][2][3][4]
[1][https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)
[2][https://kubernetes.io/docs/concepts/policy/resource-quotas/](https://kubernetes.io/docs/concepts/policy/resource-quotas/)的
[3][https://developers.redhat.com/blog/2017/03/14/java-inside-docker](https://developers.redhat.com/blog/2017/03/14/java-inside-docker)的
[4][https://prometheus.io/docs/practices/naming/](https://prometheus.io/docs/practices/naming/)的