.

.

.

.

.

首先看下 LZ 的分区情况:

>$ sudo fdisk -l

Disk /dev/sda: 120.0 GB,  bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x0001cbca Device Boot Start End Blocks Id System
/dev/sda1 * Linux
/dev/sda2 Linux Disk /dev/sdb: 1000.2 GB, bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a1ddb Device Boot Start End Blocks Id System
/dev/sdb1 Linux
/dev/sdb2 Extended
Partition does not start on physical sector boundary.
/dev/sdb5 Linux swap / Solaris

两块硬盘,/dev/sda 是固态硬盘,/dev/sdb 是机械硬盘,所以这里只针对 /dev/sda 进行优化。

/dev/sda1 是 /boot 分区,/dev/sda2 是 / 分区。

1.针对 /etc/fstab 的优化配置

>$ sudo vim /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab().
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=d9a9c636-a561-4b71-acc5-51d3204c75ba / ext4 noatime,discard,errors=remount-ro
# /boot was on /dev/sda1 during installation
UUID=1716571d-14c5-4d09-9e69-8c97d5543de1 /boot ext4 noatime,discard,defaults
# /home was on /dev/sdb1 during installation
UUID=aa94f45f-8dcb-45c8-bef4-c8adace32a3b /home ext4 defaults
# swap was on /dev/sdb5 during installation
UUID=d93e0ac2-c372-470c-9dd6-1e17a9242ee4 none swap sw
tmpfs /tmp tmpfs defaults,noatime,mode=
tmpfs /var/tmp tmpfs defaults,noatime,mode=
tmpfs /var/log tmpfs defaults,noatime,mode=

上面红色和加粗的部分是 LZ 手工添加进去的,下面 LZ 详细解释一下手工添加的部分的含义。

noatime 表示访问文件时不更新文件访问时间,这样可以减少对磁盘的写入动作。

Linux 文件系统中有三种时间,想要详细了解可以查阅 LZ 的博文《(三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录》。

discard 表示开启 TRIM 功能。

TRIM 的作用主要有两个:1 提高硬盘写入效率;2 根据平均写入算法提高 SSD 寿命。

具体原理各位自行查找资料吧。

Linux 内核从 2.6.33 开始支持 TRIM 指令,所以首先查看内核版本以确定操作系统是否支持 TRIM:

>$ uname -a
Linux yuhuashi-Linux 3.13.--generic #-Ubuntu SMP Thu Apr :: UTC x86_64 x86_64 x86_64 GNU/Linux
>$

LZ 的内核版本是 3.13.0,所以是支持 TRIM 的。

接下来检查 SSD 是否支持 TRIM,虽然现在绝大多数 SSD 都支持 TRIM,但是也并非所有的 SSD 都支持。

$ sudo hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit blocks)
$>

显示类似这个信息的表示支持,不同的 SSD 显示的提示可能不一样。

当然,上面这两个配置是没有依赖关系的,所以先配置谁或仅配置谁都是可以的。

文件的最后将 /tmp、/var/tmp 和 /var/log 三个目录挂载到内存上了,这样做有两个目的:

1)利用内存来加速:内存的速度比硬盘的速度快得多,将这种频繁读写的目录挂载到内存中可以大大提高它们的读写速度。

2)减少对 SSD 的写入次数:因为这种临时目录通常都会保存很多小文件,而且读写频繁,为了提高 SSD 的寿命,把它们挂载到内存中。

注意:上面的 /var/log 目录是系统日志所在的目录,如果挂载到内存中将意味着关机之后这些日志全部都会丢失!当然,对于个人来说通常历史系统日志是没什么用的,所以 LZ 把它们也挂载到内存中了。

下面检查一下上面的配置是否生效:

>$ sudo mount -oremount /dev/sda1
>$ mount -l
/dev/sda2 on / type ext4 (rw,noatime,discard,errors=remount-ro)
tmpfs on /tmp type tmpfs (rw,noatime,mode=)
tmpfs on /var/tmp type tmpfs (rw,noatime,mode=)
tmpfs on /var/log type tmpfs (rw,noatime,mode=)
/dev/sda1 on /boot type ext4 (rw,noatime,discard)
/dev/sdb1 on /home type ext4 (rw)
>$

可以看到,/dev/sda1 和 /dev/sda2 已经有 noatime 和 discard 挂载属性了;并且 /tmp、/var/tmp 和 /var/log 也已经被挂载为 tmpfs 了。这说明我们上面的配置成功了。

2.减少 SWAP 换出量

LZ 分配了很大的 SWAP,但在实际使用中发现 SWAP 空间实际使用得很少,而且 LZ 从来不使用休眠功能,所以不分配或少分配 SWAP 也是可以的。

当然前提是你的内存足以满足你日常的使用,LZ 是 8GB 内存。

LZ 的 SWAP 是分配在机械硬盘上的,由于平时 SWAP 用得少所以速度慢点也无所谓。

其实这一步通常仅适用于把 SWAP 分配在 SSD 上的童鞋,像 LZ 这种把 SWAP 分配在机械硬盘上的,设不设置都无所谓。

>$ su
Password:
># echo > /proc/sys/vm/swappiness
>#

0 到 100 之间,值越大换出量越大。

3.使用 noop I/O 调度算法

noop 相当于实现了一个最简单的 FIFO 队列,由于 SSD 不需要像机械硬盘一样寻址,所以采用最简单的调度算法也能相应的提高效率。

>$ su
Password:
# 查看当前的调度算法,下面被中括号选中的表示当前的调度算法
># cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
# 修改调度算法再重新查看
># echo noop > /sys/block/sda/queue/scheduler
># cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
# LZ 发现这种方式只能临时设置,下次重启又变回去了,所以需要修改系统启动脚本
># vim /etc/rc.local
# 在最下面(exit 0 的上面) 添加这句,保存退出,可重启后用上面的 cat(1) 指令验证
echo noop > /sys/block/sda/queue/scheduler
>#

4.关闭 EXT4 日志功能

把这步放在最后是因为需要进入 LiveCD 才能做,所以装完系统之后首次进入系统还是先把其它的优化工作做完吧,不然先做这步的话一会儿还要再重启一次再做前面的优化。

关闭文件系统日志是为了减少 I/O 操作对 SSD 的写入次数,从而提高 SSD 的寿命。

但是,关闭文件系统的日志更容易导致文件系统的损坏,比如发生突然断电的情况等。不过 LZ 使用的是笔记本电脑,不怕突然断电哈。为了提高 SSD 的寿命,还是值得一试的。

1)重启进入 LiveCD。

2)在 shell 中执行命令:

# 修改 root 密码,因为命令要在 root 下运行,所以需要先取得 LiveCD 的 root 权限。
>$ sudo passwd root
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码
>$ su
密码: # 查看分区的设备文件,还好设备文件名与在系统中查看的是一样的,这样大家就不用费力气的重新对照了。
># fdisk -l Disk /dev/sda: 120.0 GB, bytes
heads, sectors/track, cylinders, total sectors
Units = 扇区 of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x0001cbca 设备 启动 起点 终点 块数 Id 系统
/dev/sda1 * Linux
/dev/sda2 Linux Disk /dev/sdb: 1000.2 GB, bytes
heads, sectors/track, cylinders, total sectors
Units = 扇区 of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000a1ddb 设备 启动 起点 终点 块数 Id 系统
/dev/sdb1 Linux
/dev/sdb2 扩展
分区 未起始于物理扇区边界。
/dev/sdb5 Linux 交换 / Solaris # 关闭 /boot 分区的文件系统日志,这个是针对分区的,所以要在每一个 SSD 分区上做。
># tune2fs -O ^has_journal /dev/sda1
tune2fs 1.42. (-Feb-)
# 关闭 / 分区的文件系统日志
># tune2fs -O ^has_journal /dev/sda2
tune2fs 1.42. (-Feb-)
# 运行文件系统检测,据说不运行可能会导致文件系统出错,LZ 没有亲自挑战过,所以还是乖乖的运行比较好。这个也是针对分区的,所以要在每一个关闭了文件系统日志的分区上做。
># e2fsck -f /dev/sda1
e2fsck 1.42. (-Feb-)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass : Checking reference counts
第5步: 检查簇概要信息
/dev/sda1: / files (1.0% non-contiguous), / blocks
># e2fsck -f /dev/sda2
e2fsck 1.42. (-Feb-)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass : Checking reference counts
第5步: 检查簇概要信息
/dev/sda2: / files (0.2% non-contiguous), / blocks
# 在 LiveCD 上面的工作就做完了,重启进入系统
># reboot
>#

由于上面的内容比较多,所以 LZ 把需要手工执行的命令用红色加粗标记出来了。

3)重启进入系统之后,验证一下是否成功了:

>$ dmesg | grep EXT4
[ 3.787513] EXT4-fs (sda2): mounted filesystem without journal. Opts: (null)
[ 4.194035] EXT4-fs (sda2): re-mounted. Opts: discard,errors=remount-ro
[ 4.362051] EXT4-fs (sda1): mounted filesystem without journal. Opts: discard
[ 4.382329] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)
>$

出现了类似上面加粗字体的提示表示配置成功了,如果出现了上面蓝色字体的内容就说明没有生效。当然对于 LZ 来说配置是生效了的,因为 LZ 仅关闭了 sda1 和 sda2 的文件系统日志。sdb1 本来就不是固态硬盘,LZ 根本没有关闭它的文件系统日志。

参考文献:

1. Ubuntu系统SSD硬盘优化全记录

2. SSD的TRIM功能有什么作用?

3. 小结一下linux 2.6内核的四种IO调度算法

Ubuntu 针对 SSD 的优化方案的更多相关文章

  1. hbase 学习(十四)Facebook针对hbase的优化方案分析

    使用hbase的目的是为了海量数据的随机读写,但是在实际使用中却发现针对随机读的优化和gc是一个很大的问题,而且hbase的数据是存储在Hdfs,而Hdfs是面向流失数据访问进行设计的,就难免带来效率 ...

  2. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  3. MySQL 大表优化方案探讨

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  4. MySQL大表优化方案

    转:https://segmentfault.com/a/1190000006158186?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sour ...

  5. MySQL 大表优化方案

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  6. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  7. MySQL 大表优化方案(长文)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  8. [转帖] 数据库用优化方案 https://segmentfault.com/a/1190000006158186

    Mysql大表优化方案     当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部 ...

  9. MySQL大表优化方案 Mysql的row_format(fixed与dynamic)

    转自:https://mp.weixin.qq.com/s/VY69wWlrVLjRtKU7ULrYGw 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除 ...

随机推荐

  1. [vijos P1880]ファーラの力

    据说这是一道 JOI 的题?反正我觉着挺好的喵~ 题目看起来十分可怕,但是代码还是很短的 显而易见的,ans 因分为3个部分:1.中途增加光压的时间 2.中途减少光压的时间 3. 所有路程的总时间 发 ...

  2. 黑马程序员——JAVA基础之正则表达式,网络爬虫

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式: 概念:用于操作字符串的符合一定规则的表达式 特点:用于一些特定的符号来表示一些代码 ...

  3. Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...

  4. maven docker 操作

    1. 使用dokerfile 进行构建 创建dockerfile 2. maven 插件 <plugin> <groupId>com.spotify</groupId&g ...

  5. Ubuntu14.04搭建Caffe(仅CPU)

    一直以来都没有写博客的习惯,后来发现以前做的工作如果不注意及时整理和记录往往丢失的很快.对我而言这是一篇具有重要意义的文章,好的习惯要持之以恒,以后的日子我会常驻博客园!由于本人水平有限,智商略低,欢 ...

  6. angular+bootstrap+MVC--之一,入门

    这篇直奔MVVM主题,本例实现一个bootstrap的下拉框. 展示了如下技术: 1.MVVM绑定(事件绑定,值绑定,循环绑定,循环绑定中嵌套事件并回传item), 2.angul多module, 建 ...

  7. ios uiwebview 上几个技巧

    以下内容转自 CrespoXiao的微博 分享个tips,阅读类app内容加载一般是本地存几个html框架,接口传body过来就行了,目的是节省流量.但是loadHTMLString在内容多尤其是图片 ...

  8. Unity3D使用Assetbundle打包加载(Prefab、场景)

    之前有一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity游戏开发使用Assetbundle加载场景的原理 本篇文章我们将说说assetbund ...

  9. bootstrap-巨幕、缩略图、警告框

    巨幕: <div class="jumbotron"> <div class="container"> <h1>W3Scho ...

  10. 预处理语句--#define、#error和#warning

    1.#define语句 我们经常会这样定义一些宏:       #define BLOCK 8192 但这样的宏却不能在字符串中展开,如:    printf("The BLOCK numb ...