<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Proxmox on Leon Li · 李梁</title><link>https://notes.liliang.me/tags/proxmox/</link><description>Recent content in Proxmox on Leon Li · 李梁</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 04 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://notes.liliang.me/tags/proxmox/index.xml" rel="self" type="application/rss+xml"/><item><title>每两分钟卡 7 秒，原来怪宿主机</title><link>https://notes.liliang.me/posts/2026-10-04-qwen38-flash-next-7s-stall/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate><guid>https://notes.liliang.me/posts/2026-10-04-qwen38-flash-next-7s-stall/</guid><description>&lt;p&gt;用 4 张 V100 跑 &lt;a href="https://huggingface.co/Qwen/Qwen3.8-Flash-Next"&gt;Qwen3.8-Flash-Next&lt;/a&gt; 有一阵了，一直有个怪毛病：服务时不时整个停住几秒，所有请求一起不动，然后又自己恢复。查了一整天，最后发现问题根本不在推理服务里，改一行配置就好了。&lt;/p&gt;&#10;&lt;h2 id="现象"&gt;现象&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;停顿大约每两分钟一次，每次约 7 秒。内存 KV 缓存从 64GB 改成 32GB 以后，缩短到约 3.5 秒。&lt;/li&gt;&#10;&lt;li&gt;只在处理新提示词（prefill）时出现，单纯生成文字时基本碰不到。&lt;/li&gt;&#10;&lt;li&gt;刚启动时没有，等内存缓存写满以后才开始。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="先排除的"&gt;先排除的&lt;/h2&gt;&#10;&lt;p&gt;一开始以为是推理引擎自己的问题，先后怀疑过 Python 垃圾回收、显存分配器、内存回收、PCIe 带宽。一个个打点测下来，都不是。&lt;/p&gt;&#10;&lt;p&gt;真正有用的线索有三条：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;停顿那几秒，GPU 是闲着的，4 张卡轮流空闲，每张约 0.8 秒。&lt;/li&gt;&#10;&lt;li&gt;停顿间隔非常准，每次相隔 130.5 秒。&lt;/li&gt;&#10;&lt;li&gt;卡住的那个进程，主线程停在一个很小的 &lt;code&gt;mmap&lt;/code&gt; 或 &lt;code&gt;munmap&lt;/code&gt; 系统调用上，一停就是 0.8 秒。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;申请或释放几 KB 内存却要等 0.8 秒，只能是在等锁。于是到宿主机上抓现场，看是谁在占着这个进程的内存映射锁。&lt;/p&gt;&#10;&lt;h2 id="元凶"&gt;元凶&lt;/h2&gt;&#10;&lt;p&gt;答案是宿主机上 Proxmox 自带的 &lt;code&gt;ksmtuned&lt;/code&gt;。它负责调节 KSM（内存页合并），每一轮都会执行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps -C kvm -o pss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本意只是统计 kvm 虚拟机进程占了多少内存。但 &lt;code&gt;ps&lt;/code&gt; 为了算 PSS，会去读&lt;strong&gt;所有&lt;/strong&gt;进程的 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/smaps_rollup&lt;/code&gt;，过滤是读完之后才做的。读这个文件时，内核要锁住目标进程的内存映射，并把它的页表从头遍历一遍。&lt;/p&gt;&#10;&lt;p&gt;我的推理进程每个占 50 多 GB 内存，页表有 110MB，遍历一次要 0.8 秒。这期间，进程里任何申请或释放内存的操作都得等着。4 个推理进程被逐个扫一遍，GPU 就轮流空转，其余的卡在通信里等它，加起来就是好几秒。&lt;/p&gt;</description></item></channel></rss>