k8s pod中的Tomcat和云中的db-慢速连接



我在本地k8s(种类(集群中部署了tomcat、zookeeper和kafka。数据库是远程的,即在云中。页面加载非常慢。

但是,当我将tomcat移到pod之外,并在本地k8s集群中手动启动zk和kafka,在远程云中手动启动db时,页面加载良好。

为什么Tomcat在Kubernetes pod中运行速度很慢?

理论上,在容器中运行的程序可以像在主机上运行的程序一样快。

在实践中,有许多因素会影响性能。

  • 当在Windows或macOS上运行时(例如使用Docker Desktop(,容器不会直接在机器上运行,而是在小型Linux虚拟机中运行。这个虚拟机会增加一些开销,而且它可能没有主机环境那么多的CPU和RAM。查看容器的资源使用情况的一种方法是使用docker stats;或docker run -ti --pid host alpine,然后使用经典的UNIX工具,如freetopvmstat。。。以查看VM中的资源使用情况。

  • 在大多数环境中(至少在Docker和Kubernetes集群最常见的默认配置中(,容器在没有资源约束和限制的情况下运行。然而,在Kubernetes上运行容器时,设置资源请求和限制是很常见的(事实上,强烈建议这样做!(。您可以使用kubectl describe检查pod的资源限制。如果安装了metrics服务器(这是推荐的,即使在dev/stating环境中也是如此(,您可以使用kubectl top检查资源使用情况。像k9s这样的工具将以全面的方式向您显示资源请求、限制和使用情况(只要数据可用;例如,您仍然需要安装度量服务器来获取pod度量(。

  • 除了上面描述的VM开销之外,如果容器进行大量I/O(无论是磁盘还是网络(,与本机进程相比,可能还会有一些开销。如果容器在写文件系统(而不是卷(上的容器副本上进行写操作,尤其是在使用设备映射程序存储驱动程序时,这种情况会变得明显。

  • 使用";实时重新加载";技术(在编辑源代码时自动重建或重新启动(特别容易出现这种I/O问题,因为不幸的是,没有有效的方法来跨虚拟机边界监视文件修改。这意味着,当源代码安装到Mac或Windows上的容器中时,许多web框架在容器中运行时会表现出极端的性能下降。

  • 除了这些因素之外,还可能存在其他细微的差异,这些差异可能会影响容器化应用程序的整体性能。在观察性能问题时,使用探查器(或某种APM解决方案(来查看代码的哪些部分需要更长的时间才能执行是非常有帮助的。如果没有可用的探查器或APM,请尝试独立执行代码的各个部分,以比较它们的性能。例如,有一小段代码执行对数据库的单个查询;或者执行来自作业队列等的单个任务。

祝你好运!

最新更新