无名阁

美好的生活需要用心记录

Linux系统中对SSD硬盘优化的方法

2011-10-1 笑看风云 硬件

这里说的优化是针对EXT4格式,因为看了很多国外网站的很多读写评测,目前来说,EXT4在SSD硬盘是最快的,所以推荐使用SSD硬盘的使用EXT4格式。优化方案如下:

文章提到的fstab在/etc里面,可以直接运行"sudo gedit /etc/fstab"来修改

 

1、关闭日志功能

方法一:

fstab里加挂载参数data=writeback,如:

原始的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 relatime,errors=remount-ro 0 1

改后的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 relatime,errors=remount-ro,data=writeback 0 1

 进过我的测试发现ubutnu下这样没有用,要这样才可以用.

打开grub:

sudo gedit /etc/default/grub
在GRUB_CMDLINE_LINUX_DEFAULT=""中添加rootflags=data=writeback 然后更新grub

方法二:

还有直接去掉日志功能的方法,这样是不用重新分区的:

运行指令:tune2fs -O ^has_journal  /dev/sda1

检查是否去除了日志:sudo tune2fs -l /dev/sdxn | grep 'Filesystem features' | grep 'has_journal'

ps:恢复日志功能

运行指令:tune2fs -O has_journal  /dev/sda1

检查是否恢复了日志:sudo tune2fs -l  /dev/sdxn | grep 'Filesystem features' | grep 'has_journal'

自己把/dev/sda1改为相应的分区号,要卸载分区才能运行该指令。

 

2、禁止记录最近一次访问的时间戳

默认情况下,Linux ext 文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间。因为系统运行的时候要访 问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘 IO 的效率、提升文件系统的性能。Linux 提供了 noatime 和nodiratime这两个参数来禁止记录最近一次访问时间戳。

给文件系统挂载的时候加上noatime和nodiratime参数能大幅提高文件系统性能: 

原始的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 defaults,errors=remount-ro 0 1

改后的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 defaults,noatime,nodiratime,errors=remount-ro 0 1

 完全关闭这些选项不一定好推荐还是把noatime改成relatime比较好,nodiratime还是不要添加的为好。

3、启用 TRIM 功能

    Trim的作用

原本在机械硬盘上,写入数据时,Windows会通知硬盘先将以前的擦除,再将新的数据写入到磁盘中。而在删除数据时,Windows只会在此处做 个标记,说明这里应该是没有东西了,等到真正要写入数据时再来真正删除,并且做标记这个动作会保留在磁盘缓存中,等到磁盘空闲时再执行。

这样一来,磁盘需要更多的时间来执行以上操作,速度当然会慢下来。

而当Windows识别到SSD并确认SSD支持Trim后,在删除数据时,会不向硬盘通知删除指令,只使用Volume Bitmap来记住这里的数据已经删除。Volume Bitmap只是一个磁盘快照,其建立速度比直接读写硬盘去标记删除区域要快得多。这一步就已经省下一大笔时间了。然后再是写入数据的时候,由于NAND 闪存保存数据是纯粹的数字形式,因此可以直接根据Volume Bitmap的情况,向快照中已删除的区块写入新的数据,而不用花时间去擦除原本的数据。

以上就是Trim的原理以及真正作用。

注意:如果SSD组RAID0后,将失去Trim功能

 

   Linux内核从2.6.33开始提供TRIM支持,所以先运行“uname -a”命令,查看自己的内核版本,如果内核版本低于2.6.33的,请先升级内核。

然后运行“hdparm -I /dev/sda”查看自己的硬盘支不支持TRIM技术,如果支持,你会看到

* Data Set Management TRIM supported

如果上面两个条件都满足了,就可以在fstab中添加discard来开启TRIM功能,如:

原始的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 defaults,errors=remount-ro 0 1

改后的UUID=2f6be0cf-2f54-4646-b8c6-5fb0aa01ef23 / ext4 

discard,defaults,errors=remount-ro 0 1

ps:有人说Linux用 discard不好,可能会造成性能下降,大家也可以改用fstrim进行定时TRIM:

sudo fstrim -v /


不过推荐大家在/etc/cron.daily/里面创建fstrim文件更好,文件内容如下:
#!/bin/sh
LOG=/var/log/trim.log
echo "* $(date) *" >> $LOG
fstrim -v / >> $LOG
fstrim -v /home >> $LOG

然后赋予此文件可执行权限

4:配置固态硬盘(SSD)的I/O调度程序

    优化的第三个部分涉及到I/O调度程序。该模块是一个决定如何处理I/O请求的核心组件。默认情况下就是非常公平的排队,对于普通的磁盘驱动器来说,这是很好的方案,但对于以期限调度为优势的固态硬盘来说,这并不是最好的。

如果你想在系统中对所有磁盘采用期限调度,可以在内核加载时把elevator=deadline这句话加入到系统引导管理器(GURB)中;如果你只 是想针对某一个磁盘,就应该在rc.local文件中加入类似如下实例的一句话,那么每次当系统重启,期限调度就会应用到指定的磁盘。如下实例将会对 /dev/sdb磁盘采用期限调度。

    echo deadline > /sys/block/sdb/queue/scheduler
    给IO的算法修改成 noop,操作系统本身不做处理,让 ssd 本身处理.
    echo noop >  /sys/block/sda/queue/scheduler

ps:

查看當前系統支持的IO調度算法
dmesg | grep -i scheduler
查看當前系統的I/O調度方法:
cat /sys/block/sda/queue/scheduler

推荐使用udev来自动处理I/O调度程序:

ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1",ATTR{queue/scheduler}="cfq"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0",ATTR{queue/scheduler}="deadline"

5:把缓存放到内存中

修改fstab,在fstab文件中添加一下内容

tmpfs /var/log tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var/tmp tmpfs defaults 0 0 
然后输入一下命令重新挂载或重启:
sudo mount -a

然后,可以在Firefox上通过about:config设置,把cache放到/tmp去,提高Firefox效率外,同时也可以减少对SSD的读写。

新增字符串 browser.cache.disk.parent_directory 设置的数值为 /tmp

接着在档案 /etc/rc.local 中的 exit 0 前加入以下七行令开机时自动建立 /var/log 中的目录:

for dir in apparmor apt news cups dist-upgrade fsck gdm installer samba unattended-upgrades
do
    if [ ! -e /var/log/$dir ]
    then
            mkdir /var/log/$dir
    fi
done

ps:我用ubutnu12.04测试了一下,发现不再rc.local中添加上面的七行也可以.大家可以先不添加,要是出了问题再添加比较好.

标签: Linux 硬件 ssd

et_highlighter51

发表评论: