大规模文件存储IOPS验证全攻略:从fio配置到结果解读

大规模文件存储系统的上线和扩容,通常都会被同一个问题卡住:这套系统到底能扛多少并发IO?只看厂商给的宣传指标远远不够,实际业务负载下,IOPS往往是"纸面参数"和"实测数据"差距最大的环节。这篇文章我想围绕大规模文件存储系统的IOPS验证方法做一次系统的梳理,把从测试设计、环境搭建到fio命令配置、结果解读、问题排查的完整链路讲清楚。内容会偏向实际操作,适合正在做存储选型、存储交付验证或者日常性能巡检的工程师参考,新手也能照着步骤跑起来。

1. 先想清楚再动手:IOPS验证的整体思路

1.1 为什么要验证IOPS,而不是只盯着吞吐

我先说一个很多人容易走进的误区:评价文件存储性能,只知道看带宽。带宽(吞吐)解决的是"大批量数据搬运"的问题,比如备份、日志归档、视频素材传输这类顺序读写场景,带宽确实直观。但绝大多数业务系统,尤其是数据库、消息队列、虚拟化平台,发出的IO请求是又小又碎的,4KB、8KB、16KB级别的随机读写才是常态。这时候真正决定用户体验的指标不是每秒搬了多少GB,而是每秒能处理多少个IO请求,也就是IOPS。

举个好理解的例子:吞吐高意味着一条高速公路车流量很大,但IOPS高意味着一个城市的路口能高效处理频繁转弯的小车。存储系统面对大量随机小IO时,每次IO都要经历寻址、锁竞争、网络往返、元数据查询等一系列开销,IOPS反映的恰恰是这套机制的整体效率。所以在验证大规模文件存储时,IOPS不是"参考指标之一",而是"必测的核心指标"。

另外必须强调一点:IOPS不能孤立看。同样的IOPS数值,伴随的平均时延可能是2毫秒,也可能是20毫秒,这对业务的影响天差地别。所以完整的验证方案应当是IOPS、时延、吞吐三者的组合判断,后面我会按这个思路展开。

1.2 验证目标与场景定位:先回答三个问题

在敲任何一条测试命令之前,先问自己三个问题:这套存储最终要跑什么业务?业务负载特征是什么?验收标准是什么?这三个问题直接决定测试场景怎么设计。

不同业务场景下的IO特征差异非常大:

| 业务类型 | 典型IO模式 | 块大小 | 并发特征 | 关键指标 | | 数据库在线事务 | 随机读为主 | 8KB-16KB | 高并发、低时延敏感 | IOPS、平均时延、P99时延 | | 数据仓库分析 | 顺序扫描为主 | 1MB-4MB | 中等并发 | 吞吐、顺序IOPS | | 虚拟化虚拟机磁盘 | 混合随机读写 | 4KB-32KB | 高并发、时延波动敏感 | IOPS、时延抖动 | | 邮件/文件服务 | 随机小IO混合 | 4KB-64KB | 高并发 | IOPS、平均时延 |

测试场景至少要覆盖随机读、随机写、顺序读、顺序写四个方向,再按业务占比做混合读写测试。混合比例怎么定?不用拍脑袋,直接看生产环境的历史监控数据,比如某业务高峰期读写比例大概是7:3,那就按rwmixread=70去配。

2. 测试环境搭建与工具选型

2.1 环境隔离:做好这三层,结果才可信

IOPS测试最怕环境"脏",任何一环有干扰,测出来的数据都很难复现。我在实际项目中吃过亏,才总结出这三层隔离的要求。

第一层是客户端隔离。测试客户端最好独立部署,不要让测试流量和其他业务相互挤占CPU和网卡资源。文件存储测试客户端本身很吃CPU,因为要模拟大量并发IO请求。之前在一个项目里,测试机和业务机混跑,业务高峰一来,IOPS直接掉了30%多,排查了半天才发现是CPU争抢导致的。

第二层是网络隔离。大规模文件存储普遍跑万兆甚至更高的网络,测试前要把网络路径确认清楚:客户端到存储的交换链路有没有共享带宽?有没有防火墙或者安全设备串在链路上?我在某实验室验证时遇到过一次,存储端和客户端明明都在同机房,但IOPS始终上不去,最后发现核心交换机上启用了流控策略,对小包类IO流量影响极大,关掉之后数据立刻正常。

第三层是存储资源隔离。要验证的文件系统目录,理论上应该是独立存储池或独立目录配额,避免和存量数据产生元数据竞争。尤其注意分布式存储里的"热点目录"问题,其他业务如果正在往同一个目录大量写数据,测试结果就可能被明显拉低。

2.2 客户端数量与并发规模的估算逻辑

很多人在测试机器配置上纠结,其实关键不是单机配置多高,而是客户端整体能打出的压力要超出被测系统的上限。怎么判断压力够不够?有一个初步估算方法,我自己一直在用:

假设存储预期IOPS是20万,单台客户端能稳定打出2万IOPS,那至少需要10台客户端。这里的"单台客户端能打出的IOPS"怎么得到?先在本地临时目录上用fio预先跑一轮,测出这台机器的本地磁盘IOPS上限,再结合CPU核数判断网络协议栈的负载能力。经验值:一台8核客户端,单核约能支撑2000-3000 IOPS的小文件随机读写负载(前提是网络栈优化过),实际还得用预跑数据兜底。

客户端的连接数规划上,要注意文件存储协议(如NFS/SMB)的挂载会话数是否受限。一些存储网关对单客户端会话有限制,如果压力发散不充分,客户端多但IOPS提不上去,就要考虑增加挂载点或者拆多个子目录并发测试。

2.3 为什么选fio:工具对比与版本选择

IOPS测试工具里,最常用的就是fio,此外还有vdbench、ior、dd等,我用下来还是fio最顺手。fio的优点是参数极其精细,可以精确控制块大小、队列深度、并发数、读写比例、IO引擎,几乎覆盖所有模拟场景。vdbench在文件系统语义的模拟上更接近业务层,适合做复杂业务模型回放,但配置门槛高一些;简单IOPS基准测试用fio就够了。

版本选择上有一个很多人忽略的细节:fio 3.x和2.x的默认行为有些差异,尤其是针对libaio引擎的队列处理逻辑。我建议统一使用3.x较新版本,团队内多台测试机务必保持一致,避免因为版本差异导致数据不可比。安装直接在官方仓库拉编译好的二进制即可,也可以源码编译,configure、make、make install三步,编译时带上--enable-libaio选项,确保异步IO引擎可用。

操作系统的IO调度器也需要提前调整。SSD存储场景下,建议把调度器改为none或noop,避免多余的调度延迟。注意,不同发行版的修改方式不同,有的用sysfs直接改,有的要用grub参数,测试前用cat /sys/block/设备名/queue/scheduler确认一下。

3. 核心实操:fio基准测试配置详解

3.1 基础参数逐个拆解

fio的参数看着多,核心配置其实可以分成"IO模型"、"负载模型"、"运行控制"三组。我先把每个关键参数的作用和选择逻辑讲清楚。

IO模型部分,最关键的是ioengine。IO引擎决定IO请求怎么提交,常见有三档:sync(同步)、libaio(异步)、io_uring(新一代异步)。大规模文件存储验证我用得最多的是libaio,它支持真正的异步提交,能压出存储系统的高并发能力。direct=1必须开,表示绕过操作系统page cache,直接走磁盘层。很多人测出来IOPS虚高,十有八九是没开direct,数据被缓存兜住了,根本没打到存储上。

负载模型部分,rw参数定义读写模式,randread表示随机读,randwrite随机写,read顺序读,write顺序写,randrw混合随机读写。blocksize(通常简写bs)定义每次IO的数据块大小,这直接决定IOPS数值的量级。同一个存储,用4K块测随机读和用1M块测顺序读,结果完全是两个故事,所以必须和业务实际使用的块大小匹配。numjobs定义并发进程数,iodepth定义每个进程的队列深度,两者的共同作用就像是"同时发起请求的线程数"和"每个线程手里待处理的请求数"。

运行控制部分,runtime定义测试时长,测试时间太短数据不稳,我一般随机读写给300秒起步,顺序读写120秒足够。time_based必须设置。ramp_time是预热时间,正式采数之前先让存储引擎跑热,我习惯给60秒。

3.2 四大基础场景的标准模板

直接给出可以直接抄的配置模板。先说随机读场景,这是数据库在线事务最关注的负载:

fio -name=randread_test \ -ioengine=libaio \ -rw=randread \ -bs=4k \ -direct=1 \ -numjobs=16 \ -iodepth=32 \ -size=10G \ -runtime=300 \ -time_based \ -ramp_time=60 \ -group_reporting \ -directory=/mnt/storage_pool/test_dir

这里numjobs=16、iodepth=32意味着理论上会有512个并发IO请求在飞,这个并发规模对应中高负载的数据库场景。block size用4K,是因为主流的数据库默认页大小是8K,日志和索引文件常是4K-16K的小IO。size=10G是每个并发进程预创建的文件大小,16个进程就是160G测试文件,一定要确保存储目录剩余空间大于这个总量。

随机写场景类似,把rw改成randwrite即可,但写场景要注意运行时长的设置。写测试时间长会导致测试文件写满,后面写入会受存储空间回收机制影响。我习惯把size调大,或者用runtime限制时长,跑完直接清理目录。

顺序读写场景主要看带宽,块大小建议加大到1M:

fio -name=seqread_test \ -ioengine=libaio \ -rw=read \ -bs=1m \ -direct=1 \ -numjobs=8 \ -iodepth=16 \ -size=20G \ -runtime=120 \ -time_based \ -ramp_time=30 \ -group_reporting \ -directory=/mnt/storage_pool/test_dir

混合读写场景则要加上rwmixread参数:fio -name=mix_test -rw=randrw -rwmixread=70 -bs=16k -numjobs=12 -iodepth=32,表示随机混合读写中读占70%,写占30%,贴近典型的虚拟化IO模型。

3.3 多客户端协同压测的落地姿势

单台fio压到上限后,就需要多客户端协同。这里有两个实操层面的方案可以选。

方案一是每一台客户端各跑各的fio实例,手动记录每台的结果再求和。这个方法操作简单,适合客户端数量在5-10台的场景。TCP窗口这种参数每台机器都要对齐,测试同时启动,靠人的协调保证时间一致,误差还算可控。

方案二是借助分布式压测工具,比如把fio封装成容器镜像后由编排平台统一分发执行。这样做的好处是并发启动时间误差小、结果能自动汇总,适合几十台客户端的规模。我建议把每组场景的fio参数先写成job文件,分发给所有节点统一执行,避免在命令行里传参导致格式不一致。

多客户端压测还有一个关键点:每台客户端都要给自己指定独立的测试子目录,不要所有客户端同时写同一个目录。文件存储的元数据锁竞争会导致数据失真,目录分散既是为了避让锁竞争,也是为了最终统计时能分客户端核对数据。

4. 测试数据解读与误差控制

4.1 结果里的每个字段都是什么含义

fio测试结束后会输出一堆数据,很多新手只盯着IOPS那一项,其实关键信息远不止这些。我拿一段典型的输出字段来说明:

  • read: IOPS=xxxx,BW=xxxxMiB/s:这是平均IOPS和平均吞吐,报告的核心项。
  • lat (usec) 系列:包括平均延迟、标准差、百分位延迟。avg是平均时延,p99表示99%的IO延迟低于这个值。大规模文件存储场景下,p99比平均时延重要得多,因为个别慢IO对数据库的影响比整体平均恶化更致命。
  • cpu:整个测试期间的客户端CPU占用。如果CPU已经接近满载,说明IOPS可能不是存储的真实能力,而是客户端打不动了。
  • lat (msec):如果时延数据量级过高,比如P99到了几十毫秒甚至百毫秒级,不用看IOPS了,先排查存储端是否存在严重拥塞。

多客户端数据汇总时要算"聚合IOPS"而不是"平均IOPS"。比如10台客户端,9台每台2万IOPS,1台只有8000,平均写法是1.88万,但聚合值是18.8万。聚合值才代表存储的承载能力,平均值会掩盖单节点的压力不均衡问题。所以多客户端测试时我建议把每台的结果导出成CSV,单独核对每台的差异,客户端之间数据差异超过15%就要警惕负载不均衡。

4.2 那些藏在数据背后的误差来源

第一类误差来自Page Cache。虽然direct=1能绕过客户端缓存,但需要注意fio的size参数如果小于存储端cache容量,仍然可能读到存储网关的缓存数据。这不一定是坏事,因为生产环境本身也有缓存层,但如果你要验证的是磁盘底层的极限能力,建议把测试数据量调到存储缓存容量的两倍以上。

第二类误差来自测试文件系统的"新鲜度"。文件系统刚创建时,元数据分布比较规整,数据块分配集中,测出来的IOPS会偏高。随着测试反复写入、删除,文件系统碎片化加剧,IOPS会慢慢下降。大规模文件存储都存在这个问题,所以做对比验证时,务必保持相同的初始化条件:要么都等文件系统"冷却"之后再测,要么都用同一批新建目录测,否则你对比的其实是两个不对等的状态。

第三类误差是网络协议栈参数。文件存储常见的NFS协议,在高并发小IO下,TCP参数对性能影响极大。建议测试前把socket缓冲区大小和NFS挂载参数统一好,不同客户端之间不能一把机器用默认值、一把机器优化过,这种对比没有意义。我整理了一个常用的内核参数优化建议,见下表:

| 参数 | 推荐值 | 影响说明 | | net.core.rmem_max / wmem_max | 16MB | 提升NFS大并发时的socket缓冲能力 | | net.ipv4.tcp_rmem / wmem_max | 16MB | 同上,二者需一致 | | sunrpc.tcp_slot_table_entries | 128 | 提升客户端并发RPC数量 | | sunrpc.tcp_max_slot_table_entries | 128 | 修改后需重启rpcbind服务 | | 调度器 | none / noop | 避免调度层多余的IO合并延迟 |

4.3 多轮测试与数据稳定性判断

单轮测试结果不能直接拍板。我在正式交付验证时,至少每个场景跑三轮,而且中间间隔一段时间,让存储系统的缓存状态和热点分布重新分布。三轮数据之间的波动范围,我认为可以作为系统稳定性的参考:IOPS波动在5%以内说明系统状态稳定,超过10%就说明系统存在明显的不确定因素,需要往上排查。

判断数据是否可信还有一个简单的方法:观察fio输出里的"lat"标准差。如果标准差特别大,比如平均时延5毫秒但标准差到了12毫秒,说明IO请求存在严重的排队抖动,这种环境下测出的IOPS数值善变,需要延长runtime让系统达到稳态再采数。

5. 常见问题与排查技巧实录

5.1 问题速查表

| 现象 | 可能原因 | 排查路径 | | IOPS低于预期30%以上 | 客户端CPU瓶颈 | 查看fio输出的cpu字段,确认是否接近满载,再逐步降低numjobs对比测试 | | IOPS上不去但客户端很闲 | 网络链路上存在瓶颈 | 检查交换机端口负载、流控策略,用iperf3先确认链路带宽与包转发能力 | | 多客户端压力无法叠加 | 存储网关会话数限制 | 查看存储端连接会话数,调整挂载方式为多目录或多网关IP | | 延迟P99突然飙升 | 存储端磁盘热/回收任务干扰 | 检查存储端是否有后台任务(快照、巡检、均衡),等待任务结束再测 | | 写IOPS远低于读IOPS | 存储端写放大或RAID写惩罚 | 确认底层RAID级别,核对存储的写缓存配置是否开启 | | 滚动测试结果持续走低 | 测试文件碎片化或空间增长 | 清理测试文件,重新格式化或新建独立目录后再测 |

5.2 实测中容易踩的坑:我的一次"翻车"经历

有一次在某分布式文件存储上做交付验收,配置的是高配全闪存储池,纸面预期20万随机读IOPS。我按照4K随机读的模板开跑,第一轮数据出来只有9万,整整少了一大半。当时第一反应是客户端压力不够,于是把客户端从8台加到16台,numjobs和iodepth全部翻倍,结果只有轻微上涨,依然到不了12万。这期间还遇到过时延特别高的告警,看起来像是存储端响应慢。

后来一点一点排查才发现问题出在NFS挂载参数上。客户端的挂载选项虽然是默认的,但存储网关侧默认启用了"强一致"的写入语义,读请求也需要经过较重的协议握手流程。换用更贴近性能场景的挂载参数之后,IOPS数据立刻恢复正常水平,后续三轮测试都稳定在26万左右。那次之后我就养成一个习惯:凡是类似验收测试,第一轮一定是"检查挂载参数和协议配置"而不是"检查客户端压力"。如果你测出来的数据和预期差距悬殊,先别慌着加压力,往协议层、配置层多看一眼。

5.3 写一份能复现的测试报告

测试做完不算完,报告写不清楚等于白测。我见过太多测试报告只有一张IOPS柱状图,没有环境信息、没有参数信息、没有波动数据,这种报告根本没法作为后续对比的依据。

一份能复现的IOPS测试报告,我建议至少包含五块内容:

  1. 环境信息:存储端型号与配置、客户端型号与配置、网络拓扑与带宽、测试目录所在存储池、存储端版本信息。
  2. 工具与参数:fio版本、完整命令行或job文件、客户端数量、每台客户端的并发配置。
  3. 结果数据:每条场景的读IOPS、写IOPS、平均时延、P99时延、吞吐、客户端CPU占用、多轮波动范围。
  4. 场景截图或原始输出:至少保留一轮的fio完整输出,便于事后回溯。
  5. 结论与对比基线:实测值对比预期目标,给出达标的结论或差距分析。

报告中一个容易被忽略但很重要的点是"测试文件组织结构"。我踩过这样的坑:第一次测试用的测试目录里每个客户端子目录是新建的,文件系统是全新状态;一个月后复测时目录还是那些目录,但文件已经反复创建删除过,结果数据比首次低了12%,直接引发了一场"系统性能劣化"的假警报。后来我在报告中固定记录测试目录的文件状态和文件数量,每次复测之前统一清理重来,这类误判就不再出现了。


最后分享一个我的习惯:IOPS验证从来不是一次性工作,投入使用之后的定期复查同样重要。我通常按季度做一次基准复测,把每次的测试结果归档,专门盯P99和平均时延的变化曲线,时延的缓慢劣化往往比IOPS骤降更早暴露存储隐患。这套方法跑过多个项目之后,我觉得最核心的一条经验就四个字:控制变量。存储验证的难点从来不在于会不会敲fio命令,而在于如何让每一轮测试之间的条件完全一致。只要你能把环境、参数、方法都固定下来,IOPS数据就会变得诚实而可预测。

相关新闻

彻底理解进程与线程:从概念到排查实战

彻底理解进程与线程:从概念到排查实战

刚接触并发编程那阵子,我也被“进程和线程”这两个词搅得头疼。教科书上写“进程是资源分配的最小单位,线程是CPU调度的最小单位”,每个字都认识,连在一起却像绕口令。后来在真实的项目里排查线上问题、调优接口耗时、设计定时任务…

2026/10/20 17:10:37 阅读更多 →
SLAM技术工程化实践:激光与视觉惯性里程计复现与调参指南

SLAM技术工程化实践:激光与视觉惯性里程计复现与调参指南

简介:本资源为高博《自动驾驶与机器人中的SLAM技术》源码修改版,面向自动驾驶、机器人及SLAM方向的开发者与深蓝学院学员,提供经定制调整的可运行代码,帮助读者从传感器数据、建图算法到优化模块直观理解完整实现流程。压缩包约23…

2026/10/20 17:09:34 阅读更多 →
机器学习与深度学习:区别、原理与实战指南

机器学习与深度学习:区别、原理与实战指南

机器学习、深度学习这两个词,这几年几乎已经被说烂了。但真被问到“区别到底是什么、我该先学哪个、实际项目里怎么用”,能一句话讲清楚的人并不多。作为常年跟数据打交道的人,我习惯把机器学习理解成“按菜谱学做菜”:你告诉系统…

2026/10/20 17:09:34 阅读更多 →

最新新闻

大模型入门必读:从深度学习原理到工程实战的系统书单

大模型入门必读:从深度学习原理到工程实战的系统书单

最近这半年,总有人在后台问我:“我想入门大模型,该看什么书?”老实说,每次被问到这个问题,我都挺为难的。现在网上关于大模型的书单五花八门,有讲算法的、有讲应用的、有讲产业趋势的&#xff0…

2026/10/20 17:54:48 阅读更多 →
拆解DeepSeek Agent框架:插件化架构的设计与实战踩坑记录

拆解DeepSeek Agent框架:插件化架构的设计与实战踩坑记录

我一直有个习惯:拿到一个开源项目,先不看 README 也不看官方博客,直接把仓库 clone 到本地,先翻目录结构、再读接口定义,最后才回去对照文档验证自己的猜想。这次拆 DeepSeek 开源的 Agent 框架,起初只是好…

2026/10/20 17:54:48 阅读更多 →
AI助理代登录的权限设计:Poppy草案的四层授权关卡与落地实践

AI助理代登录的权限设计:Poppy草案的四层授权关卡与落地实践

你有没有想过,有一天你的AI助理会替你登录各种账号?不是那种简单的“帮我查一下天气”,而是真的拿着你的身份,去另一个平台做事情——比如帮你把昨天的报销单提交到财务系统,帮你把一个长邮件回复整理好并发送出去&…

2026/10/20 17:54:48 阅读更多 →
腾讯云AI语音识别:自动生成会议纪要的实践与调优

腾讯云AI语音识别:自动生成会议纪要的实践与调优

我们每次开会一小时,纪要却要整理半小时,这句话我从不止一个团队嘴里听到过。会议内容总要有人记,记完还要提炼待办、确认负责人,稍微复杂一点的讨论,光靠人工回忆很容易漏掉关键信息。所以这两年我一直建议有条件的团…

2026/10/20 17:54:48 阅读更多 →
Kubernetes资源清单实战:从YAML编写到Pod、Service与ConfigMap

Kubernetes资源清单实战:从YAML编写到Pod、Service与ConfigMap

1. 资源清单是什么,为什么是Kubernetes的第一道门槛很多刚接触Kubernetes的开发者,第一个卡住的地方往往不是Pod、Deployment这些概念本身,而是搞不懂"资源清单"到底是个什么东西、为什么要写这么一长串YAML。我最早学K8s的时候也踩…

2026/10/20 17:54:48 阅读更多 →
Qt课程进度导航栏G03:从数据模型到自绘渲染的完整实践

Qt课程进度导航栏G03:从数据模型到自绘渲染的完整实践

做教育类桌面客户端的时候,课程导航一直是个绕不开的活儿。用户要在一个窗口里看到章、节、课时的层级关系,要清楚自己学到哪了,还得能一键跳回上次退出的位置。市面上的现成组件大多只解决“展示目录”这一层,进度状态、学习记忆…

2026/10/20 17:53:47 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →