分类 Linux 下的文章

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

阅读剩余部分 –

Linux I3窗口管理器调整优化

在Ubuntu用I3wm有相当一段时间了。开发配合Intellij和Vimium的话基本上很少需要用鼠标调整,对工作效率提升很大。昨天618项目刚上线,今天难得清闲又不想看书,就把I3给优化了一下。也顺带记录总结一下。

I3的安装很简单,执行sudo apt-get install i3然后登出,选择使用I3窗口管理重新登陆,就进入I3界面了. I3的文档写的很简单易懂,可以参考官方文档发掘更多适合个人的功能,也可以看一下快捷键说明快速入门一下,这里介绍一些我常用的操作.主要的快捷键盘有四个,掌握就入门。

常用技巧

入门操作与桌面移动

Mod+Enter 启动命令行
Mod+D 启动菜单,命令行模式,输入程序后在当前窗口运行
Mod+Shift+Q 退出当前程序
Mod+Shift+E 退出I3
I3有10个桌面,可以通过Mod(Win)加数字键0~9进行切换,切换非常方便,合理分配好桌面用途,效率会提升很多.

窗口移动与窗口拆分

使用Mod键加J(左)K(上)L(下):(右)可以在窗口间移动,如果是多屏显示器,窗口的移动可以跨越桌面的(A屏幕的最后一个窗口衔接B屏幕的第一个窗口)

窗口布局有三种模式,可以使用Mod + E,S,W快速试一下,就能明白.

使用Mod + F全屏化,效果很不错,某些时段专注某件时的时候可以开启.

Mod + V垂直或Mod + H水平排列子窗口,对于某些用于监控,不需要太多操作的桌面,可以使用,效果如下:

i3_layout

浮动窗口及大小调整

阅读全文

Java 8与Linux OOM killer

由于想体验新版的Lambda和Stream API,把服务器上的JRE换成了Java 8.而之后网站偶尔出现无法访问,java进程莫名奇妙地退出。怀疑是虚拟机内存溢出,但tomcat与应用的日志都没有崩溃的相关日志输出。

经过几次在线监控,发现java进程占用超过系统50%的内存。首先,网站应该占用不了这么多的内存,虽然我没有用-Xmx指定heap内存大小,但按规范,默认应该分配是物理内存的1/4。其它的Permgen区域,也应该无法使用这么多的内存。

这点我先放了放。猜测linux会不会自动杀死占用内存过多的进程? (没有太多的linux维护经验,也没有系统的学习过linux)。 结果在linux syslog中发现了这段。

#oom killer
kernel: java invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

按关键字google一下,查到了linux的oom-killer机制:linux会在内存紧张时,杀死占用太多内存的进程,以保证系统正常运行。

查到这个原因后便开始分析内存使用的情况。
由于是在linux上,惯手的内存工具缺失,jmap运行很久也拿不到内存dump(吐个嘲先,我用jmap导出内存dump,一个多小时都没有导出来,而且期间jvm会处于假死状态,网站无法访问)。 就打算用jstat来看下各个段的大致使用情况(主要使用jstat -gcutil/jstat -gccapacity/jmap -heap)。

发现Permgen段使用量为97%,而且已经使用了120多M了 (其实当时jstat中的标记是M:指代Java8中的Metaspace,而Permgen标记应该为P,这犯了个傻,误认为是PermGen了)
阅读全文