本视频详细介绍了 rustup(Rust 安装器)在 Windows 上安装速度从最初的3分30秒大幅提升至14秒,以及在 NFS 环境中优化到15秒的旅程。
rustup 在 Windows 上的安装速度极慢,问题被归咎于 NTFS、小文件和反病毒软件。stat 系统调用,并增大了 tar 文件读取缓冲区,显著提升了性能。
主讲人介绍了 rustup,即 Rust 编程语言的安装器,它负责安装 Rust 及其各种组件(包括文档),并支持 Linux、Mac 和 Windows 等平台。
rustup 时,发现安装过程异常缓慢,耗时约3分45秒(不含下载时间)。
stat 系统调用 [00:08:21]rustup 在提取每个文件时,都会防御性地 stat (获取文件状态)其父目录,以确保它仍然存在。stat 调用。stat 操作并非免费,即使在 Linux 上也会消耗时间。rustup 从磁盘上的 tar 文件中读取数据,然后写入大量小文件。rustup 在安装过程中对每个文件进行了多次冗余的文件操作:stat 文件以检查是否存在。atime)和修改时间(mtime),然后关闭。mtime 的不必要更新,因为对于文档文件,最后修改时间并不重要。这节省了4-6秒的安装时间。intime 系统调用,而是通过通用文件操作来实现,这增加了操作成本。chmod)是竞争条件(racy)的,不如对已打开文件句柄进行操作安全和高效。
/etc/passwd)。O_EXCL 标志),如果在写入时文件已经存在,则返回错误而不是覆盖。CloseHandle 调用 [00:20:21]CloseHandle)时扫描文件内容,导致 CloseHandle 调用阻塞,严重拖慢安装速度。CloseHandle 操作推迟到独立的线程池中异步执行。这使得 rustup 的主线程不再被阻塞,安装速度降至11秒。CloseHandle 慢的问题,并采取了类似的线程化策略。CloseHandle 解决了部分问题,Defender 仍在文件写入时立即扫描,对于文档这种不立即使用的文件来说,这是不必要的开销。
rustup 生成的文件扫描模式从“写入时”改为“读取时”。rustup 的安装时间进一步降至约4秒,与 Linux 上的性能持平。rustup 的用户反馈安装失败。open (3ms)、chmod (2ms)、chown (1ms) 系统调用延迟很高。对于20,000个文件,这些延迟累加起来高达120秒。
rustup 的性能数据可视化,就像浏览器性能追踪一样。open 和 close 系统调用仍然缓慢。CloseHandle 调用在 Defender 引擎中耗时12毫秒,因为它涉及文件映射和内容扫描。
rustup 的过程中获得了微软的“特权访问”。CloseHandle 这样的操作仍然需要在真正的线程中执行,因为内核层没有异步版本。