引用
本帖最后由 happy_fish100 于 2011-05-01 17:46 编辑
目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。FastDFS最初的实现,文件是按hash方式随机分布到多个目录中的,后来增加了顺序存放的做法。通过对比测试,发现文件按目录顺序存储,写文件IO效率明显高于按目录随机存储。
目前磁盘顺序读取的速度并不差,比如普通硬盘的IO可以达到每秒40~60MB,好一些的硬盘可以达到每秒100MB。在多进程或多线程并发读取磁盘的情况下,随着并发数的增加,磁盘IO效率将大大下降。主要是因为每次读写,磁道可能存在较大的偏移,磁道寻址时间加大,导致磁盘IO性能急剧下降。对于这种场景,优化方案是尽可能减少并发读写的进程数或线程数。可以用锁的机制,也可以采用专门的磁盘IO线程来对磁盘进行读写。FastDFS 2.x版本,磁盘读写就采用了专门的线程来完成。
为了充分发挥多块磁盘的效率,不建议使用传统的RAID方式。比较好的做法是每块磁盘单独mount,通过程序来控制对多块磁盘进行并发读写。采用单盘mount,文件的备份和冗余可以通过多台机器实现。
文件数多了之后,比如达到上千万个文件,当随机访问众多文件时,文件系统的性能会急剧下降。业界流行的做法是将多个小文件合并存储到一个大文件中的方式来降低文件数。FastDFS 3.0支持将多个小文件合并存储到一个较大文件中,目前开发进展比较顺利,预计5月份可以发布。
提升磁盘IO的另外一个技巧,一次尽可能多写入或多读取。也就是说,将程序的读写buffer设置得尽可能大一些。例如日志或者redo log的写入,不是每次调用都直接写磁盘,而是先缓存到内存中,等buffer满了再写入磁盘,也可以定时写入磁盘。
操作系统和C库函数通常会对写入的文件内容做缓存,以减少实际写文件的次数。直接调用系统函数fsync或C函数fflush将使系统的缓存机制失效,此时将强制把内容刷到磁盘上。除非必需,否则不要执行强制刷盘操作。
注:如果没有特别说明,文中说的磁盘指的是硬盘。
分享到:
相关推荐
首先,"显示进程的磁盘IO操作"通常涉及到以下几个知识点: 1. **磁盘读写**:这是计算机系统中进程与存储设备交互的基本方式,读取数据是获取存储在硬盘上的信息,写入数据则是保存新产生的或修改过的数据。进程的...
如果%wio超过35%,则可能需要进一步调查IO性能问题。 解决IO问题的方法包括但不限于: 1. 联系操作系统技术支持,如在HP-UX上优化卷组的条带化设置。 2. 分析Oracle中的SQL语句,找出执行效率低下的查询并进行优化...
综上所述,优化VMware ESXi的性能,尤其是提升IOPS,需要综合考虑硬件配置、软件设置、资源分配以及监控与策略调整等多个方面。通过学习和实践这些技巧,可以确保VMware环境在处理高负载任务时保持高效稳定。
IO调度优化通常涉及以下几个方面: 1. **选择合适的调度器**:根据工作负载特性选择最合适的调度策略,例如,数据库服务器可能更适合使用CFQ,而Web服务器可能更适合Noop。 2. **配置调度参数**:内核提供了一些...
对于大文件,使用内存映射(Memory Mapping)可以提高IO性能,避免频繁磁盘读写。 5. **代码编译加速**:Cython允许将Python代码转换为C,提高运行速度。Numba则通过即时编译提升Python代码性能,特别适用于数学和...
总的来说,创建硬盘文件索引是一项涉及文件系统底层知识和高性能编程技巧的任务。通过掌握C#与NTFS交互的方法,结合适当的数据结构和算法,我们可以构建出一个高效且实用的全盘文件索引系统。这不仅有助于快速定位...
高性能UDP服务端设计的关键在于以下几个方面: 1. **多线程与异步操作**:为了处理大量并发连接,服务端通常会采用多线程或者异步IO模型(如.NET Framework中的`async/await`关键字)。这能确保每个客户端请求都能...
成本主要包括以下几个方面: - **IO成本**:磁盘读写操作通常是所有数据库操作中最耗时的部分,尤其是在大数据量情况下。因此,传统的优化器设计更多关注于减少IO操作次数。 - **CPU成本**:虽然现代服务器通常拥有...
设计一个基于Openpower平台的PCIe Gen3 IO扩展箱,需要考虑以下几个关键点: 1. **兼容性**:确保扩展箱与Openpower平台的硬件和软件兼容,包括处理器、芯片组和其他组件。 2. **散热设计**:由于PCIe设备在高负荷...
Java性能优化主要涵盖以下几个关键方面: 1. **代码优化**:编写高效、简洁的代码是基础。避免冗余计算,减少不必要的对象创建,使用适当的数据结构(如ArrayList vs LinkedList),以及避免过度使用全局变量和静态...
首先,辅助优化设计主要关注以下几个方面: 1. **算法优化**:优化算法是提高程序性能的关键。第五章可能包含了各种数据结构和算法的改进版本,如快速排序、二分查找等,这些都是在实际编程中常用于提高执行效率的...
5. 磁盘IO:由于磁盘I/O是数据库性能的重要瓶颈之一,文档可能也提到了优化磁盘I/O的一些方法。比如,通过合理安排数据和索引文件的存储位置,或者选择高性能的存储解决方案,如使用固态驱动器(SSD)来提高I/O性能...
相较于传统的磁盘存储数据库,Redis能够提供毫秒级别的响应时间,极大地提升了应用程序的响应速度和整体性能。 **2. 高性能** 由于采用内存存储机制,Redis在执行读写操作时几乎不受I/O限制,因此能够实现非常高的...
针对互联网职业发展的疑惑,可以通过以下几个方面来解答: 1. **职业规划建议**:根据个人兴趣和技术方向,提供职业规划建议。 2. **技能提升路径**:推荐学习资源和技术书籍,帮助开发者持续成长。 3. **面试技巧...
具体来说,调优策略大致可以分为以下几个方面: 1. 配置参数调优:合理配置Hadoop和Hive的参数是调优的一个重要步骤。这包括了控制Map任务的数量、合理设置Reduce任务的数量、压缩中间数据以及减少磁盘IO。配置参数...
这个项目不仅对于初学者是挑战性的,也是检验C#编程技巧和理解系统级操作能力的良好实践。 首先,我们需要创建一个基本的用户界面,包括树形视图(TreeView)显示磁盘和目录结构,以及一个列表视图(ListView)用来...
在`CutDemo`源码中,可能会有以下几个关键部分: - 用户输入参数:包括原始文件路径、起始位置、分块数量。 - 文件验证:检查原始文件是否存在,是否可读。 - 文件流初始化:创建输入和输出流对象。 - 数据读取...
在C#语言中,系统优化通常涉及以下几个关键知识点: 1. **进程管理**:源代码可能包含了管理和监控系统进程的模块,这涉及到System.Diagnostics命名空间中的Process类,用于获取进程信息、控制进程启动和结束等。 ...
9. **IO与NIO**:对比传统IO和非阻塞IO(New IO),学习NIO的通道、缓冲区、选择器等核心概念,提升程序的性能和并发处理能力。 通过深入学习并解决《Java实用教程(第三版)》的课后习题,可以逐步掌握这些知识点...