分享
 
 
 

Ubuntu 针对 SSD 的优化方案

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: |||超大  

Ubuntu 针对 SSD 的优化方案.

.

.

.

.

首先看下 LZ 的分区情况:

>$ sudo fdisk -lDisk /dev/sda: 120.0 GB, 120034123776 bytes255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x0001cbca Device Boot Start End Blocks Id System/dev/sda1 * 2048 206847 102400 83 linux/dev/sda2 206848 234438655 117115904 83 LinuxDisk /dev/sdb: 1000.2 GB, 1000204886016 bytes255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x000a1ddb Device Boot Start End Blocks Id System/dev/sdb1 2048 1922080767 961039360 83 Linux/dev/sdb2 1922082814 1953523711 15720449 5 ExtendedPartition 2 does not start on physical sector boundary./dev/sdb5 1922082816 1953523711 15720448 82 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(5).## <file system> <mount point> <type> <options> <dump> <pass># / was on /dev/sda2 during installationUUID=d9a9c636-a561-4b71-acc5-51d3204c75ba / ext4 noatime,discard,errors=remount-ro 0 1# /boot was on /dev/sda1 during installationUUID=1716571d-14c5-4d09-9e69-8c97d5543de1 /boot ext4 noatime,discard,defaults 0 2# /home was on /dev/sdb1 during installationUUID=aa94f45f-8dcb-45c8-bef4-c8adace32a3b /home ext4 defaults 0 2# swap was on /dev/sdb5 during installationUUID=d93e0ac2-c372-470c-9dd6-1e17a9242ee4 none swap sw 0 0tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0

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

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

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

discard 表示开启 TRIM 功能。

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

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

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

>$ uname -aLinux yuhuashi-Linux 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 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 8 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=1777)tmpfs on /var/tmp type tmpfs (rw,noatime,mode=1777)tmpfs on /var/log type tmpfs (rw,noatime,mode=1777)/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 分配在机械硬盘上的,设不设置都无所谓。

>$ suPassWord:># echo 1 > /proc/sys/vm/swappiness>#

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

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

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

>$ suPassword: # 查看当前的调度算法,下面被中括号选中的表示当前的调度算法># cat /sys/block/sda/queue/schedulernoop [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 -lDisk /dev/sda: 120.0 GB, 120034123776 bytes255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectorsUnits = 扇区 of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x0001cbca 设备 启动 起点 终点 块数 Id 系统/dev/sda1 * 2048 206847 102400 83 Linux/dev/sda2 206848 234438655 117115904 83 LinuxDisk /dev/sdb: 1000.2 GB, 1000204886016 bytes255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectorsUnits = 扇区 of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x000a1ddb 设备 启动 起点 终点 块数 Id 系统/dev/sdb1 2048 1922080767 961039360 83 Linux/dev/sdb2 1922082814 1953523711 15720449 5 扩展分区 2 未起始于物理扇区边界。/dev/sdb5 1922082816 1953523711 15720448 82 Linux 交换 / Solaris# 关闭 /boot 分区的文件系统日志,这个是针对分区的,所以要在每一个 SSD 分区上做。># tune2fs -O ^has_journal /dev/sda1 tune2fs 1.42.9 (4-Feb-2014)# 关闭 / 分区的文件系统日志># tune2fs -O ^has_journal /dev/sda2 tune2fs 1.42.9 (4-Feb-2014)# 运行文件系统检测,据说不运行可能会导致文件系统出错,LZ 没有亲自挑战过,所以还是乖乖的运行比较好。这个也是针对分区的,所以要在每一个关闭了文件系统日志的分区上做。># e2fsck -f /dev/sda1 e2fsck 1.42.9 (4-Feb-2014)第一步: 检查inode,块,和大小第二步: 检查目录结构第3步: 检查目录连接性Pass 4: Checking reference counts第5步: 检查簇概要信息/dev/sda1: 301/25688 files (1.0% non-contiguous), 38564/102400 blocks># e2fsck -f /dev/sda2 e2fsck 1.42.9 (4-Feb-2014)第一步: 检查inode,块,和大小第二步: 检查目录结构第3步: 检查目录连接性Pass 4: Checking reference counts第5步: 检查簇概要信息/dev/sda2: 182739/7323648 files (0.2% non-contiguous), 1599116/29278976 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调度算法

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有