NAS里的固态硬盘怎么测速才准?我从230MB/s掉到80MB/s那晚,才搞懂测的是缓存还是盘

事情起因是我那块480G的SATA固态。它以前在我那台N100飞牛上当缓存盘,后来照着缓存值不值那篇的结论拆下来,改成了专门喂qBittorrent的下载盘。上个月我想给它做个年检,顺手验一下速度,插回电脑用DiskSpeedTest一跑,读530MB/s写470MB/s,挺漂亮。可我明明记得BT下到第三四个小时以后,速度就从两百多掉到八十出头,然后趴那儿不动了。
同一个盘,两个数字差六倍,到底哪个是真的?那天晚上我把这事的原理翻了个底朝天,发现根本不是盘变坏了,而是两次测的东西压根不是一回事。这坑我觉得每个往NAS里塞固态的人都迟早撞上,写下来。
先说结论:你测的八成不是盘,是缓存
固态硬盘速度测试里最大的坑,不是软件不准,是「缓存层」这个东西在你和盘中间站着。而且它不止一层——盘里有一层SLC缓存,系统内存里还有一层页缓存,两层都会把你的测速结果打扮得漂漂亮亮。
先说盘里那层。现在大部分SATA固态都是TLC颗粒,但对外宣称跑得快,靠的是把一部分容量当成SLC模式用。数据先灌进这块高速区,写入速度四五百MB/s看着很爽;高速区满了,主控就得把它搬到真正的TLC区慢慢消化,这个动作叫折叠。折叠发生时你继续写,速度直接掉到七八十MB/s,这才是这块盘的「素颜速度」。480G的盘,SLC缓存一般能给到五六十G,所以Windows里拷个十几G的电影你永远看不到掉速,缓存够兜住。BT下载一跑一晚上写一百多G,天亮后那八十出头,才是盘的真实水平。
再说内存那层,这层坑更深,因为它是系统白送的。Linux会把空闲内存拿去当文件缓存,你读过的文件会留在内存里,下次再读,直接从内存吐给你,盘根本没参与。在NAS上测速,测的文件要是之前碰过,数字能虚高到离谱。
三条命令,各测一样东西
搞懂缓存之后,测速工具就好挑了。我在飞牛上常驻三条命令,各管一件事,对着看才不会被骗。
第一条,hdparm,测纯读:
hdparm -Tt /dev/sdb
它会吐两个数,-T那个是缓冲区读,实际测的是内存速度,三四千MB/s,看个热闹;-t那个才是设备读速度,SATA固态正常在450到520之间。这条命令快,两秒出结果,适合每次重启后快速摸一下盘还在不在状态。
第二条,dd写测试,这是拆穿缓存的关键:
dd if=/dev/zero of=/vol1/tmp/speedtest bs=1M count=20000 oflag=direct
重点是oflag=direct,绕开内存页缓存直写盘。写20G,SATA固态前十几G快、后面掉下来,掉下来的那截才是真写速。这里有个坑我第一次就踩了:测试文件千万别放系统正在用的分区,我图省事写到了根目录,飞牛的系统分区一下吃紧,弹了个告警。后来老老实实建了个临时共享目录专门干这事。还有一点,测完记得删文件,20G的零文件扔在下载盘上,白白吃配额。
第三条不是测速,是fio,看小文件性能:
fio --name=randrw --rw=randrw --bs=4k --size=2G --numjobs=1 --runtime=60 --directory=/vol1/tmp
机械盘4K随机读写撑死一两MB/s,固态随便几百,差距几百倍。这条平时用不太上,但你要是把Docker容器、数据库搁在固态上,容器把内存吃爆那篇里的Immich加postgres组合,压垮它们的就是小IO不是大文件,那时候这个数字才有意义。纯放电影照片的盘,不用纠结这个。
我的下载盘为什么一晚上从230掉到80
命令会用了,回头说我那块盘。用dd绕开缓存一测,写满缓存之后稳定在82MB/s左右,跟BT下半夜的速度对上了,事情清楚了:盘没坏,Windows里那470是SLC缓存的功劳,缓存放不下通宵的量,露馅了。
那这盘还能不能用?能,下载盘这个活它其实干得不错。BT下载的速度上限一般就几十兆,掉速后的82MB/s绰绰有余;下载盘的致命伤从来不是速度,是写入量。一晚上200G的量,一年下来70多个T,机械盘这么磨也心疼,固态反而扛得住——这点写入量对一块标称300到600TBW的盘来说,五年都用不完额度,账在写入量那篇里算过细的,真该担心的从来不是下载党。
但有件事比速度重要得多,是下载盘上固态特有的一笔账:删了的东西,盘不知道。机械盘删文件就是覆盖,固态不行,主控需要靠TRIM这个指令才知道哪些块作废了可以回收。系统不发包TRIM,主控就拿着一堆垃圾块当有效数据搬来搬去,越用越慢,写入放大越来越难看。我头半年没管这事,有阵子下载盘响应明显发木,一查才发现这层的账没结。
下载盘的TRIM,飞牛上怎么落地的
好消息是这块基本不用你操心,只差一步确认。飞牛这类Debian底子的系统都带systemd的fstrim.timer,默认每周挂载点跑一次fstrim -av,把所有支持TRIM的挂载文件系统统一通知一遍。SSH上去敲:
systemctl status fstrim.timer
看到active (waiting)就齐活了,下一行还能看到上次跑的时间。我那次发木就是查这里,发现这盘当年是我手动挂的,挂载参数里没开discard(也不建议开持续TRIM,每次删除都发包,量大了干扰前台写入,每周批量跑一次的定时器方案更稳),而fstrim定时器只照顾 fstab里登记过的挂载点,我这块手动盘漏网了。把它正经写进存储管理的挂载配置之后,第二周速度就回来了。
验证TRIM有没有生效,有个笨但管用的办法:删一大坨文件之后,等定时器跑完,再测一次写速。垃圾块被回收了,写入掉速前的「高速段」会明显变长。要是嫌等一周,SSH手动补一发fstrim -v /vol1/downloads,-v会把这次回收的量打出来,几十G的数字看着很解压。
顺带交个底:有些坑不是配置问题,是硬件根本不配合。固态插在USB硬盘盒或者部分SATA扩展卡上,TRIM指令传不过去,fstrim会直接报「the disk does not support discard」。我在出二手擦盘那篇擦第二块固态时就撞过USB桥接芯片不透传的坑,擦了个寂寞。NAS里吃TRIM的盘,要么主板SATA口直连,要么NAS厂商的盘位,这钱省不得。
测速之外,固态年检我还看三样
测速这事说白了是「表演层数据」,年检真正该盯的是底子。速度掉了顶多慢,下面三样出问题才是要花钱的。
| 年检项目 | 看什么数字 | 哪里看 |
| 剩余寿命 | 百分比剩余(TBW余量),低于20%开始备货 | smartctl的Media Wearout或百分比寿命项 |
| 写入放大推断 | 主机写入量对盘的实际写入量,差得离谱说明TRIM没在干活 | SMART里两列计数相除 |
| 掉盘和坏块 | 闪存坏块增长、偶发掉线记录 | SMART原始值,掉线看系统日志 |
这些数怎么读、RAW值哪些该慌哪些不该,SMART判读那篇有逐项的人话版,固态和机械的判定口径不一样,别拿机械盘那套吓自己。位置记不住的话,飞牛在存储管理的硬盘详情页把关键几项都摆好了,点开看就行。
收个尾:别被漂亮的测速图骗着买错盘
我把这套捋顺之后给自己定的规矩很简单:往NAS里挑固态,标称速度看个乐,先想清楚它干嘛用。做缓存盘,看4K随机和TBW,反正我家那块折腾仨月还是拆了;做下载盘,TBW和TRIM通畅比速度重要十倍;放系统和Docker,容量和稳定性优先,掉盘一次比慢十次伤得多。测速工具留着dd和hdparm两条就够用,下次谁再发我一个四百多MB/s的截图,我会先问一句:写了多大文件?
那块480G的盘现在还在下载位上服役,年检数字一切正常,fstrim定时器每周三凌晨两点准时打卡。速度那事想通之后反而不焦虑了——缓存给的是面子,82MB/s才是里子,下载这活,里子够用就行。

发表评论