副SSD读取目录树速度极慢问题求助
副SSD读取目录树速度极慢问题求助
问题描述
我有两块SSD,都是近4年购买的,插在主板的SATA接口上,均格式化为ext4格式。当前挂载信息如下:
$ df -h | grep sd /dev/sda2 916G 130G 740G 15% / /dev/sdb3 916G 346G 523G 40% /media/olddisk
其中sdb3是我的旧盘,之前是唯一的系统盘(当时识别为sda2)。后来我加装了新SSD作为主盘,把旧盘换到第二个SATA接口,新盘则插在第一个接口上,并安装了全新的Ubuntu 24.04.1 LTS系统。
现在遇到的问题是:从sdb3向sda2拷贝单个2GB大文件时速度正常,约2秒就能完成;但拷贝一个包含400个文件、总大小同样为2GB的目录树时,速度却慢得离谱,需要大约3分钟!
经过观察,耗时主要集中在读取sdb3的目录树环节,而非写入sda2。比如单独执行读取该目录树信息的命令,耗时也很长...
排查与解决建议
针对这个问题,我整理了几个实用的排查方向,你可以逐一尝试:
- 检查磁盘健康状态:先用
smartctl -a /dev/sdb查看旧盘的SMART数据,重点关注坏块计数、读写错误、磨损程度这些指标——毕竟是用了几年的老盘,潜在硬件问题可能会影响小文件读取性能。 - 修复文件系统与碎片整理:ext4长期使用后可能产生碎片,尤其是曾经作为系统盘的旧盘。先确保没有程序在访问
sdb3,然后卸载它:sudo umount /media/olddisk,接着执行e2fsck -f /dev/sdb3检查并修复文件系统,完成后重新挂载再测试速度。 - 调整系统缓存参数:Ubuntu默认的
vm.vfs_cache_pressure参数(默认值100)可能对小文件目录的缓存不够友好,你可以临时调低这个值试试:sudo sysctl -w vm.vfs_cache_pressure=50,这个参数调小后,系统会更优先缓存目录和inode信息,可能提升小文件批量读取的效率。如果有效,可以把这个配置写到/etc/sysctl.conf里永久生效。 - 排查硬件连接问题:虽然单个大文件读取正常,但小文件读取对接口稳定性要求更高。试试把旧盘换到其他SATA接口,或者更换一根SATA线缆,排除接触不良或线缆老化的问题。
- 换用高效拷贝工具:默认的
cp命令在批量小文件拷贝上效率一般,你可以试试rsync:rsync -av --progress /media/olddisk/源目录 /目标目录,或者用tar打包后再传输:tar -cf - /media/olddisk/源目录 | (cd /目标目录 && tar -xf -),这类工具在处理大量小文件时通常更高效。 - 实时监控IO状态:在拷贝目录树时,用
iostat -x 1或者iotop工具实时查看磁盘的IO情况,重点看sdb3的%util(设备利用率)和await(IO等待时间),如果这两个指标很高,说明磁盘正在处理大量随机IO等待,能帮你更精准定位问题。
备注:内容来源于stack exchange,提问作者Klitos Kyriacou




