我遇到一个问题,与 Linux 机器上另一个目录中的相同文件相比,我对一组文件的访问速度慢了 8 倍。
该文件系统是从 Dell PERC H810 导出的 36TB RAID-5 文件系统,采用 ext4 格式。该机器有 256GB RAM,我使用的是 OpenSuSE 12.3,内核为 3.7.10-1.45-desktop。
问题出现在一些简单操作上,例如“time cat slowdir/* > /dev/null”,但“time cat fastdir/* > /dev/null”的速度大约快 8 倍。我在测试之间清除了 IO 缓存(echo 3 > /proc/sys/vm/drop_caches),因此这不会影响我的结果。
slowdir 和 fastdir 都位于同一个文件系统和同一个父目录中。
以下是有关该问题的一些奇怪之处。如果我执行以下操作,该问题在新目录 alsoslowdir 中仍然存在:
- cd /父目录
- cp -r slowdir alsoslowdir
- echo 3 > /proc/sys/vm/drop_caches
- time cat alsoslowdir/* > /dev/null (糟糕:耗时 8 分钟)
但是,如果我创建一个新目录,也称为fastdir,并将所有文件复制到其中,那么使用此方法速度会快 8 倍:
- cd /父目录
- mkdir alsofastdir
- cp slowdir/* alsofastdir/
- echo 3 > /proc/sys/vm/drop_caches
- time cat alsofastdir/* > /dev/null (好:需要 1 分钟)
每个目录中的所有文件大小都在 7 到 15MB 之间,目录中有几千个文件,总共 58GB。
我检查了快速和慢速目录中所有文件的 /usr/sbin/filefrag 统计信息,它们都是 1 或 2 个范围,它们之间的 1 和 2 个范围的数量大约相同。
我错过了什么?
答案1
在您的“快速”测试中,您表明您以递归方式复制:cp -r slowdir alsoslowdir
在您的“慢速”测试中,您没有使用递归标志进行复制,而是使用通配符:cp slowdir/* alsofastdir/
slowdir 中是否有子目录?不能 100% 确定 wildcard 是否也包含子目录,但我相当确定它不包含,并且仅扩展到目录中所有匹配的“对象”,这意味着子目录将留空。
您可能需要重试测试,并绝对确定每个目录包含的数据是相同的。
如果这无济于事……也许只需在所有目录名称中添加“fast”?(开玩笑)不过,请考虑寻找一个好的性能测试工具 - 在我看来,cat 真的不是一个很好的测量方法。寻找一个允许调整线程、I/O 大小、读/写组合等的工具,并在特定文件上运行测试(抱歉,目前想不出具体的工具名称)。
顺便问一下 - 是什么促使你像现在这样对单个目录进行性能测试?我敢肯定你遇到了某种奇怪的行为来开始这件事......
答案2
假设目录结构完全相同(您应该真正检查一下),您的结果可能会因缓存(在控制器和操作系统级别)和/或两个目录的物理磁盘布局有很大差异而产生偏差。
尝试一下:
- 确保您有 iostat 二进制文件(它通常是 sysstat 包的一部分)
- 使 PERC 缓存无效通过发布
dd if=/dev/zero of=bigfile bs=4k count=1M oflag=direct; sync
- 通过发出以下命令使操作系统缓存无效
sync; echo 3 > /proc/sys/vm/drop_caches
- 收集磁盘统计信息发布
iostat -x -k 5 > stat.txt & cat dir/* > /dev/null; killall iostat
- 对其他目录重复所有这些步骤,上传磁盘统计信息(针对两个目录)并让我看看它们