架构师必须了解内核 -- 磁盘IO性能优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lingshengxueyuan/article/details/96421908

从read / write 到硬盘

当我们调用read/write时,在linux系统中这个过程是下图这样子的:

640?wx_fmt=jpeg


  • VFS虚拟文件系统,可以大致理解为 read / write / ioctl 之类的系统调用就在这一层。当调用 open 之后,内核会为每一个 file descriptor 创建一个 file_operations 结构体实例。这个结构体里包含了 open、write、seek 等的实例(回调函数)。这一层其实是 Linux 文件和设备体系的精华之一,很多东西都隐藏或暴露在这一层。不过本文不研究这一块

  • 文件系统 这一层是实际的文件系统实现层,向上隐藏了实现细节。当然,实际上除了文件系统之外,还包含其他的虚拟文件,包括设备节点、/proc 文件等等

  • buffer cache这就是本文所说的 “缓存”。后文再讲。

  • 设备驱动这是具体硬件设备的设备驱动了,比如 SSD 的读写驱动、磁盘的读写驱动、字符设备的读写驱动等等。

  • 硬件设备这没什么好讲的了,就是实际的硬件设备接口。

工作机制

当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从存储设备读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。
对于每个文件的第一个读请求,系统读入所请求的页面并读入紧随其后的少数几个页面(不少于一个页面,通常是三个页面),这时的预读称为同步预读。
如果应用程序接下来是顺序读取的话,那么文件 cache 命中,OS 会加大同步预读的范围,增强缓存效率,此时的预读被称为异步预读
如果接下来 cache 没命中,那么 OS 会继续使用同步预读。
那么如何优化磁盘IO的性能呢?
高性能硬盘I/O优化方案

基本思路

从缓存的工作机制来看,很简单,如果要充分利用 Linux 的文件缓存机制,那么最好的方法就是:每一个文件都尽可能地采用顺序读写,避免大量的 seek 调用。那么设计方法主要有:

尽可能地顺序读写一个文件

从文件缓存角度,如果频繁地随机读取一个文件不同的位置,很可能导致缓存命中率下降。那么 OS 就不得不频繁地往硬盘上预读,进一步导致硬盘利用率低下。所以在读写文件的时候,尽可能的只是简单写入或者简单读取文件,而不要使用 seek。
这条原则非常适用于 log 文件的写入:当写入 log 的时候,写就好了,不要经常翻回去查看以前的内容。例如kafka、rocketMQ都是这样的设计。

单进程读写硬盘

整个系统,最好只有一个进程进行磁盘的读写。而不是多个进程进行文件存取。这个思路,一方面和上一条 “顺序写” 原则的理由其实是一致的。当多个进程进行磁盘读写的时候,随机度瞬间飙升。特别是多个进程操作多个文件的时候,磁盘的磁头很可能需要频繁大范围地移动。
如果确实有必要多个进程分别读取多个不同文件的话,可以考虑下面的替代方案:

  • 这多个进程是否功能上是独立的?能不能分开放在几个不同的服务器之中?

  • 如果这几个进程确实需要放在同一台服务器上,那么能不能考虑为每个频繁读写的文件,单独分配一个磁盘?

  • 如果成本允许,并且文件大小不大的话,能否将磁盘更换为 SSD ?因为 SSD 没有磁头和磁盘的物理寻址动作,响应会快很多。

如果是多个进程同时写入一个文件(比如 log),那就更好办了。这种情况下,可以在这几个进程和文件中间加入一个内部文件服务器,将所有进程的存取文件需求汇总到该文件服务器中进行统一处理。


1
2
3
4
ProcessA   ProcessB   ProcessC
| | |
| V |
*----> The File <---*



改为


1
2
3
4
5
6
7
ProcessA   ProcessB   ProcessC
| | |
| V |
*----> ProcessD <---*
|
V
The File



顺便还可以在这个服务进程中实现一些自己的缓存机制,配合 Linux 自身的文件缓存进一步优化磁盘 I/O 效率。
尽量以4KB或者整数倍4KB读写文件
这是因为文件系统一般以4KB为一个页面

避免对大目录操作

目录在文件系统中,是以一个 inode 的方式存在的,那么载入目录,实际上就是载入这个 inode。从存储的角度,inode 也只是一个普通的文件,那么载入 inode 的动作和载入其他文件一样,也会经过文件缓存策略。载入了一次之后,只要你持续地访问它,那么操作系统就会将这个 inode 保持在缓存中。因此后续的操作,就是直接读写 RAM 了,并不会受到硬盘 I/O 瓶颈的影响。

把小文件的读写转换为大文件的写

随机磁盘IO很慢,如果是大量写入小文件,则读写性能都会较差;另外大量的inode也会占用大量的磁盘IO,寻址较慢,每次读写文件都需要两次转动磁头。那优化的思路就是把小文件转换成大文件。比如TFS。

# 后台


扩展阅读:

zero down-time update服务的方案

线程池的设计,一篇就够

饿了么全链路压测平台的实现与原理





展开阅读全文

架构师了解那些??

09-25

[b]一. 架构师?[/b]rnrn[size=13px]1.1 架构设计涉及范围图[/size]rn 如图所示架构设计说涉及到的范围,首先是对架构支撑的底层平台选择,目前业界流行和通用的就是.Net平台和Java平台(J2EE);然后在平台支持之上做技术相关架构设计(主要会采用面向对象OO,面向方面编程AOP以及面向服务架构设计SOA等思想),在SOA推广上IBM和SUN两家公司尤为突出;在业务不断的变化中、架构的更新中,找到变化中不变的东西,并针对服务、架构制定一系列规范对架构进行有效的管理和成为架构设计的原则;当然,最上层就是善变的业务架构层。rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/jiagou1.gif][/img][/align]rnrn[size=13px]1.2 一个优秀的架构师需要了解的知识[/size]rn1.操作系统OS:能对操作系统内核有很好的了解和认识,从中吸取设计理念;推荐可以找一个小的linux版本代码阅读内核的实现,去理解“简单”的代码怎样去完成不简单的事情 rn2.虚拟机技术:去了解虚拟机的实行原理和它所做的工作,如Java的JVM、和.Net的CLR, CLR提交到欧洲标志组织可以阅读文档ECMA-335-CLI rn3.计算机语言:一个好的架构师对计算机语言应该有深刻的认识,建议熟悉过程路径:C -> C++ -> C# ,Java rn4.开源资源:当然多研究开源架构是提高的必要途径,理解开源架构中设计的思想以什么样的设计思想为出发点,比较它们每个版本升级中的设计变化;资源:JBoss、Spring等Java开源框架,.net方面有5大实用案例架构、以及ASP.NET Starter Kit等,和MS:Enterprise library; rnrn JBOSS 4.0:包括web服务器(servlet/JSP容器,HTML服务器)、EJB2.0容器。完整的纯Java的数据库引擎,(Java消息服务)JMS,JavaMail,和Java事务处理API/Java事务处理服务(JTA/JTS)支持,但是他的面向方面设计(AOP)是它真正突出的部分。JBOSS的AOP架构负责处理AOP,使用了一组命名概念,比如"interceptor," "pointcut," 和“introduction”。一个interceptors编码“拦截器”(intercepts),它把一个对象放到一个被拦截的类中等。rnrn Spring是一个轻量级容器,非侵入式,ioc容器,它所带的包装器使许多不同的服务和框架更易于使用。轻量级容器接受任何JavaBean,而不是只接受特定类型的组件。要了解Spring同时就应该了解Eclipse、Struts、Hibernate之间的衔接应用 Spring: A Developer's Notebookrnrn ASP.NET Starter Kit: 是ASP.NET官方网站推出的一整套ASP.NET解决方案的Demo;是提供给ASP.NET初学入门者的教材!包括了门户、商业站点、社区站点、报表、时间跟踪排程、问题跟踪这6套系统。 在这里,随便也提一下WSS/SPS,具有微软官方支持,是成熟的产品,是通过Web Part扩展的,Web Part将会是ASP.NET发展的一个领域,使用Web Part进行页面的定制是更加人性化的,拖拉的所见即所得效果是Portal Start Kit无法达到了。WSS\SPS是扩展性非常好的系统平台,WSS\SPS的工作区可以无限向下添加,集成Office 2003、Exchange、Biztalk、Content Manager Server......而Portal Starter Kit仅仅是一个单纯的网站演示,虽然也能够布局定制,但仅此而已。rnrn[b]二. 还是需求[/b]rnrn 万水千山始于脚下,需求始终是一切的第一步!rnrn 从两种软件类型入手分别谈一谈,其中采集需求的方法和注意点rnrn[size=13px]2.1 企业信息化软件[/size]rnrn 企业信息化软件,及软件的最终用户是一个企业,企业希望通过软件项目的采购来达到企业内部管理等流程的信息化;采集这类需求通常有两种情况,其一:rn[b]2.1.1 甲方驱动[/b]rn 如ERP,甲方非常了解要他们需要一个什么样的软件,或者通过软件来达到一个什么样的效果。其中从甲方采集需求的采集点注意一下不能遗漏:rnrn中层领导:--> 从他们这采集业务的流程,因为他们是对甲方公司业务流程最熟练的 rn现场人员:--> 从他们这采集业务规则 rn高层领导:--> 这个很重要,从他们这采取决策规则,及可以让软件实现知识发现,即以后可成为软件的一个亮点即对公司决策的支持 rn信息人员:--> 操作规范,可以提供易用性 rn 乙方需要参加的人员:rnrn 架构师(实力所服,让对方放心),需求分析师,开放人员(实现需求的原型化),rnrn UI原型需求化:有三个好处, 需求固化、设计规则明确、开放复用rnrn[b]2.1.2 乙方强势论[/b]rnrn 由于甲方需求不明确,而乙方在此行业中资历深厚,了解行业标准,这种非常好做事就不多说了。rnrn[size=13px]2.2 需要采集中注意项[/size]rnrn1.需求采集的起点:rnrn找到所有执行者 rn找到组织机构 rn业务流程 rn2.需求管理, 这个是必不可少的;rnrn 需求稳定化,乙方提供需求详细规格说明书rnrn 同时,制定词汇表,如图rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/jiagou2.gif][/img][/align]rnrn3.掌握中间语言,及快速得了解行业规范rnrn[size=13px]2.3 商业化软件[/size]rnrn 需求采集为行业商用软件,要做到:rnrn收集行业中所有企业得需求rnrn行业规范,最好就是成为行业的领头人成为标准的制定者--> 业务原型rnrn同时要考虑到市场因素,以及竞争对手、市场亮点(有必要时可能采用保存亮点的方式)rnrn也要考虑环境因素,硬件、社会等rnrn[b]三. 领域分析[/b]rnrn 通过领域分析,获得领域模型;这节内容涉及到UML建模、建模流程、用例切片归包、DSL规范定义领域语言等等一些比较晕的内容!!rnrn领域模型: 切词(名词实体)rnrn 实体关系 -->类图 、E-Rrnrn 实体约束规则(要求精确度)rnrn其中涉及到工作流分析, 以及工作流所涉及到的技术,建议研究工作流: 其一,Vista平台的WWF,其二,开源框架OsWorkflow; 其下图有利于我们理解工作流设计:visual studio 2005中插件DSL支持rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/jiagou3.gif][/img][/align]rnrn[size=13px]3.1 最小建模技术[/size]rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/jiagou4.jpg][/img][/align]rnrn[b]四. 少不了的设计模式[/b]rnrn 具体的这个就不多说了,应该是不是的对设计模式进行温习、多阅读一些设计模式论文及应用场景实践。使用时注意考虑以下重要几点:rnrn[size=13px]4.1 设计模式应用场景[/size]rnrn 既是处理变化 --> 原构件基础上增加变化rnrn --> 替代构件rnrn[size=13px]4.2 设计模式的弱点[/size]rnrn 增加复杂度、 性能有损耗、 模式有可能选择不当、 装配不当、 增加测试难度rnrn[size=13px]4.3 面向对象开放技术今天的核心基础[/size]rnrn核心基础: 组件技术、 UML建模技术rnrn组件技术: 大型项目和系统的必经之路rnrn-》需要支持多平台:SOA、 ESB-连接组件rnrn-》拥有大量组件:重用、MDA(模型驱动开发)-快速、廉价组件rnrn-》响应日益复杂的业务操作rnrn-》框架: .net, Javarnrn[b]五. AOP面向方面编程[/b]rnrn 在架构设计中也要引用AOP设计思想,在整个架构设计过程中横切关注点来达到面向方面编程,现实框架某些功能的统一处理,减少重复。AOP强调通过面向方面的思维方式来进行有效的架构设计,所以AOP设计 ≠ AOP技术, AOP技术是面向方面设计AOP的最佳实现。开源AOP架构研究推荐: JBoss4.0rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/jiagou.gif][/img][/align]rn架构师进行架构设计,要心中有此轴向图从而做到不同纬度对架构进行充分的设计考虑。rnrn[b]六. 架构设计[/b]rnrn[size=13px]6.1 主要架构模式[/size]rnrn 流程处理模式: 以算法和数据结构为中心,由一系列处理步骤、相邻步骤用数据流管道连接。主要用于批处理系统软件rnrn、C/S模式、MVC模式、分层模式rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/wpayph1v.gif][/img][/align]rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/wplajexa.gif][/img][/align]rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/wpnxpg5h.gif][/img][/align]rnrn[align=center][img=http://images.cnblogs.com/cnblogs_com/witluo/wpfql325.gif][/img][/align]rnrn[b]七. SOA[/b]rnrn SOA(Service Oriented Architecture 服务导向架构),是一种应用程式架构的概念,将应用程式及资源以重复使用的服务方式呈现,使用标准化的借变相互沟通,借此提供更高弹性、更高效率、及资讯整合的IT环境。SOA是一种用于建构分散式系统的方法,它可以将应用程序以服务的方式提供给终端使用者,也能建构成其他的服务。透过SOA,我们可以将单一的软件开发成为可提供其他应用系统使用的基本元件。rnrn 要理解SOA,更重要的得研究ESB(Enterprise Service Bus)企业服务总线,请看另一篇文档的详细介:SOA-ESB企业服务总线概念; 这里就不熬述了rnrn______________________________________________________________________________________________________rnrn开源框架: rnASP.NET Commerce (CSVS) Installer v1.0.msirnASP.NET Community (CSVS) Installer v1.0.msirnASP.NET Portal (CSVS) Installer v1.0.msirnASP.NET Reports (CSVS) Installer v1.0.msirnASP.NET TimeTracker (CSVS) Installer v1.0.msirnEn_VsSDKApril2006.isornrn[b]The end[/b]: [color=#FF0000][size=12px]祝每位读者都能成为一位成功的架构师![/size][/color] 论坛

没有更多推荐了,返回首页