java - spring 有时会在控制器方法执行之前和之后做一些缓慢的过程吗?
问题描述
我有一个在 k8s 环境中运行的 spring boot 应用程序。
当我进行一些测试以查看我们的应用程序如何处理多个请求时,我注意到应用程序在控制器方法执行之前和之后都会浪费一些时间。该应用程序有一些过滤器在控制器方法执行之前和之后执行,但它们并没有做任何繁重的事情,只是从请求中读取一些信息并删除一些缓存的字符串。
我有跟踪设置,因此我可以跟踪应用程序某些部分的执行,主要是外部调用,但出于测试目的,我在其他部分添加了跟踪。跟踪根跨度在位于过滤器链顶部的过滤器中开始。
您可以在下面的痕迹图像中看到奇怪的行为。红色标记了代表控制器方法的跨度,黑色标记了代表位于过滤器链末尾的最后两个过滤器的跨度的跨度。
在这张图片中,我们可以看到,在过滤器链中倒数第二个的 taas_tenant_support_check fitler 完成执行后,控制器方法在 50 毫秒后开始执行。
在这张图片中,我们可以看到 taas_remove_bo_user_context 过滤器,它是过滤器链中的最后一个过滤器,在控制器方法完成执行后大约 80 毫秒后执行。
这种行为仅在应用程序在 k8s 环境中运行时被捕获,在我的本地机器上以相同的负载(目前只有 50 个并行请求)这永远不会发生。
运行我们的应用程序的 Pod 最多使用 1 个 CPU 和 2GB 内存。
我还在具有类似资源限制的 docker 容器内的本地计算机上运行了一个应用程序,但没有记录奇怪的行为。
跟踪跨度分批导出,并且导出器在主应用程序的单独线程中运行,我不认为这会减慢我们的速度。
使用调试器,我浏览了 spring 的源代码,以查看执行控制器方法之前和之后发生的情况,但我没有发现任何可能导致这种行为的东西。
有谁知道这里可能发生了什么?
解决方案
推荐阅读
- angular - Angular(7)加载错误的惰性模块
- neo4j - 用于存储嵌套评论的图形数据库
- greatest-n-per-group - ClickHouse 中按组排列的前 N 行
- vue.js - 如何使用 Vue.JS 和这种布局实现子域路由(图片)
- raspberry-pi3 - 覆盆子 pi3 上的 NixOS 无头设置
- npm - 未找到 es6 导出默认值,但可在 node_modules 内部工作
- python - 使用 PyQt5 getOpenFileName 打开文件时遇到问题
- azure - Azure 函数插入但不更新 cosmosDB
- c++ - 如何使用 Mako SDK 在文档页面的给定区域内平铺图像?
- r - 我需要在 R 中创建一个函数,该函数将矩阵作为输入并返回一个列表