Linux存储系列 个人学习笔记一
目录
Linux存储学习--学习范围及相关框架介绍
Linux存储学习--前言
个人之前项目有做过一些手机,平板存储模块及性能优化相关的工作,断断续续写过一些总结文档,由于公司项目保密协议相关要求,文档也只在内部进行了分享。目前基于以下几点做一个笔记和总结:
1.个人申明:本人申明的博客内容会严格遵守相关公司的保密协议,相关技术内容都是来源于互联网的并结合本人理解进行记录,如果有涉及到隐私和侵权的之处请及时联系本人进行删除。
2. 抛砖引玉:Linux的各技术领域大神众多,本人属于新手边学习边总结,文中难免有错误和疑问的地方,希望路过大神帮忙指点和指正。
3. 萌新入坑:存储对于操作系统来说是一个相对宽泛,内容涉及也比较多的模块,对于刚入门的师弟们往往有点迷失方向,希望该系列笔记能有一点引导作用。
Linux存储学习-- 学习范围及相关框架介绍
存储范围:不同公司,项目对存储模块的划分不同,相应存储模块开发工程师需要解决问题的范围也不同,简单说下个人之前遇到的划分:
1. 存储固件升级 :包括各厂家主要是三星samsung,SK海力士hynix ,美光Micron等EMMC/UFS固件的本地工具升级及在线OTA。 这部分工作量和难度不大,但需要非常谨慎,毕竟固件升级失败对用户的影响的范围很大。
主要的工作任务也就是固件升级的流程代码的相关移植,适配,不同平台的归一化处理,本地OTA升级/降级压测等。也没遇到特别难搞的问题,另外需要主要不同厂家的固件检测和升级时间点不同,有的bootloader启动时候检测升级,有的平台是
必须要通过OTA进行固件升级。
2.UFS/EMMC/T卡/memory外设:UFS/EMMC/T卡/memory 属于典型的外围块设备,通过外设总线适配器进行枚举挂载。其中UFS有一套协议,自身硬件接口MIPI协议也比较复杂,EMMC/T卡对应硬件接口和相关协议类似,所以有些平台EMMC/T卡的代码是耦合在一起的,增加复杂度,修改代码的时候特别要注意兼容。
上面说到的UFS/EMMC/T卡都是基于flash的存储设备,更多来自于嵌入式设备,但真正学习的过程中发现,其中的很多概念,专业术语和PC X86上的概念是重合的,如果不区分开来,很容易迷糊,而且对比之后能更好的加深理解和记忆。比如:
什么是扇区,块,磁道,磁面? 什么是SSD,HDD,HHD?硬盘接口协议IDE, PATA, ATA, SATA, SAS, SCSI,PCIe, FC区别? GPT和MBR区别? 什么是flash中的SLC,MLC,TLC有什么区别?什么是逻辑卷? 存储硬件的发展历史非常久远了,衍生出来的协议和概念非常之多,如果没有相关的硬件基础的积累,很难真正去读懂,理解相关驱动代码,而且后面要说的文件系统也是基于这些基础概念。
外围存储器件涉及到的工作是相对比多也是比较杂的。linux官方,器件厂家及平台厂家都会不定期对UFS进行相关补丁升级,另外UFS/EMMC的休眠唤醒经常出现功耗问题。另外很多器件的稳定性也会导致不少稳定性相关问题。
3. 文件系统:手机中常见文件系统如基于外存(flash,磁盘等)的ext4, f2fs, sdcardfs及基于内存的proc, sysfs, tmpfs 以及用户态文件系统。
4. IO性能:包括IO数据读写的速度,数量,效率。
4.1 现在流行的安兔兔跑分,可以直观反映系统 顺序/随机读写的速度。影响这个的方面非常多,需要排查各类系统优化方案。包括通过systrace排查各CPU限频设置,UFS读写相关的配置。
比如UFS的HPB,TW,日志文件系统的nobarrier,order, writeback配置对应IO的相关读写速度影响较大。另外IO的调度器及调度方式也会有影响,以及IO落盘的方式:同步或异步也会有影响。
4.2 系统在IO性能统计方面主要是pgpgin|pgpgout|pswpin|pswpout, 内存和磁盘及交换分区的数据交换会产生数据IO读写,特别是系统低内存场景,回收匿名内存页还是文件页会通过系统swappiness配置值的进行调整。对应使用了ZRAM技术的
系统更倾向于回收匿名页,毕竟文件页回收会增加IO负担,再次读写文件时也相对更耗时。系统自身的IO统计数据,但是如何进一步统计分析各进程的IO数据及IO系统中的overhead耗时和payload耗时 需要引入更多的埋点。
4.3 overhead包括用户层,文件系统层,调度器层,驱动层的调度,蓄流/泄流IO合并等流程的耗时,payload主要是统计驱动层到硬件层之间的耗时。该统计能进一步定位整个IO子系统的效率优化点,特别对应iowait的来源及判断器件层的IO效率有很大的参考意义。
5. memory: memory包括memory硬件DDR及系统的memory配置及优化,包括:系统开机内存大小,系统动态运行内存健康,系统内存泄漏,内存申请回收,内存查杀,内存规整,LMKD内存查杀方案等。 内存配置优化这块修改和方案非常多,当时也是在解决整机性能问题的时候移植了大佬的一些方案类似ZRAM。内存这块的水比较深,存储和内存相关,但是内存优化这块需要进一步拆分。
架构相关:
UFS协议框架:
EMMC/T/MMC演化过程:
EXT4文件系统磁盘布局:
F2FS文件系统布局:
Linux IO 框架:
Linux存储学习--相关知识点拓展
1. Linux内核存储相关重要数据结构记录:
链表,双向链表
红黑树,B+树,目录索引,目录hash
双向链表
2.工作队列,散队列
3.DMA传输