SCSI软件层对性能的影响

在闪存存储领域,我们可以看到无论在市场、客户还是在研发,大家都在支持NVMe标准,其很重要的一个原因是传统的SCSI已经不能满足性能需求,其变成了存储系统的一个重要性能瓶颈点。从软件层、传输协议效率、软件接口标准、芯片接口、传输链路,传统的SAS/SATA都存在很多不足的地方。今天存储老吴和大家一起分享一下SAS/SATA接口在软件层面的重要性能瓶颈点,从研发的角度来解释为什么SCSI软件层是一个重要的性能瓶颈点。

大家都比较清楚SCSI软件层的组织结构,其主要由三大部分组成:

1, SCSI上层驱动层。这层驱动主要完成SCSI设备的功能,例如磁盘的驱动、Tape的驱动,CD-ROM的驱动都在这层实现。对于磁盘驱动,通常也被称之为SD驱动,实现了一个块设备功能。对上接入块设备驱动层;对下和SCSI中间层对接。

2, SCSI中间层。中间层软件主要完成SCSI命令的处理、出错处理、超时处理等。中间层的上面是各个SCSI的功能驱动;下面是SCSI的底层驱动。

3, SCSI底层驱动。底层驱动实现了SCSI的数据传输和HBA的驱动。在底层可以实现ISCSI的发送器;可以模拟一个SCSI的HBA;当然也可以实现LSI的HBA驱动程序,并通过DMA的方式将数据提交给实际的硬件板卡。

在传统磁盘存储中,性能瓶颈点在磁盘端。CPU处理器、NUMA体系架构、软件的并发性对存储的性能影响几乎为零。存储老吴在07年研发Thin Provisioning逻辑卷系统的时候,试图通过优化锁资源竞争来提升IO性能,结果是预料之中的徒劳。对于磁盘存储来说,CPU性能一直是搓搓有余的。一个磁盘的IOPS最多只能跑到200,所以中断对CPU来说也毫无压力,在这种情况下,SCSI软件层无论如何实现对性能基本是没有影响的。所以,磁盘存储是一个实实在在的IO Intensive应用。

但是,对于闪存存储而言,一切都发生了变化,SSD的性能无论是带宽还是IOPS都非常高,因此,存储的性能瓶颈点从Disk端转移到了CPU、OS以及网络端。在这种情况下,我们再来看一看SCSI的软件栈。如下图所示,每个SCSI设备只提供了一个请求队列(request queue),那么无论系统中存在多少个处理线程,无论系统中存在多少个CPU核,所有的请求都会以竞争的方式入队列。SCSI设备的请求队列是系统的一个竞争资源。

对于SMP系统而言,竞争资源的处理都需要通过加锁的方式来实现访问。在Linux的实现中通过Spinlock的方式对请求队列进行互斥保护。由于SSD性能非常高,所以系统中的CPU都在忙于请求的处理,这些忙碌的CPU最终都需要去竞争请求队列锁,将请求放入队列。这种大量的竞争导致每个CPU的处理效率大为降低,大量时间处于自旋状态,等待获取请求队列锁。从而使得整体IO处理的效率降低,存储性能由于软件上的限制而得不到提升。

针对这个问题,我们做过实际的测试,发现当IO压力上来之后,系统中的CPU绝大部分时间都处于自旋状态,都在竞争请求队列的自旋锁。所以,SCSI层的单请求队列是一个严重的性能瓶颈点。

为了解决这个问题,Linux对SCSI的单队列做了改进,引入了Multi-queue的方式。通过多队列的方式可以减少、避免线程/CPU之间的竞争,可以充分发挥单个CPU处理IO的效率,从而整体提升IO处理的性能。SCSI引入多队列之后的示意图如下图所示:

需要注意的是,在软件上为每个SCSI设备引入多队列之后,同样需要在HBA端为软件访问提供多队列支持,否则性能将会局限在HBA卡上。闪存存储软件的设计与实现和传统存储相比,不仅数据分布、数据的组织形式发生了变化;而且软件的实现效率、CPU并发潜能的挖掘、计算机体系结构的考虑都会变得尤其重要。所以,我一直认为,闪存存储不仅玩的是存储技术,而是高性能计算技术。

时间: 2024-08-07 08:34:14

SCSI软件层对性能的影响的相关文章

软件对存储性能的影响​

存储系统的核心是软件,在磁盘存储时代,存储系统软件设计的好坏似乎对性能的影响并不是很大,很多存储软件的设计并不会去考虑计算机的体系架构,也不用去关心操作系统调度.内存拷贝等因素带来的性能影响.对于磁盘存储,事情的确是这样的,原因在于磁盘的性能远远低于CPU处理和访存性能.磁盘存储的性能瓶颈点就在于磁盘本身,因此过多的体系结构级别.竞争资源同步的优化,不会对存储性能带来显著优化. 在很久以前做过这方面的实践,当时觉得临界区的资源竞争会对IO性能造成影响,因此,对我们做的一套存储虚拟化系统进行锁资源

MySQL自身对性能的影响

MySQL体系结构 想要了解MySQL自身对性能的影响,就需要先熟悉MySQL的体系结构和常用的存储引擎.MySQL并不完美,却足够灵活,能够适应高要求的环境,例如Web类应用.同时,MySQL既可以嵌入到应用程序中,也可以支持数据仓库.内容索引和部署软件.高可用的冗余系统.在线事务处理系统(OLTP)等各种应用类型. MySQL最重要.最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离

高效编程之cache命中对于程序性能的影响

下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别? 首先要明白的是不管是几维数组,他们都是用一块地址连续的内存来存储所有的元素,而内存布局的顺序是一整行接着下一个整行排列,第一个循环是一行一行访问,所以从内存上看是顺序的遍历了这块内存,每次读取的位置都在上一次的附近,所以cache命中率高.第二个循环是一列一列访问,可以说访问的元素都不是连续的内存访问(相隔了一行的大小),从而降低了c

一:MySQL数据库的性能的影响分析及其优化

MySQL数据库的性能的影响分析及其优化 MySQL数据库的性能的影响 一. 服务器的硬件的限制 二. 服务器所使用的操作系统 三. 服务器的所配置的参数设置不同 四. 数据库存储引擎的选择 五. 数据库的参数配置的不同 六. (重点)数据库的结构的设计和SQL语句 1). 服务器的配置和设置(cpu和可用的内存的大小) 1.网络和I/O资源 2.cpu的主频和核心的数量的选择 (对于密集型的应用应该优先考虑主频高的cpu) (对于并发量大的应用优先考虑的多核的cpu) 3.磁盘的配置和选择 (

025:sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响

sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响 [TOC] 一.OLTP测试前准备 基本信息: 主机信息 CPU 内存 硬盘 系统版本 MySQL版本 sysbench版本 Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz *2 2G 虚拟机硬盘 CentOS release 6.9 (Final) 5.7.18 1.1.0-76 sysbench 目录(/software/sysbenc

zt:tcpdump抓包对性能的影响

https://blog.csdn.net/dog250/article/details/52502623 一直以来,提到这个话题,大家更多的关注的是tcpdump抓包本身的性能,比如能不能应付几十万的pps,能否在万兆网络上自运自如...我们现在知道,这些问题的答案都是否定的,即“不能”!因此你应该去关注netmap高性能抓包方案以及DPDK这样的东西... 但本文不谈这些,本文谈的是被抓取数据包以外的东西,即tcpdump对那些未被命中抓包规则的数据包性能的影响. 接口和实现 不得不说,有的

7 怎么减少行锁对性能的影响?

7 怎么减少行锁对性能的影响? MySQL的行锁是在引擎层由各个引擎自己实现的,并不是所有的引擎都支持行锁,比如myisam引擎就不支持行锁,不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何 时刻只能有一个更新在执行,这就会影响到业务并发度. 这一章主要聊innodb的行锁,以及如何通过减少锁冲突来提升业务并发度. 从两阶段锁说起 Session a Session b begin; update t set k=k+1 where id=1; update t set k

smarty对网页性能的影响--开启opcache

在上一篇<smarty对网页性能的影响>中,默认没有开启opcache,于是我安装了一下zend opcache扩展,重新实验了一下,结果如下: 有smarty 用apache的ab命令进行压力测试,并发10个,不算大:同时用sar命令进行cpu利用率的统计.命令如下: ./ab -c 10 -n 100000 http://cq01-rdqa-dev072.cq01.baidu.com:8008/index.php sar -u 2 1000 >/tmp/smarty.sar &

HTTP的持久连接对Web服务性能的影响

我们的 Web 页面通常有很多对像(Object)组成.如:jss 样式表.图片.scripts.文档等.所以用户浏览一个网页文件时候,要向 Web 服务器发送多次请求(要从服务器上获取一个Object就要向服务器发送一个请求),浏览器根据 jss 样式表把从服务器获取的这些html页面对象合成一个完整的html页面展示给用户.        最早我们的浏览器是单线程的,意味着一次只能向浏览器发送一个Object请求,等到该Object传输完成了,再向服务发送第二个Object的请求.我们把它称