`
shyboy0358
  • 浏览: 35594 次
文章分类
社区版块
存档分类
最新评论

I/O 调优

 
阅读更多
I/O 调优
下面就磁盘 I/O 和网络 I/O 的一些常用的优化技巧进行总结如下:

磁盘 I/O 优化
性能检测

我们的应用程序通常都需要访问磁盘读取数据,而磁盘 I/O 通常都很耗时,我们要判断 I/O 是否是一个瓶颈,我们有一些参数指标可以参考:

如我们可以压力测试应用程序看系统的 I/O wait 指标是否正常,例如测试机器有 4 个 CPU,那么理想的 I/O wait 参数不应该超过 25%,如果超过 25% 的话,I/O 很可能成为应用程序的性能瓶颈。Linux 操作系统下可以通过 iostat 命令查看。

通常我们在判断 I/O 性能时还会看另外一个参数就是 IOPS,我们应用程序需要最低的 IOPS 是多少,而我们的磁盘的 IOPS 能不能达到我们的要求。每个磁盘的 IOPS 通常是在一个范围内,这和存储在磁盘的数据块的大小和访问方式也有关。但是主要是由磁盘的转速决定的,磁盘的转速越高磁盘的 IOPS 也越高。

现在为了提高磁盘 I/O 的性能,通常采用一种叫 RAID 的技术,就是将不同的磁盘组合起来来提高 I/O 性能,目前有多种 RAID 技术,每种 RAID 技术对 I/O 性能提升会有不同,可以用一个 RAID 因子来代表,磁盘的读写吞吐量可以通过 iostat 命令来获取,于是我们可以计算出一个理论的 IOPS 值,计算公式如下所以:

( 磁盘数 * 每块磁盘的 IOPS)/( 磁盘读的吞吐量 +RAID 因子 * 磁盘写的吞吐量 )=IOPS

这个公式的详细信息请查阅参考资料 Understanding Disk I/O。

提升 I/O 性能

提升磁盘 I/O 性能通常的方法有:

增加缓存,减少磁盘访问次数
优化磁盘的管理系统,设计最优的磁盘访问策略,以及磁盘的寻址策略,这里是在底层操作系统层面考虑的。
设计合理的磁盘存储数据块,以及访问这些数据块的策略,这里是在应用层面考虑的。如我们可以给存放的数据设计索引,通过寻址索引来加快和减少磁盘的访问,还有可以采用异步和非阻塞的方式加快磁盘的访问效率。
应用合理的 RAID 策略提升磁盘 IO,每种 RAID 的区别我们可以用下表所示:
表 2.RAID 策略
磁盘阵列 说明
RAID 0  数据被平均写到多个磁盘阵列中,写数据和读数据都是并行的,所以磁盘的 IOPS 可以提高一倍。 
RAID 1  RAID 1 的主要作用是能够提高数据的安全性,它将一份数据分别复制到多个磁盘阵列中。并不能提升 IOPS 但是相同的数据有多个备份。通常用于对数据安全性较高的场合中。 
RAID 5  这中设计方式是前两种的折中方式,它将数据平均写到所有磁盘阵列总数减一的磁盘中,往另外一个磁盘中写入这份数据的奇偶校验信息。如果其中一个磁盘损坏,可以通过其它磁盘的数据和这个数据的奇偶校验信息来恢复这份数据。 
RAID 0+1  如名字一样,就是根据数据的备份情况进行分组,一份数据同时写到多个备份磁盘分组中,同时多个分组也会并行读写。 

网络 I/O 优化
网络 I/O 优化通常有一些基本处理原则:

一个是减少网络交互的次数:要减少网络交互的次数通常我们在需要网络交互的两端会设置缓存,比如 Oracle 的 JDBC 驱动程序,就提供了对查询的 SQL 结果的缓存,在客户端和数据库端都有,可以有效的减少对数据库的访问。关于 Oracle JDBC 的内存管理可以参考《 Oracle JDBC 内存管理》。除了设置缓存还有一个办法是,合并访问请求:如在查询数据库时,我们要查 10 个 id,我可以每次查一个 id,也可以一次查 10 个 id。再比如在访问一个页面时通过会有多个 js 或 css 的文件,我们可以将多个 js 文件合并在一个 HTTP 链接中,每个文件用逗号隔开,然后发送到后端 Web 服务器根据这个 URL 链接,再拆分出各个文件,然后打包再一并发回给前端浏览器。这些都是常用的减少网络 I/O 的办法。
减少网络传输数据量的大小:减少网络数据量的办法通常是将数据压缩后再传输,如 HTTP 请求中,通常 Web 服务器将请求的 Web 页面 gzip 压缩后在传输给浏览器。还有就是通过设计简单的协议,尽量通过读取协议头来获取有用的价值信息。比如在代理程序设计时,有 4 层代理和 7 层代理都是来尽量避免要读取整个通信数据来取得需要的信息。
尽量减少编码:通常在网络 I/O 中数据传输都是以字节形式的,也就是通常要序列化。但是我们发送要传输的数据都是字符形式的,从字符到字节必须编码。但是这个编码过程是比较耗时的,所以在要经过网络 I/O 传输时,尽量直接以字节形式发送。也就是尽量提前将字符转化为字节,或者减少字符到字节的转化过程。
根据应用场景设计合适的交互方式:所谓的交互场景主要包括同步与异步阻塞与非阻塞方式,下面将详细介绍。
同步与异步

所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。而异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。我们可以用打电话和发短信来很好的比喻同步与异步操作。

在设计到 IO 处理时通常都会遇到一个是同步还是异步的处理方式的选择问题。因为同步与异步的 I/O 处理方式对调用者的影响很大,在数据库产品中都会遇到这个问题。因为 I/O 操作通常是一个非常耗时的操作,在一个任务序列中 I/O 通常都是性能瓶颈。但是同步与异步的处理方式对程序的可靠性影响非常大,同步能够保证程序的可靠性,而异步可以提升程序的性能,必须在可靠性和性能之间做个平衡,没有完美的解决办法。

阻塞与非阻塞

阻塞与非阻塞主要是从 CPU 的消耗上来说的,阻塞就是 CPU 停下来等待一个慢的操作完成 CPU 才接着完成其它的事。非阻塞就是在这个慢的操作在执行时 CPU 去干其它别的事,等这个慢的操作完成时,CPU 再接着完成后续的操作。虽然表面上看非阻塞的方式可以明显的提高 CPU 的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的 CPU 使用时间能不能补偿系统的切换成本需要好好评估。

两种的方式的组合

组合的方式可以由四种,分别是:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,这四种方式都对 I/O 性能有影响。下面给出分析,并有一些常用的设计用例参考。

表 3. 四种组合方式
组合方式 性能分析
同步阻塞  最常用的一种用法,使用也是最简单的,但是 I/O 性能一般很差,CPU 大部分在空闲状态。 
同步非阻塞  提升 I/O 性能的常用手段,就是将 I/O 的阻塞改成非阻塞方式,尤其在网络 I/O 是长连接,同时传输数据也不是很多的情况下,提升性能非常有效。
这种方式通常能提升 I/O 性能,但是会增加 CPU 消耗,要考虑增加的 I/O 性能能不能补偿 CPU 的消耗,也就是系统的瓶颈是在 I/O 还是在 CPU 上。 
异步阻塞  这种方式在分布式数据库中经常用到,例如在网一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,而还有两至三份是备份记录会写到其它机器上,这些备份记录通常都是采用异步阻塞的方式写 I/O。
异步阻塞对网络 I/O 能够提升效率,尤其像上面这种同时写多份相同数据的情况。 
异步非阻塞  这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,像集群之间的消息同步机制一般用这种 I/O 组合方式。如 Cassandra 的 Gossip 通信机制就是采用异步非阻塞的方式。
它适合同时要传多份相同的数据到集群中不同的机器,同时数据的传输量虽然不大,但是却非常频繁。这种网络 I/O 用这个方式性能能达到最高。 

虽然异步和非阻塞能够提升 I/O 的性能,但是也会带来一些额外的性能成本,例如会增加线程数量从而增加 CPU 的消耗,同时也会导致程序设计的复杂度上升。如果设计的不合理的话反而会导致性能下降。在实际设计时要根据应用场景综合评估一下。
分享到:
评论

相关推荐

    Calibrate_IO.zip_indeed6gn_oracle_oracle dba

    《Oracle数据库I/O调优:理解与实践》 在Oracle数据库管理中,I/O性能是决定系统整体效率的关键因素之一。"Calibrate_IO.zip_indeed6gn_oracle_oracle dba" 提供了一个关于Oracle存储I/O调优的专业资料,主要针对...

    针对应用服务器的CPU-内存-IO-网络全面调优实践

    1. I/O调优包括优化文件系统、合理配置RAID级别、使用高性能的存储介质等。 2. 了解系统中的I/O调度器(如CFQ、Deadline等),选择适合应用需求的调度器以优化I/O性能。 3. 使用iostat等工具监控磁盘I/O性能,比如...

    AIX_IO_Tuning

    此外,随着用户对存储容量需求的增加,磁盘子系统的性能问题越来越突出,因此进行有效的磁盘I/O调优至关重要。 #### 三、AIX I/O堆栈概述 AIX操作系统中的I/O堆栈由多个层次组成,主要包括: - 文件系统缓存(如...

    pl/sql 调优High Performance 9i_10g

    8. **PL/SQL性能调优技巧**:包括代码重构、避免冗余计算、减少磁盘I/O、内存管理优化等,这些都是提升PL/SQL性能的关键。 9. **PL/SQL与Cursors优化**:了解如何优化游标处理,减少资源占用,比如批量处理和大结果...

    I/O完成端口例子

    I/O完成端口是Windows操作系统中一种高效处理大量并发I/O操作的技术,尤其适用于网络服务器、数据库服务器等需要处理大量并发请求的环境。它通过一个单一的线程管理多个I/O请求,从而避免了线程上下文切换带来的开销...

    我的资源-iostat实测

    在进行I/O调优时,我们需要密切关注这些指标,根据实际情况调整工作负载、优化磁盘配置、升级硬件或调整内核参数,以确保系统的高效运行。只有深入理解iostat提供的数据,才能准确识别和解决问题,提升系统的整体...

    Oracle四大宝典之四:Oracle 调优入门到精通

    第3章 I/O调优 第4章 共享池 第5章 Buffer cache故障排除与调优 第6章 Redo Buffer与Java池 第7章 SGA管理 第8章 PGA与排序 第9章 SQL调优 第10章 资料收集 第11章 存储空间管理 第12章 聚簇 第13章 索引组织表 第14...

    Everything I ever learned in JVM tuning in Twitter

    I/O调优专注于提高输入/输出操作的效率。这包括优化网络通信、磁盘读写等。 - **措施:** - 使用更高效的I/O模型,如非阻塞I/O或异步I/O。 - 减少不必要的网络往返次数,通过批量处理请求等方式。 - 利用缓存来...

    Oracle数据库性能调优的研究.pdf

    磁盘I/O调优: I/O操作次数的减少可以通过多种方式实现,例如,通过增加数据缓冲区的大小来减少磁盘读取次数,以及优化数据库索引结构和使用分区技术来减少I/O负载和提高查询速度。 索引优化设计:合理设计和使用...

    sql server性能调优 I/O开销的深入解析

    SQL Server性能调优是数据库管理的关键环节,尤其是在处理大量数据操作时,降低I/O开销对提升系统性能至关重要。I/O主要包括物理I/O和内存I/O两个方面,它们是数据库性能的重要指标。物理I/O涉及磁盘与内存之间的...

    aix系统性能调优

    5. **I/O调优**:通过`iostat`分析磁盘性能,可以调整I/O调度器参数以提高I/O效率。考虑RAID配置、文件系统类型(如JFS2)和文件系统参数(如缓冲区大小)对性能的影响。 6. **网络调优**:使用`netstat`监控网络...

    SYBASE ASE性能调优

    1. **系统 I/O 调优**:确保有足够的 I/O 带宽,检查单个硬盘的速度是否满足需求,考虑并行硬盘的带宽总和是否大于总带宽。 2. **CPU 数量**:监测 `sp_sysmon` 的 CPU 百分比,确保 CPU 数量充足。 3. **物理内存**...

    Oracle 性能与调整学习笔记

    首先,调优步骤包括设计调优、应用程序调优、内存调优、I/O调优、冲突调优以及操作系统调优。设计调优涉及数据库架构和数据模型的优化;应用程序调优关注SQL语句和PL/SQL代码的效率;内存调优则调整SGA(System ...

    CPU-内存-IO-网络调优.docx

    ### CPU-内存-I/O-网络调优 #### 12.1 有关CPU的调优 **12.1.1 CPU处理方式** CPU的处理方式主要包括三种:批处理、分时处理以及实时处理。 - **批处理**:主要用于早期大型计算机系统中,通过将一系列任务预先...

    论文研究-压缩对Hadoop性能影响研究 .pdf

    压缩技术作为一种有效的I/O调优手段,能够在减少数据体积的同时降低I/O操作的负载,提高系统的整体性能。本文的研究重点在于探讨如何在Hadoop中有效地使用压缩技术来优化I/O性能。通过实验验证,本文提出了一套压缩...

    Oracle Performance Survival Guide(oracle 性能调优指导)

    I/O调优和集群技术是数据库性能的另一个重要环节。这里可能包含I/O子系统的分析、RAC(Real Application Clusters)配置、数据存储选择和故障恢复策略。 书中的内容还包括了多个实际案例,帮助读者将理论知识应用到...

Global site tag (gtag.js) - Google Analytics