分类 开发工具 下的文章

SSD在Linux平台的使用优化

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高度器在更多场景下的选择可以参考这里这里

阅读剩余部分 –

搭建HG/Mercurial服务

公司的HG仓库在北京,每次代码的Push和Pull都非常慢,于是在Dev服务器启动一个HG服务做为境像,并由Jenkins完成与北京仓库的定时/手动同步。

 

代理仓库服务器配置

配置仓库,编辑.hg/hgrc文件,增加以下配置

#关闭ssl认证
[web]
push_ssl = false

#配置该仓库提交时用户名
[ui]
username = CD Mirror

[trusted]
users = <用户>

在仓库目录下,使用HG命令启动仓库服务

sudo hg --config web.allow_push=* serve -p 81

其中 -p是端口,–config web.allow_push=*是指允许所有用户向该仓库push代码
阅读全文