可以安装iotop,一个类似top的磁盘监控工具来查看磁盘的IO操作。
iotop -oPa
这个命令运行几分钟,你可以看到哪些进程在进行磁盘的读写操作。以此来排查潜在的问题。
通常,固态硬盘或sd卡,我们可以有以下一些优化手段:
1. noatime挂载选项
默认的方式下linux会把文件访问的时间atime做记录,文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,可以用noatime这个挂载选项来避免这个不必要的操作。修改/etc/fstab对应的分区选项,如:
/dev/disk/by-uuid/b530d5f6-f8f2-6645-ad8a-8318c612bba6 / ext4 defaults,noatime 0 1
2. trim优化
Trim指令也叫Disable Delete Notify(禁用删除通知),在文件系统上删除某个文件时候,通常只是在硬盘前的索引区里标记这块文件占用的区域为无效的,在固态硬盘闪存内,数据存储一般是以page(页)为最小单位存储的(典型的为4KB),而128个page组成了一个block(块),数据以页(page)为单位来读取和写入,但却只能以块(Block)为单位来删除。当读取数据或者写入到一个没有被使用过的page上时,固态硬盘的速度是很快的,但是在无效数据区上的话,就比较复杂了,需要许多步骤来完成。GC(Garbagecollection)垃圾回收就是把一个闪存块里的”有效”页数据复制到一个”空白”块里,然后把这个块完全擦除。这样下次数据将要再次写入的时候,可以写入这块被标记的区域。Trim(Discard)的出现主要是为了提高GC的效率以及减少写入放大的发生,最大作用是清空待删除的无效数据。
早期的Linux通常可以在/etc/fstab中用discard挂载选项来支持TRIM,但许多新出来的NVME固态并不推荐这种在线trim的方式,而是建议用 fstrim.timer系统服务。
- 定期任务
仅当systemd没有提供fstrim.timer服务时你才需要自己设置定时任务。
# crontab -l @midnight /usr/bin/trim
- 使用fstrim.timer服务
许多发行版都有提供每周一次的fstrim服务的systemd调用,可以查看其是否存在
sudo systemctl status fstrim.timer
3. 以tmpfs的方式挂载写入频繁的临时目录
如果你有足够大的内侟 ,可以把临时数据目录以及一些频繁写入的cache目录以tmpfs的方式挂载。tmpfs是常驻内存的文件系统,因此不会对磁盘有写入操作。同样地,这是在/etc/fstab中编辑。如:
# SSD tweak: temporary directories as tmpfs tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
4. 避免频繁使用swap空间
一般内存足够大的情况下,没有必要使用swap分区,自从ubuntu 18.04后系统会用一个swap文件来代替分区,因此不再推荐为swap在SSD上单独分个区。可以设置内存占比非常高时才启用swap空间以减少使用。修改/etc/sysctl.conf ,配置一下当内存只剩下10%时才开始启用swap分区。
nano /etc/sysctl.conf 添加或修改vm.swappiness=10