关于排查问题的总结

1. 写在最前面

用了这么久的 Cursor ,还是会时不时的感慨科技使人类进步。尤其是最近的「Claude Sonnet 4」 好用的不得了,在丢给它一个需求之后,从设计方案、到 coding、以及编写 tase case 、修复验证逻辑、甚至还记的 lint 一下,无比贴心。但是随之而来的坏处就是,过分相信 Cursor 之后,不在去理解库是否符合业务场景。

注:尽信书,则不如无书。看来在提升 coding 效率的同时,也要更为慎重的思考每个使用 场景是否符合最初设计的预期。

2. 问题小计

2.1 aiohttp 库

前置说明,笔者并不是很熟悉 Python ,属于一边用,一边学习的状态。接的需求是,在使用 aiohttp 库的时候,能够复用 http client ,无需每次请求都重新建立连接,以达到最终减少请求和返回的耗时的目的。

笔者实现的方式:

python 复制代码
def _get_session(self) -> aiohttp.ClientSession:
        if self._session is not None and not self._session.closed:
            return self._session

        new_session = aiohttp.ClientSession(
            timeout=aiohttp.ClientTimeout(total=30),
            connector=aiohttp.TCPConnector(limit=100, enable_cleanup_closed=True),
            trace_configs=[self.trace_config],
        )

        self._session = new_session
        return self._session

注:这当然是 cursor 帮忙给的思路。但是笔者当时大意了,没有细细的深究 aiohttp.ClientTimeout 这字段的意思。

不推卸责任,问题当时是实现代码人的问题,记录在这里,方便下次在类似的改动前,能够在深入探究一步,减少后续返工以及故障的可能性。

先解释一下 aiohttp.ClientTimeout 字段的意思

ini 复制代码
timeout = aiohttp.ClientTimeout(
    total=None,           # 总超时时间
    connect=None,         # 连接超时时间
    sock_connect=None,    # Socket 连接超时时间
    sock_read=None        # Socket 读取超时时间
)

各参数详细说明

  • total (float | None)

    • 整个请求的总超时时间(秒),包括连接建立、发送请求、接收响应的全部时间,默认值:5 分钟 (300 秒),设置为 None 表示无限制
  • connect (float | None)

    • 建立连接的超时时间(秒),包括 DNS 解析、TCP 连接建立、SSL 握手等,默认值:无限制 (None)
  • sock_connect (float | None)

    • 底层 socket 连接的超时时间(秒),仅针对 TCP socket 连接建立阶段,默认值:无限制 (None)
  • sock_read (float | None)

    • Socket 读取数据的超时时间(秒),在连接建立后读取响应数据的超时,默认值:无限制 (None)

先解释了参数的含义之后,就可以推测到现象是,如果 response 持续返回的时间超过 30s ,就会主动断开连接。

注:除了 aiohttp.ClientTimeout,建议再用 aiohttp.TCPConnector 字段时也要先确认字段的生效规则后使用。

2.2 奇怪的问题

笔者本次提测改动的功能很少,但是 QA 测试的时候报了很多跟功能无关的 jira ,比如:

  • start 的时候返回超时报错
  • 启动的任务,自动退出查询不到了

注:这种跟改动无任何关系的问题,查起来真的有点子费人......

问题1:start 的时候返回超时报错

结论:最终查下来, start 超时是因为请求的机器,磁盘读写耗时极高,分析下来,可能是因为混用的测试环境,其他服务的测试写入了过多的音视频文件导致......

还好,公司的机器是有 cpu、memery、磁盘等 Zeus 监控的,不然都没办法自证业务的清白了。

注:不过这里虽然机器有问题的可能性比较高,但有一点,我还是没有想通的为什么磁盘耗时高会表现 start 超时呢?印象中业务的 start 行为中没有任何写入磁盘的行为。

cursor 一个比较符合的原因的回答是:

  • 依赖库加载:Python模块、动态库加载需要磁盘I/O
  • 超时连锁反应:磁盘I/O慢 → 启动步骤延迟 → 健康检查超时 → 服务被认为启动失败

问题2: 启动的任务,自动退出查询不到了

结论:是因为业务消耗的资源的内存变多了,之前 pod 设置的 memory 是 1G,导致 oom 了......

为了能够按时交付版本,本次的改动是先调整部署的 chart ,将 memory 从 1G 调整 2G

至此,那些奇怪的问题就排查完成了。还好,虽然排查的过程有点痛苦,但是还是从中学到了之前不知道的支持,比如dmesg -T 查看内核的输出信息。

3. 碎碎念

终于在十一前,挤出时间来整理了一下最近遇到有些奇怪的问题。希望这个十一能够玩的开心。

  • 到底是什么伟大前程,值得我们把每个四季都错过?(ps:读的时候,心理酸酸的
  • 人一旦有退路,无论是你愿意还是不愿意接受的退路,就不会用全力了。
相关推荐
XW17 分钟前
常用提示词(Prompt)框架总结
后端
ServBay24 分钟前
DeepSeek 再次崩了,DeepSeek V5正在路上?
后端·deepseek
IT规划师1 小时前
编程术语中的同步与异步:从"等不等"到工程取舍
后端·面试
孟陬2 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
GoGeekBaird2 小时前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
码事漫谈2 小时前
腾讯混元 Hy4 正式版发布了
后端
Mikko72 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
苍何4 小时前
DeepSeek的Super-agent 设计,和我们的工程实践
后端
Patrick_Wilson4 小时前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言
Patrick_Wilson4 小时前
执行 go build . 后,Go 怎样找到代码并生成程序
后端·go·编程语言