前言
原创文章,转载引用务必注明链接。水平有限,欢迎指正。
本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文:
http://www.omoikane.cn/2016/09/15/bbb_adv_settings/
系统环境:Windows 7 Home Pentium x64|Deepin Linux 15.2 x64;Debian 8.5 On BBB Industrial
关于板载eMMC存储
关于eMMC存储的基本知识可以看我之前的文章《板载eMMC初探》,总而言之就是:
- eMMC读写速度比一般的MicroSD卡快很多
- eMMC有擦写寿命,难于更换,所以如何延长其使用寿命值得重视
- eMMC|NAND存储,SLC|MLC|TLC区别
- trim功能
大触的文章里提到这么一句:
大的这颗镁光(Micron) IC 是 eMMC ,型号为 MTFC2GMVEA-0M WT ,为了控制成本只给了 2GB ,可以说聊胜于无(还不如多给个 TF 卡槽)。这玩意标称的速度为连续读取 30MB/s ,连续写入 6.6MB/s ,在 2GB 的 MLC NAND 中算是很不错的了。另外需要注意的是这片 eMMC 的界面版本是 MMC 4.41 ,而在 MMC 4.5 之前 discard 的行为和 ATA 的 TRIM 不一样,会强制擦除,所以,千万不要试图在 Beaglebone 上开 discard / TRIM ,如果开了闪存可能会很快耗尽擦写寿命。
那么问题来了,我们要确定BBB Industrial板载eMMC存储的型号,界面版本。
如何确定eMMC型号
一般IC上都有型号码,直接去厂商官网一搜就行了,比如海力士那种。而Micron镁光一般只有简单的标号,好在BBB是开源硬件,有物料清单(Bill of Material, BOM)提供下载,可以很清楚地看到使用型号,然后去镁光官网搜索。而BBB Industrial暂时没有提供具体的BOM,但是在其用户手册中第55页提到:
The device used is one of two different devices:
• Micron MTFC4GLDEA 0M WT
• Kingston KE4CN2H5A-A58The package is a 153 ball WFBGA device on both devices.
然而我们仔细看两者的eMMC IC:
原版BBB是JW896,BBB Industrial是JWA58,从 https://www.elnec.com 查询可知,前者是WFBGA153,后者是VFBGA153封装,而MTFC2GMVEA-0M WT(2G)和MTFC4GLDEA 0M WT(4G)都是采用WFBGA153封装,怀疑是手册没有及时更新。
【ELNEC网站】如图所示,该网站可以查到很多设备的编号规则,例如镁光结尾WT代表工作温度-25°C to 85°C,IT代表-40°C to 85°C。
我们在镁光官网可以查到JWA58的手册,注意需要注册micron后才能下载;MTFC2GMVEA-0M系列的手册
可以清楚地看到JWA58支持eMMC界面4.51版本,JW896仅支持4.41版本。
eMMC界面版本4.4x到4.5x变化很大吗?!
是的,eMMC 4.5x相比eMMC 4.41而言有很重要的改动:
eMMC 4.5 further defines a "discard" sub-operation that more closely matches ATA TRIM in that the contents of discarded blocks can be considered indeterminate.(wiki)
原版BBB板载JW896 eMMC (2G、4G)的界面版本是4.41,而在MMC 4.5之前discard的行为和ATA的TRIM不一样,会强制擦除,所以在4.5之前开启discard/TRIM,闪存可能会很快耗尽擦写寿命,这也就是为什么大触讲到不要开启discard / TRIM。
什么是TRIM以及开启TRIM之后有什么好处?
系统删除文件的机制是把这个文件标记为已删除,而不是真的把这个文件从硬盘上抹除。由于闪存(NAND)的文件删除机制与机械磁盘(Disk)有区别,这对于传统的硬盘这类使用磁记录的没有影响,传统硬盘可以直接用磁头覆盖写入而不用考虑盘面上已经有了什么记录。但对于固态硬盘这类使用存储芯片的就不行了,所以TRIM技术可以在设备空闲时自动抹除记录,使得写入数据的时候能直接写入,而不是等到要写入的时候再去临场操作抹除数据,使得长时间使用后写入速度不会大幅下降。所以我们可以说,TRIM技术保证速度不下跌的真正秘密是:把将来要做的事提前做掉了。但是这件事迟早要做,所以基本不会影响SSD原有的写入次数(寿命)。
这里提供了一些我搜集来的资料:
—— 链接:http://pan.baidu.com/s/1c0QBcas 密码:dovc ——
内容包括eMMC性能优化指南,eMMC 4.41和4.5差异介绍。
优化eMMC性能
可以参看我之前的文章《优化Guitar性能,延长eMMC寿命》,原理在那边讲过了,不再赘述。
更改系统I/O调度(安全)
I/O调度算法简单理解就是读写顺序。试想十字路口在车流量大的时候没有一个交警,那交通状况肯定好不了。Linux I/O调度有四种,分别是CFQ(Completely Fair Queuing, 完全公平排队)、NOOP(电梯式调度程序,最适合NAND存储设备)、Deadline(截止时间调度程序)、AS(预料I/O调度程序)。通过以下命令可以查看系统支持以及当前所使用的算法:
dmesg | grep scheduler
cat /sys/block/mmcblk0/queue/scheduler
【BBB Industrial I/O支持】可见支持noop、deadline、cfq三种算法,默认cfq。
Debian Jessie使用systemd接管系统启动,这里我们创建一个服务设置noop为默认模式并开机启动:
nano /etc/systemd/system/io-scheduler.service # 创建一个系统服务
输入以下内容:
[Unit]
Description=I/O Scheduler Setter
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c ‘echo noop > /sys/block/mmcblk0/queue/scheduler’
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Ctrl+O保存,Ctrl+X退出。测试并设置开机启动:
#增加可执行权限
chmod 755 /etc/systemd/system/io-scheduler.service
#设置开机启动
systemctl enable io-scheduler.service
#启动服务
systemctl start io-scheduler.service
#查看服务状态,显示active (exited)表示启动成功
systemctl status io-scheduler.service
重启之后可以看到I/O调度算法已经设置为NOOP。
使用fstrim(安全)
略过,参考原文
延长eMMC寿命
关闭ext4日志功能,禁用时间戳记录(可选)
这个其实就相当于牺牲突发情况下的安全性换取性能和减少eMMC擦写,适合搭建Web服务器等情况,前面的文档也有对比,显示使用ext4+禁用日志+discard之后,eMMC性能表现非常优秀。
但是我们这里保守一下,不关闭文件系统日志,仅启用WriteBack模式(参考Armbian Project的写法):
更改/etc/fstab
文件内容如下:
root@beaglebone:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
UUID=a3d27d61-33ba-475e-a334-4dacedc191a2 / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
root@beaglebone:~# ls -al /dev/disk/by-uuid/a3d27d61-33ba-475e-a334-4dacedc191a2
lrwxrwxrwx 1 root root 15 Sep 15 21:52 /dev/disk/by-uuid/a3d27d61-33ba-475e-a334-4dacedc191a2 -> ../../mmcblk0p1
root@beaglebone:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 10M 0 10M 0% /dev
tmpfs tmpfs 99M 8.4M 91M 9% /run
/dev/mmcblk0p1 ext4 3.5G 3.2G 165M 96% /
tmpfs tmpfs 247M 4.0K 247M 1% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 247M 0 247M 0% /sys/fs/cgroup
tmpfs tmpfs 50M 0 50M 0% /run/user/1000
后面俩命令指示看一下那个uuid是谁的,果然是挂载为根目录的mmcblk0p1。
使用RAMlog将系统日志移到内存中(可选)
相信很多人都记得将某些读写频繁的目录挂载为tmpfs,其实日常使用过程中最频繁的就是系统日志文件了(注意系统日志和文件系统日志的区别)。我们通过RAMlog将日志文件放到内存里,可以设置定时清理,从而减少eMMC擦写,具体参考我的又一篇文章使用RAMlog减少eMMC读写,延长使用寿命。
总结
使用hdparm -t /dev/mmcblk0
命令可以看到板载eMMC的读取速度大约30 MB/s,还算理想。之前一直以为BBB Industrial也是使用4.41的eMMC,这次看了一下发现不是那么回事,希望后面Embest能释出BOM文件。对比一下会发现原版BBB和BBB Industrial之间用料有很多不同,另外e14官方提供的用户手册一定要看,还是很有用的。