关于排查问题的总结

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:读的时候,心理酸酸的
  • 人一旦有退路,无论是你愿意还是不愿意接受的退路,就不会用全力了。
相关推荐
码事漫谈2 小时前
揭秘RAG的核心引擎:Document、Embedding与Retriever详解
后端
码事漫谈3 小时前
BM25 检索是什么
后端
Moment3 小时前
写代码也能享受?这款显示器让调试变得轻松又高效!😎😎😎
前端·后端
无双_Joney4 小时前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(bug修复篇)
前端·后端·node.js
stark张宇5 小时前
从入门到放弃?一份让PHP学习持续正反馈的知识清单
后端·php
sunbin5 小时前
软件授权管理系统-整体业务流程图(优化版)
后端
一只专注做软件的湖南人5 小时前
京东商品评论接口(jingdong.ware.comment.get)技术解析:数据拉取与情感分析优化
前端·后端·api
TZOF5 小时前
TypeScript的新类型(二):unknown
前端·后端·typescript
xiaoye37085 小时前
Spring Boot 详细介绍
java·spring boot·后端