BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)
前言
原创文章,转载引用务必注明链接。水平有限,欢迎指正。
本文使用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官方提供的用户手册一定要看,还是很有用的。
BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)的更多相关文章
- 网页性能优化之异步加载js文件
一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...
- Web前端性能优化——提高页面加载速度
前言: 在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒, ...
- 前端性能优化(四)——网页加载更快的N种方式
网站前端的用户体验,决定了用户是否想要继续使用网站以及网站的其他功能,网站的用户体验佳,可留住更多的用户.除此之外,前端优化得好,还可以为企业节约成本.那么我们应该如何对我们前端的页面进行性能优化呢? ...
- SPA应用性能优化(懒加载)
前提: 如今开发方式都是采用前后台分离的方式,前台采用的方式则是单页面应用开发简称SPA,这种开发模式最大的一个特点就是将有所代码打包成了一个文件, 这会导致了一个问题就是如果这个应用过大,打出来的这 ...
- hadoop进阶---hadoop性能优化(一)---hdfs空间不足的管理优化
Hadoop 空间不足,hive首先就会没法跑了,进度始终是0%. 将HDFS备份数降低 将默认的备份数3设置为2. 步骤:CDH–>HDFS–>配置–>搜索dfs.replicat ...
- 前端性能优化--图片懒加载(lazyload image)
话说前头: 上次写了一篇webpack的学习心得,webpack能做到提升前端的性能,其模块打包最终生成一个或少量的文件能够减少对服务端的请求.除此之外,本次的图片懒加载(当然不仅限于图片,还可以有视 ...
- requirejs:性能优化-及早并行加载
为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...
- Hibernate 性能优化之懒加载
针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载 1.在默认情况下,类就是执行懒加载 2. ...
- JS性能优化之怎么加载JS文件
IE8+等实行并行下载,各JS下载不受影响,但仍阻塞其他资源下载 如: 图片 所以首要规则就是:将JS放在body底部(推荐) 加载100kb的单个文件比4个25kb的文件快(减少外链文件数量)(脚本 ...
随机推荐
- 避免使用aireplay-ng指令时出现AP通道不对的方法
本方法搜集网络:具体使用为在调试网卡为监听模式,使用airodump-ng指令扫描wifi后,需要先执行"airmon-ng stop wlan0"指令,然后再进行一系列抓包等操作 ...
- 基础训练 Huffuman树
Huffuman树 /*解法一*/ #include<iostream> #include<queue> using namespace std; int main(){ pr ...
- 循环链表的C风格实现(单向)
头文件: #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_ typedef void CircleList; // typedef struct _tag_C ...
- eval() 函数 解析json对象
eval在js中用来运行以js源码组成的字符串. 可以用来改变全局或者局部变量,例如: var globalEval = eval; //定义全局eval函数别名 var a ='global', b ...
- C#显示相机实时画面
public partial class Form1 : Form { ICogAcqFifo mAcqFifo2;//定义一个相机对象 private ICogFrameGrabber mFrame ...
- Python 前端 Css基础
CSS样式存在的位置 1.放置在标签内,局部生效 <div style="color: red;font-size: 18px;">hello world</di ...
- python3--__repr_和__str__会返回字符串表达形式
__repr_和__str__会返回字符串表达形式 下一个例子是已经见过的init构造方法和add重载方法,本例也会定义返回实例的字符串表达形式的__repr__方法.字符串格式把self.data对 ...
- Leetcode 388.文件的最长绝对路径
文件的最长绝对路径 假设我们以下述方式将我们的文件系统抽象成一个字符串: 字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示: dir ...
- iOS学习笔记18-CoreData
一.CoreData介绍 CoreData是iOS5之后新出来的的一个框架, 是对SQLite进行一层封装升级后的一种数据持久化方式.它提供了对象<-->关系映射的功能,即能够将OC对象转 ...
- [luoguP3159] [CQOI2012]交换棋子(最小费用最大流)
传送门 好难的网络流啊,建图真的超难. 如果不告诉我是网络流的话,我估计就会写dfs了. 使用费用流解决本题,设点 $p[i][j]$ 的参与交换的次数上限为 $v[i][j]$ ,以下为建图方式: ...