ubuntu-nuc

最近装了台Nuc主机来办公,为了性能上了SSD硬盘,今天网上搜罗了一些在Linux平台上SSD的优化配置。以减少硬盘写入,延长SSD的使用寿命,同时也提高linux的性能。

过程中发现Archlinux中的理论资料真不少,编排清晰,强烈推荐。

关闭交换区(swapoff)

Linux上的交换区(swap)和Windows上的虚拟内存大致相同:在硬盘上预分配一个swap区域,系统虚拟内存的总大小为物理内存加上swap区大小。对于内存不足或者部分常驻却不使用的内存,会被换出(swap out)到硬盘上的SWAP区域。过种中会有大量的磁盘写入。优化的第一步,便是减少掉这部分磁盘IO。

这里有两种方式:

第一种是直接使用swapoff -a命令关闭交换区,这样将不会再使用再交换区(打开使用swapon),

第二种方式是通过配置swapness来尽量减少交换区的使用机会。通过sysctl -q vm.swappiness查看默认值是60,调低该值将会减少从内存到磁盘的换出操作。 将这个值设置为0时,表示只有当物理内存使用率达到地100%后,才开始换出到磁盘。

这里我选择了第二种方式,执行sysctl vm.swappiness=0,这只是临时修改。若需要永久修改,可以编辑/etc/sysctl.conf,添加或修改值vm.swappiness=0。需要提一下的是,如果完全swapoff,则linux的休眠功能hibernate将会无法使用。

开启TRIM(与硬盘挂载优化)

TRIM是硬盘写入优化技术:SSD写入的指令可以是基于页(page)的,但对于数据的擦除经常是基于块(block,页的集合),所以写入页时,读取到所处块中有数据,则需要将其移动到缓存中,然后整块擦除,再将原有数据和新写入的数据一同写入到磁盘中,造成不必要的写操作。 而开启Trim后,则可以通过后台GC,在写命令达到之前,预先为准备可写入的空的块。

首先需要检测硬盘是否支持TRIM,可以通过如下命令检测:

hdparm -I /dev/sda | grep TRIM
        * Data Set Management TRIM supported (limit 1 block)
        //如果有类似输出表示支持TRIM

开启TRIM的方式为修改/etc/fstab文件,在主硬盘挂载记录中,修改挂载参数,如

#/etc/fstab
UUID=xxxxxxxxxxx / ext4 discard,noatime,nodiratime,errors=remount-ro 0 1

其中discard的意思便是开启自动TRIM(除自动TRIM外,还可以通过fstrim执行手动的trim操作)

此外,我们加上noatime与nodiratime,可以在读取文件时,避免对文件和目录的最后访问时间做更新操作,达到减少SSD写入操作的目的。

挂载完成需要重启,重启后可以通过mount -l查看是否挂载参数是否添加成功。

利用TMPFS

tmpfs是一种内存文件系统,临时存储,重启后数据便消失,可以将经常用于写的目录,挂载为tmpfs文件系统类型,这样这些目录的读写都变成了内存读写。比如可以将常用的/var/log和/tmp都挂载为tmpfs文件系统(其中/run/shm转认就挂载为tmpfs,可以用过du -l查看所有所有目录的挂载文件系统类型)。

挂载的方式是修改/etc/fstab,按如下格式增加记录:

tmpfs   /tmp            tmpfs   defaults,noatime,mode=1777      0       0
tmpfs   /var/tmp        tmpfs   defaults,noatime,mode=1777      0       0
tmpfs   /var/log        tmpfs   defaults,noatime,mode=1777      0       0

如果需要查看系统日志的话,则最好将/var/log删除掉,仍然挂载到硬盘上。

tmpfs的额度是虚拟分配,即使分配了2G,则实际目录仅使用了1个G。另1G的内存空间也不是被强制战用的,系统仍然可能使用到那1G的内存。

更换IO调度器

操作系统发出的IO指令,是通过一个IO Scheduler调度完成,不同的IO调度器有不同的特点及适用场景,对于HDD,一般是使用最为复杂的CFQ,合并减少寻道时间。而对于SSD来说没有寻道,反而CFQ复杂的调试算法没有了作用。而Noop则为最为简单的有请求合并功能的单队列算法,更适用于SSD。还有一种读写双队列分离的,按预定完成时间排序的Deadline调度器。对于SSD来说,Noop与Deadline都适用,wiki上多推荐使用Noop,而不少评测也证明Deadline性能也非常好。关于IO高度器在更多场景下的选择可以参考这里这里

查询目前使用的IO调试器的命令:

cat /sys/block/sda{N}/queue/scheduler
noop [deadline] cfq

其中被[]号括起来的为当前使用的IO调度器,对于ssd,deadline也是不错的调度器,不过追求绝对的简单,我还是尝试将其修改为noop:

echo noop > /sys/block/sda{N}/queue/scheduler // 临时修改调度器
//需要永久修改IO调度器,可能编辑/etc/rc.local,将上面的命令添加到该文件中。

修改完成后,仍然可以通过cat /sys/block/sda/queue/scheduler查看当前调度器。

关闭ext4分区Journaling日志

早在之前在通过iotop与iostat监控时,就发现每5秒钟,一个叫jdb2的进程便会准时写入磁盘,这就是ext4分区的日志功能,关闭日志能减少对磁盘的写入,但同时,如果发生意外的断电或者umount,则会有造成数据丢失的风险。由于我之前发生过踢到插线板断电的情况,这个日志还是暂时不关闭,而这篇文章中的测试也说明,日志对于磁盘写入的影响是较小的。不过对于笔记本电脑,则可以尝试一下,可以参考这

分区对齐

之前TRIM小节讲到的,SSD的写入操作可以基于Page,擦除操作基于Block。而分区不对齐造成的后果当一个逻辑页的数据,可能被写入到两个物理页中去,甚至是跨Block,而引起大量非必要的写入操作(参考Intel的文章)。影响性能同时还影响SSD的使用寿命。可以通过fdisk -l或者gdisk -l /dev/{device}查看分区是否对齐,前者针对MBR分区表,后面针对GPT分区表,以我的为例:

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 488397168 sectors, 232.9 GiB
Logical sector size: 512 bytes
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 488397134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2349 sectors (1.1 MiB)

Number Start (sector) End (sector) Size Code Name
1 2048 1050623 512.0 MiB EF00
2 1050624 455077887 216.5 GiB 8300
3 455077888 488396799 15.9 GiB 8200

若其中每列Start值都能被8整除,表是分区对齐。(使用GPT分区表是,默认就是分区对齐)

应用优化

对于应用的优化也很重要,比较常用的浏览器缓存,编辑打包目录,程序调试日志等,都可以尝试将这部分数据输出到挂载为tmpfs的/tmp目录中或者/run/shm中。

以Chromius为例,经过测试发现~/.cache/chromium/Default/Cache目录上一缓存数据可以指向到tmpfs文件系统中去,并不会影响到收藏夹等用户数据,于是我就被这个目录链接到了内存中。

mkdir /tmp/ChromeDefaultCache && ln -s /tmp/ChromeDefaultCache   ~/.cache/chromium/Default/Cache

而对于像tomcat的输出日志,solr的索引文件,甚至是mysql的sock,排序磁盘文件等,如果可以,都可以尽量放到内存中去。

IO监控

对于IO监控,没有太多需要说的了,通过iostat和iotop命令已经完全够用了。但是需要提醒的是,随着系统安装越来越多的应用,就越需要对IO进行监控,无法确认哪些程序会有大量的硬盘读写,我曾经配置错一个solr的suggest参数,导致瞬间生成了200G的fuzzy suggest文件,也怪SSD的性能真好,说写进入就写进入。

对于SSD的来,可以通过Media Wearout Indicator(MWI)来评估硬盘的损耗程度,通过命令

sudo smartctl --all /dev/sda{N}

找到其中的Media Wearout Indicator或者类似的值,查其Value值,越小证明损耗程度越大。

 

转载:欢迎转载,但未经作者同意,必须保留以下文字及链接;标识文章出处
作者:zsuil
出处:http://zsuil.com/?p=1900