iSCSI性能瓶颈及性能优化方案

iSCSI性能瓶颈

&">nbsp;   iSCSI协议建立在传统的TCP/IP协议之上,在进行实际数据传输时,其传输系统性能受限于TCP/IP协议栈负载及以太网最大带宽,另外iSCSI协议层也会额外增加一些负载开销,在实际应用中,iSCSI数据传输性能仍然存在瓶颈。以发送端的写操作为例,一次完整的iSCSI协议数据传输包括数据封装、数据拷贝、数据传输三个步骤。

1.数据封装

iSCSI协议层首先将接收到的命令封装成iSCSI协议层的PDU数据包,此过程还需要对PDU数据包进行CRC校验计算,以便接收端接收到数据后进行正确性检验。数据封装过程还必须进行CRC循环冗余校验计算,由于校验生成与检测属于高密度计算型操作,需要消耗大量CPU资源,因此会严重影响iSCSI系统的性能。

2.数据拷贝

封装完毕后的PDU数据包以数据拷贝的方式传递给操作系统的TCP/IP协议层缓冲区,再由该缓冲区发送给数据链路层进行网络传输,一个PDU数据包可能对应多个TCP连接。数据拷贝过程也会占用发送端或接收端的大量CPU资源及内存带宽,从而影响系统性能。

3.数据传输

TCP/IP层接收到数据包后通过PCI DMA的方式将数据传递给网卡,经物理链路传输到目标服务器。读操作过程的操作顺序正好相反,目标服务器端操作也与启动服务器端类似。数据传输过程是利用TCP/IP协议进行网络传输的,必然受限于TCP/IP协议栈本身的开销负载以及实际的网络带宽,因此进行数据传输也会占用系统CPU资源。

iSCSI性能优化

通过前面的介绍,已经了解了影响iSCSI性能的瓶颈,因此如何优化现有的iSCSI系统的问题就变得显而易见了。下面根据iSCSI协议在数据传输、数据拷贝、数据校验三个方面存在的性能瓶颈问题,分别介绍对iSCSI网络存储进行性能优化的几种方法。

1.优化网络传输

iSCSI协议利用通用的TCP/IP协议进行海量存储数据传输,传统的TCP/IP协议用于在不可靠的数据链路上实现可靠的数据传输,其性能必然受限于TCP/IP本身的传输性能,基于通用TCP/IP协议的网络存储面临的一个很重要的性能问题就是TCP/IP协议栈开销。目前已经出现了一些新的网络技术用于改善TCP/IP协议栈开销。

1)有些新型网卡可以分担过去由主机CPU完成的CRC校验和计算功能,利用这些网卡,可进一步释放主机CPU资源,进而降低CPU利用率。
    2)一些新型网卡可以实现过去由主机TCP/IP软件协议栈完成的TCP包拆分功能,这样也可缓解主机CPU的压力。
    3) iSCSI SAN网络绝不能与一般的以太网用户混合。如果混合不仅会削弱SAN的性能,还会使LAN的存储数据受到影响。正确的做法是将iSCSI SAN网络与日常的用户网络分开。最常见的分离方法是采用虚拟局域网( VLAN),限制iSCSI网络通向虚拟局域网,保持正常的网络通道。

2.避免数据挎贝

iSCSI协议层建立在传统的TCP/IP协议层之上,其PDU数据包必须通过内存拷贝的方式传递给TCP/IP协议栈的缓冲区进行网络传输。而内存拷贝要进行内存读写操作各一次,内存数据拷贝又必须依赖于CPU执行指令来完成,因此会消耗CPU资源并降低内存性能,最终影响iSCSI系统性能。为了避免数据拷贝操作,目前主要的方法是采用TOE硬件方案:TOE方案是将过去由操作系统完成的TCP/IP协议栈直接转移到TOE网卡上由硬件实现。这个方案有效她避免了TCP/IP协议栈对系统CPU资源的占用,优化了iSCSI系统性能。TOE卡可以从一些供应商处获得,如Alacritech、LeWiz Communications、
QLogic等。

3.数据校验的优化

CRC校验数据的生成或检测均是计算密集型操作,会消耗大量的CPU资源,因此如何优化数据校验性能成为优化iSCSI性能的关键。目前常用的优化方案有下面几种。

(l) iSCSI HBA硬件方案

为了进一步消除CRC校验运算对系统CPU资源的影响,工业界将iSCSI协议及TCP/IP协议全部集成到网卡上构成iSCSI的HBA适配卡,这种方式中的iSCSI HBA适配卡对主机来说就是一块SCSI卡,既不存在数据拷贝问题,也不存在数据校验问题。采用硬件方案虽然能进一步释放CPU资源,但iSCSI HBA硬件处理能力有限制,无法分享CPU日益提升的性能。

(2)优化数据校验

通过优化CRC校验算法来加快校验过程也是提高iSCSI性能的一个途径。

(3)直接关闭校验

CRC校验主要保证PDU数据在传输中的安全性和可靠性,避免数据被篡改。如果不强调安全性,CRC校验意义就不大,所以在一些对性能要求很高而对数据安全性要求不高的场合,可以通过关闭CRC校验的方法来优化iSCSI性能,而数据的正确性可以依靠TCP/IP层的CRC校验数据来保证。

本文主要讲述了网络存储iSCSI技术的概念、组成、安装、配置和使用,还介绍了iSCSI在安全方面的设置方法。通过本章的学习,读者能够对iSCSI有一个基本的了解和认识,同时也能够迅速地搭建出一套iSCSI存储系统。

利用iSCSI技术构建的基于IP的存储网络系统,无需昂贵的专用存储网络,易于管理维护,并可以有效减少用户投资,节约成本。同时,iSCSI还具有良好的扩展性,方便进行异地容灾。而对iSCSI存储系统的优化,主要集中在对iSCSI数据校验、数据拷贝、数据传输三个方面进行改善。随着iSCSI技术的日益成熟,采用iSCSI技术构建的IP存储网络系统将拥有广阔的应用前景。

时间: 2024-11-08 21:12:33

iSCSI性能瓶颈及性能优化方案的相关文章

Mysql性能优化方案分享_Mysql

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:mysql> show variables; 一.慢查询 m

Nginx服务器配置性能优化方案_nginx

高层的配置nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上. user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同. worker_processes 定义了nginx对外提供web服务时的worker进程数.最优值取决于许多因素,包括(但不限于)CPU核的数量

mysql 性能优化方案

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与负责,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化,网上找了一篇文章,分页分得乱七八糟的,只能转到博客. mysql> show global status; 可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: m

Nginx 服务器性能Bug和性能优化方案(真实经历)

一.遇到的问题 1.问题:本应该是3个ffmpeg ,但是怎么会有5个ffmpeg出现? 2.Lua脚本问题,一直写入日志,导致有大量的日志,这里的错误日志是直接写进nginx的error.log 日志文件的 (1)日志文件 total 1.8G -rw-r--r-- 1 root root 11M May 9 21:47 access.log -rw-r--r-- 1 root root 3.1K May 9 21:46 error.log -rw-r--r-- 1 root root 705

oracle数据库性能优化方案精髓整理收集回顾

oracle数据库性能优化总体法则: 一.减少数据访问(减少硬盘房访问次数) 二.返回更少的数据(减少网络传输或磁盘访问) 三.减少交互次数(减少网络传输) 四.减少服务器开销(减少cpu及内存开销) 五.利用更多的资源(增加资源) ===================具体说明================= 一.减少数据访问(减少硬盘房访问次数) 1.减少数据访问 1.1.创建并使用正确的索引 索引会大大增加DML(增删改)的开销[合理的索引会大大提高效率100倍.1000倍,但不合理的索

java性能优化方案5——使用原始类型和栈

5.使用原始类型和栈之前介绍了来自 jOOQ的例子中使用了大量的泛型,导致的结果是使用了 byte. short. int 和 long 的包装类.但至少泛型在Java 10或者Valhalla项目中被专门化之前,不应该成为代码的限制.因为可以通过下面的方法来进行替换://存储在堆上Integer i = 817598;--如果这样写的话:// 存储在栈上int i = 817598;在使用数组时情况可能会变得更加糟糕://在堆上生成了三个对象Integer[] i = { 1337, 4242

JDBC性能优化方案

   近期用到了利用JDBC查询Oracle数据库,但是查询效率不尽人意,研究了一下JDBC方面可以优化的地方,在这里跟大家分享一下.   1.设置最优的预取值         defaultRowPrefetch:预取条数默认值          defaultBatchValue:触发查询操作的批量请求值         这两个参数的默认值都是10,我们可以通过增加这两个参数值来减少数据库请求以提高查询效率,当然具体值大小要视具体情况而定.   2.通过连接池获取连接      创建连接的代

Java toString的性能优化方案比较

谁在关心toString的性能?没有人!除非当你有大量的数据在批量处理,使用toString产生了许多日志.然后,你去调查为何如此之慢,才意识到大部分的toString方法使用的是introspection,它其实是可以被优化的. 不过,首先让我们一起看看Javadoc回忆下Object.toString应 当做什么:"返回该对象的字符串表示,该结果必须简明但表述详实易懂.建议所有子类重写该方法".这里最有趣的就是"简明"和"详实".我们所钟爱的

java性能优化方案9——优化自定义hasCode()方法和equals()方法

9.优化自定义hasCode()方法和equals()方法在不能使用EnumMap的情况下,至少也要优化 hashCode() 和 equals() 方法.一个好的 hashCode() 方法是很有必要的,因为它能防止对高开销 equals() 方法多余的调用.在每个类的继承结构中,需要容易接受的简单对象.让我们看一下jOOQ的 org.jooq.Table 是如何实现的?最简单.快速的 hashCode() 实现方法如下:// AbstractTable一个通用Table的基础实现: @Ove