<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Troubleshooting on
Gnosnay 和他的硅基搭子</title><link>https://blog.ignosnay.com/zh/tags/troubleshooting/</link><description>Recent
content in Troubleshooting on Gnosnay 和他的硅基搭子</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Thu, 05 Feb 2026 14:01:12 +0800</lastBuildDate><atom:link href="https://blog.ignosnay.com/zh/tags/troubleshooting/index.xml" rel="self" type="application/rss+xml"/><item><title>Python 下 Threads Leak 问题排查</title><link>https://blog.ignosnay.com/zh/post/troubleshootings/2026-02-05-threads-leak/</link><pubDate>Thu, 05 Feb 2026 14:01:12 +0800</pubDate><guid>https://blog.ignosnay.com/zh/post/troubleshootings/2026-02-05-threads-leak/</guid><description>&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;py-spy&lt;/code&gt; &amp;amp; &lt;code&gt;grep&lt;/code&gt; &amp;amp; &lt;code&gt;log&lt;/code&gt; 立功. &lt;code&gt;py-spy&lt;/code&gt; 确认 leak 点, &lt;code&gt;grep&lt;/code&gt; &amp;amp; &lt;code&gt;log&lt;/code&gt; 确认 leak 链路&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近在做一个安全加固, 引入了 second party lib 之后, 某日告警说 CPU 使用率异常 + fd 泄露.&lt;/p&gt;
&lt;p&gt;这个 second party lib 是用来代理 HTTP 请求的, 通过这个 proxy 我们可以确保请求是可信的.&lt;/p&gt;
&lt;h2 id="排查过程"&gt;排查过程&lt;/h2&gt;
&lt;h3 id="1-使用-py-spy-确认-leak-点"&gt;1. 使用 &lt;code&gt;py-spy&lt;/code&gt; 确认 leak 点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;py-spy&lt;/code&gt; 除了可以用来做 Python 的性能分析, 还可以用来做线程 dump. 我们使用 &lt;code&gt;py-spy&lt;/code&gt; 来确认 leak 点.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;py-spy dump &amp;lt;pid&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过这个命令, 你可以看到当前进程的线程栈. 如果某个进程有大量的雷同的线程栈, 那么这个进程就有可能存在 leak. leak point 就是重复出现的线程。&lt;/p&gt;
&lt;h3 id="2-使用-grep-和-log-确认-leak-链路"&gt;2. 使用 &lt;code&gt;grep&lt;/code&gt; 和 &lt;code&gt;log&lt;/code&gt; 确认 leak 链路&lt;/h3&gt;
&lt;p&gt;Python 的 lsp 在分析一些 duck type 或者 protocol 的调用的时候, 并不会直接跳转到具体实现. 这个时候就只能靠字符串匹配来确认 leak 链路.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过 &lt;code&gt;grep&lt;/code&gt; 递归查找类库内的 trigger point&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;log&lt;/code&gt; 的内容, 验证 call chain 的猜想是否正确, 比如在猜想链路上是否有符合猜想的日志打出等等&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里有一些技巧:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一般来说我们的应用会有一个 baseline version, 这个 version 是正常运行的版本, 而做了某个变更之后才会出现 leak. 所以关注变更的代码, 二分查找 trigger point 会有助于我们明确调用链&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep&lt;/code&gt; 挺有用的, 直接递归查找比想象中快而且准&lt;/li&gt;
&lt;li&gt;可以从泄露点 和 trigger point 两端分别向对方靠拢, 找到共同的调用链&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="其他"&gt;其他&lt;/h2&gt;
&lt;p&gt;这篇只是一个引子, 后面我会更深入地分析 py-spy 的工作机制&lt;/p&gt;</description></item></channel></rss>