<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>F2FS on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/f2fs/</link>
        <description>Recent content in F2FS on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 08 May 2026 22:34:39 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/f2fs/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>F2FS 导致 HC620 叠瓦盘卡死？Linux SMR 硬盘排障指南</title>
        <link>https://www.knightli.com/2026/05/08/hc620-smr-f2fs-io-wait-freeze/</link>
        <pubDate>Fri, 08 May 2026 22:34:39 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/05/08/hc620-smr-f2fs-io-wait-freeze/</guid>
        <description>&lt;p&gt;HC620 这类氦气封装叠瓦盘配合 F2FS 使用时，如果出现系统卡住、应用无响应、&lt;code&gt;iowait&lt;/code&gt; 长时间飙高，通常不是单一参数没调好，而是设备特性和文件系统策略撞在了一起。&lt;/p&gt;
&lt;p&gt;Western Digital Ultrastar DC HC620 属于 Host-managed SMR。它更适合顺序写、分区化写入和明确知道底层约束的软件栈。F2FS 则是为闪存设计的日志结构文件系统，虽然能把很多随机写组织成顺序写，但在空间紧张、垃圾回收频繁或元数据更新密集时，仍然可能把机械叠瓦盘拖进很长的内部整理周期。&lt;/p&gt;
&lt;h2 id=&#34;先确认是不是这类问题&#34;&gt;先确认是不是这类问题
&lt;/h2&gt;&lt;p&gt;建议先看三个现象：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iostat -x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iotop -oPa
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dmesg -T &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -Ei &lt;span class=&#34;s2&#34;&gt;&amp;#34;f2fs|blk|zoned|reset|timeout|I/O error&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果能看到磁盘 &lt;code&gt;%util&lt;/code&gt; 长时间接近 100%，&lt;code&gt;await&lt;/code&gt; 很高，系统里大量进程卡在 &lt;code&gt;D&lt;/code&gt; 状态，基本可以判断瓶颈在块设备 I/O。&lt;/p&gt;
&lt;p&gt;再确认硬盘是否以 zoned 设备暴露：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsblk -o NAME,MODEL,SIZE,ROTA,ZONED,SCHED,MOUNTPOINTS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /sys/block/sdX/queue/zoned
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果是 Host-managed SMR，普通文件系统和普通随机写负载都可能表现很差。它不像常见的桌面 SMR 盘那样完全由硬盘固件隐藏复杂度，而是更依赖主机端软件理解写入规则。&lt;/p&gt;
&lt;h2 id=&#34;为什么-f2fs-容易把卡顿放大&#34;&gt;为什么 F2FS 容易把卡顿放大
&lt;/h2&gt;&lt;p&gt;SMR 的问题在于写入不是任意覆盖那么简单。叠瓦磁道为了提高容量，会让相邻磁道部分重叠；当写入模式偏随机、覆盖频繁或缓存耗尽时，硬盘需要做额外的数据搬运和整理。&lt;/p&gt;
&lt;p&gt;F2FS 的问题在于它本来面向 NAND 闪存。它采用日志结构写入，并通过 segment cleaning 和 garbage collection 回收空间。这个设计在 SSD 上通常很自然，因为 SSD 没有机械寻道；但在机械硬盘上，尤其是 SMR 盘上，GC 产生的读写搬运可能变成明显的长尾延迟。&lt;/p&gt;
&lt;p&gt;当 F2FS 后台 GC、前台写入、checkpoint、元数据更新和硬盘自身的 SMR 整理叠在一起时，I/O 队列会被持续占满。表现到用户层，就是复制文件、删除目录、跑下载、解压缩或数据库写入时系统像“冻住”一样。&lt;/p&gt;
&lt;h2 id=&#34;挂载参数先这样保守调整&#34;&gt;挂载参数先这样保守调整
&lt;/h2&gt;&lt;p&gt;如果暂时不能迁移文件系统，可以先从 &lt;code&gt;/etc/fstab&lt;/code&gt; 的挂载参数下手：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UUID=xxxx  /data  f2fs  defaults,nodiscard,active_logs=2,gc_merge,flush_merge,lazytime  0  0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;几个参数的含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nodiscard&lt;/code&gt;：关闭实时 discard。机械硬盘通常不需要像 SSD 那样频繁发送 TRIM/discard，保守关闭更稳。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;active_logs=2&lt;/code&gt;：F2FS 支持 2、4、6 个 active logs，默认通常是 6。降到 2 可以减少日志并发带来的寻道压力。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gc_merge&lt;/code&gt;：让后台 GC 线程处理部分前台 GC 请求，降低前台进程直接触发慢 GC 时的卡顿。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flush_merge&lt;/code&gt;：合并 cache flush 请求，底层设备处理 flush 很慢时可能有帮助。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lazytime&lt;/code&gt;：减少部分访问时间更新带来的元数据写入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;checkpoint=disable&lt;/code&gt; 不建议作为常规方案。它确实可能减少 checkpoint 压力，但异常断电或崩溃后的风险更高，而且内核文档也提醒，禁用 checkpoint 后文件系统仍需要 GC 来确保可用空间。除非你非常清楚代价，否则不要把它当成“性能开关”长期使用。&lt;/p&gt;
&lt;h2 id=&#34;调整-io-调度器&#34;&gt;调整 I/O 调度器
&lt;/h2&gt;&lt;p&gt;机械盘和 SMR 盘通常更需要请求合并与延迟控制。可以先查看当前调度器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /sys/block/sdX/queue/scheduler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可尝试切换到 &lt;code&gt;mq-deadline&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; mq-deadline &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /sys/block/sdX/queue/scheduler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果系统用于桌面交互，也可以测试 &lt;code&gt;bfq&lt;/code&gt;。不要只看顺序吞吐，重点观察卡顿是否减少、&lt;code&gt;await&lt;/code&gt; 是否下降、交互是否更稳定。&lt;/p&gt;
&lt;h2 id=&#34;限制-f2fs-后台-gc&#34;&gt;限制 F2FS 后台 GC
&lt;/h2&gt;&lt;p&gt;F2FS 的 sysfs 路径以实际设备名为准，先确认：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /sys/fs/f2fs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后针对对应挂载设备调整 GC 间隔，例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;60000&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /sys/fs/f2fs/sdX/gc_min_sleep_time
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;120000&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /sys/fs/f2fs/sdX/gc_max_sleep_time
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;sdX&lt;/code&gt; 只是示例，实际可能是 &lt;code&gt;sda1&lt;/code&gt;、&lt;code&gt;dm-0&lt;/code&gt; 或其他名称。调大 GC sleep time 的作用是降低后台 GC 抢占 I/O 的频率，但代价是空间回收更慢。磁盘空间越接近满盘，越容易再次触发前台 GC，所以还要留出足够空闲空间。&lt;/p&gt;
&lt;h2 id=&#34;更推荐的长期方案&#34;&gt;更推荐的长期方案
&lt;/h2&gt;&lt;p&gt;如果这块盘存重要数据，最稳妥的方案是备份后换文件系统，或者换更适合的盘。&lt;/p&gt;
&lt;p&gt;对大容量机械硬盘，优先考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XFS：适合大文件、备份盘、媒体库、归档和顺序写负载。&lt;/li&gt;
&lt;li&gt;EXT4：兼容性强，行为稳定，排障资料多。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果是 Host-managed SMR，还要确认你的内核、控制器、文件系统和应用是否真正支持 zoned block device 的使用方式。否则，把它当成普通随机写硬盘用，很容易遇到不可预测的长时间卡顿。&lt;/p&gt;
&lt;h2 id=&#34;实用建议&#34;&gt;实用建议
&lt;/h2&gt;&lt;p&gt;这类盘更适合冷数据、归档、备份、媒体文件和顺序写入，不适合下载缓存、容器镜像、虚拟机磁盘、数据库、频繁解压缩目录或小文件随机写。&lt;/p&gt;
&lt;p&gt;如果必须继续用 F2FS，建议至少做到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关闭实时 discard。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;active_logs=2&lt;/code&gt;，减少并发日志。&lt;/li&gt;
&lt;li&gt;开启 &lt;code&gt;gc_merge&lt;/code&gt; 和 &lt;code&gt;flush_merge&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;保持较高空闲空间，不要接近满盘。&lt;/li&gt;
&lt;li&gt;避免把下载目录、数据库、虚拟机镜像放在这块盘上。&lt;/li&gt;
&lt;li&gt;定期观察 &lt;code&gt;iostat -x 1&lt;/code&gt;，不要只看平均速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结一下：HC620 + F2FS 卡死，本质上是 SMR 写入约束、F2FS GC 和机械盘长尾延迟叠加后的结果。临时方案是调挂载参数、调调度器、限制后台 GC；长期方案是迁移到 BTRFS/XFS，或者把这类 SMR 盘放回更适合它的顺序写归档场景。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.kernel.org/filesystems/f2fs.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Linux Kernel Documentation：F2FS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://documents.westerndigital.com/content/dam/doc-library/en_us/assets/public/western-digital/product/data-center-drives/ultrastar-dc-hc600-series/data-sheet-ultrastar-dc-hc620.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Western Digital Ultrastar DC HC620 Data Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
