多年前,我负责一个大规模的数据迁移项目:多个磁盘,每个磁盘上有超过一亿个文件,并且有一个严格的、不可谈判的24小时停机窗口。使用当时可用的标准工具是一种痛苦的经历。单线程的文件发现速度缓慢,内存使用情况则让我时刻感到焦虑。我向自己承诺,总有一天我会回过头来,构建一个能够原生处理这种规模的工具。
最初作为一个副项目开始的工作,已经演变成一个完整的系统级工程。这个项目是oc-rsync——一个完整的客户端、服务器和守护进程实现,专门针对rsync协议32,完全用纯Rust编写。
我觉得非常讽刺的是,我目前正在发布一个数据迁移工具,而我的生活却装在行李箱里,因为我自己也在迁移到另一个国家。在打包箱子的同时,我每天都在推送多次git提交。
我想在这里完全坦诚:我正在积极地进行这个项目,并且并不是所有功能都已实现。核心的增量传输、协议互操作性(协议28-32)和守护进程模式已经相当稳定,但我仍在梳理上游rsync处理的数百个晦涩的标志和边缘情况。
重建一个经过29年优化的代码库需要模块化的方法(当前工作空间分为23个crate)。一个主要的工程目标是与上游保持严格的线缆兼容性,同时现代化内部结构以实现最大吞吐量:
- **管道并行性**:我使用Rayon将文件系统遍历与数据传输解耦。并行化文件列表生成和校验和计算消除了在大目录上臭名昭著的“扫描停滞”问题。
- **现代I/O与零拷贝**:该引擎实现了io_uring(Linux 5.6+),用于批量异步I/O,并具有自动回退功能,同时支持零拷贝的copy_file_range和内存映射I/O。
- **SIMD与AES-NI**:我用本地Rust实现替代了标准的C FFI调用。校验和使用运行时CPU特性检测(AVX2/NEON)来加速滚动哈希。由于标准SSH交互的速度无法跟上I/O管道,我直接将加密工作卸载到硬件加速的AES-NI上。
- **内存效率**:我摒弃了传统的排序数组,转而使用O(1)的基于哈希的逻辑进行元数据比较,并将mimalloc分配器接入,以保持内存使用情况的可预测性。
我不会在这里承诺具体的“X倍更快”的说法,因为性能高度依赖于你的硬件和文件分布。然而,在重负载的传输工作下,这种架构始终能实现比传统构建更好或相等的结果,同时显著降低CPU利用率。你无需自己设置基准测试脚本来验证这一点——我的CI管道会自动对每一个发布进行基准测试,并将结果的图片直接发布到README中。
如果你对系统编程、内核旁路I/O或Rust工作区架构感兴趣,我非常希望你能看看代码。请告诉我你对架构的看法,或者如果你发现任何明显的文件系统边缘情况,我应该添加到我的CI测试中。
返回首页
最新
我大约在三个小时前提交了这篇文章,到目前为止我认为它还没有上线。它没有被标记,也似乎没有违反规则。有人知道为什么它还没有上线吗?<p>这是我提交列表中的第一篇文章:“Pinterest正淹没在一片人工智能垃圾和自动审核中(404media.co)”[0]<p>[0]: https://news.ycombinator.com/submitted?id=trinsic2
我一直遇到一个与AI编码工具相关的结构性问题。
你尝试一个代理,它进行了一些更改。然后你再尝试另一个代理。现在你需要手动比较分支并清理实验性提交。
这些工具很强大,但工作流程并不是为比较而设计的。
因此,我构建了Parallel Code。
它本地运行Claude Code、Codex和Gemini CLI(没有API封装,没有功能抽象),但将每个代理隔离在:
- 自己的终端
- 自己的Git工作树
- 自己的功能分支
工作流程变成了:
- 创建N个工作树
- 每个工作树分配一个AI代理
- 让它们独立实现
- 比较差异
- 合并最佳结果
这样,你就可以进行并行探索,而不是顺序的试错,同时保持安全的隔离。
为什么不直接使用tmux?
可以,但你仍然需要手动管理:
- 分支创建
- 工作树清理
- 会话命名
- 上下文切换
Parallel Code自动化了Git结构,并保持会话的视觉组织。
这主要面向已经大量使用AI命令行工具的人。
我很好奇:是否还有其他人转向多代理并行工作流程,而不是单代理迭代?
GitHub: [https://github.com/johannesjo/parallel-code](https://github.com/johannesjo/parallel-code)
我最初构建了 cs(codespelunker),目的是为了回答一个问题:BM25 相关性搜索能否在不构建索引的情况下工作?<p>结果证明是可以的,因此我在这个想法上进行了迭代,将其发展成一个完整的命令行工具。最近,我希望通过添加 Sourcegraph 或 Zoekt 等工具的相关性来改进它,但同样不想添加索引。<p>cs 使用 scc <a href="https://github.com/boyter/scc" rel="nofollow">https://github.com/boyter/scc</a> 来动态理解文件的结构。因此,它可以将搜索过滤到代码、注释或字符串中。它还应用了加权的 BM25 算法,其中实际代码中的匹配项排名高于注释中的匹配项(默认情况下)。<p>我还使用 scc 扫描时输出的圈复杂度添加了复杂度重力权重。因此,如果你在搜索一个函数,具体实现应该比接口排名更高。<p><pre><code> cs "authenticate" --gravity=brain # 查找复杂的实现,而不是接口
cs "FIXME OR TODO OR HACK" --only-comments # 仅在注释中搜索,不在代码或字符串中
cs "error" --only-strings # 查找错误消息定义的位置
cs "handleRequest" --only-usages # 查找每个调用位置,跳过定义
</code></pre>
v3.0.0 添加了一个新的排名器,以及一个交互式 TUI、HTTP 模式和 MCP 支持,以便与 LLM(Claude Code/Cursor)一起使用。<p>由于它在动态进行分析和复杂度计算,因此速度比任何 grep 都慢。然而,在 M1 Mac 上,它可以在大约 6 秒内扫描并排名整个 4000 万行以上的 Linux 内核。<p>实时演示(在其自身源代码上以 HTTP 模式运行): <a href="https://codespelunker.boyter.org/" rel="nofollow">https://codespelunker.boyter.org/</a>
GitHub: <a href="https://github.com/boyter/cs" rel="nofollow">https://github.com/boyter/cs</a>
嘿,HN!<p>我正在开发 Tskflow,这是一款基于简单理念的小型生产力工具:<p>大多数任务管理工具都变得杂乱无章且令人压力倍增。而 Tskflow 试图保持轻量和无摩擦,专注于你现在需要处理的任务。<p>核心理念:<p>• 快速捕捉任务
• 保持干净、无干扰的视图
• 强调流程和专注,而非繁重的组织<p>你可以在这里试用<p>我希望得到诚实的反馈:<p>• 与你当前的系统相比,这里有哪些不足?
• 有哪些功能感觉不必要或缺失?
• 你真的会使用这样简约的工具吗?
• 这种工具显然不适合什么类型的用户?<p>由我独立开发和维护。处于早期阶段,欢迎批评。