阅读更多

1顶
0踩

数据库

转载新闻 存储性能瓶颈的成因、定位与排查

2014-05-06 13:27 by 副主编 WnouM 评论(3) 有9599人浏览
本文转载自:EMC中文支持论坛

企业数据存储性能瓶颈常常会发生在端口,控制器和磁盘,难点在于找出引起拥塞的单元,往往需要应用多重工具以及丰富的经验来查找并解决。

本文详细阐述存储瓶颈发生最常见的四种情况,可能发生的拥塞点,需要监控的参数指标,以及部署存储系统的最佳实践。

数据存储瓶颈的四个常见场景

以下是储瓶颈发生最常见的四种典型情况:

1.  多个用户同时访问某一业务应用

当多个用户同时访问某一业务应用,无论是邮件服务器,企业资源规划(ERP)系统或数据库,数据请求会累积在队列中。单个I/O的响应时间开始增长,短暂延时开始转变成为漫长的等待。

这类响应时间敏感型应用的特征是,很多随机请求,读取比写入更多,I/O较小。最好的方法是:将负载分布在多块磁盘上,否则可能造成性能瓶颈。

如果应用增加了更多用户,或应用IOPS请求增加,则可能需要在RAID组中添加更多磁盘,或数据可能需要跨越更多磁盘,在更多层级做条带化。

存储在这样的情况下往往首先被怀疑,但大多数情况下并非存储引发,原因可能在于网络、应用或服务器。

2.  带宽敏感型应用

带宽敏感型应用——如数据备份,视频流或安全登录,这类应用当多个用户同时访问大型文件或数据流时可能造成瓶颈。

定位这一问题存储管理员应当从备份服务器开始一路向下检查至磁盘,原因可能存在于这一通路的任何地方。

问题不一定发生在存储,可能是由于备份应用创建的方式或是磁带系统的工作方式引起的。如果瓶颈定位于存储,那么可能是由于服务I/O的磁盘数量不足,在控制器造成争用,或是阵列前端口带宽不足。

性能调优需要针对不同应用程序负载来完成。针对大型文件和流数据的调优并不适合于小型文件,反之亦然。这也就是为什么在大多数存储系统中往往做一个平衡,需要用户尝试并找出系统的折中。用户通常需要优化吞吐量或IOPS,但并不需要对两者同时优化。

3.  RAID组中的磁盘故障

特别是在RAID 5中会造成性能的下降,因为系统需要重建校验数据。相比数据读写操作,重建会对性能造成更大影响。

即便坏盘是造成故障的根源,但控制器还是可能成为瓶颈,因为在重建过程中它需要不停地服务数据。当重建完成时,性能才会恢复正常。

4.  新应用的卷位于处理繁忙邮件系统的同一磁盘

部署了一种新的应用,而卷存在于处理繁忙邮件系统的同一磁盘。如果新的应用变得繁忙,邮件系统性能将会遭受影响。额外的流量最终会将磁盘完全覆盖。

存储瓶颈常发区域

存储区域网络(Storage-area network, SAN)/阵列前端口

存储部署于集中化SAN环境时,需考虑服务器和SAN之间的潜在网络瓶颈。例如,运行多部虚拟机的整合服务器可能不具备支持工作负载要求的足够网络端口。添加网络端口或转移网络密集型工作负载至其他服务器可解决这一问题。如前所述,对于带宽集中型应用,需考虑NFS有多少Fiber Channel 端口、iSCSI 端口或 Ethernet 端口,需要用户站在带宽的角度来考量整个架构。

可能发生的问题包括:

  • 如果阵列中端口数量不够,就会发生过饱和/过度使用。
  • 虚拟服务器环境下的过量预定
  • 端口间负载不均衡
  • 交换机间链路争用/流量负荷过重
  • 如某一HBA端口负载过重将导致HBA拥塞。使用虚拟机会导致问题更加严重。
存储控制器

一个标准的主动——被动或主动——主动控制器都有一个性能极限。接近这条上限取决于用户有多少块磁盘,因为每块磁盘的IOPS和吞吐量是固定的。

可能出现的问题包括:

  • 控制器I/O过饱和,使得从缓存到阵列能够处理的IOPS受到限制
  • 吞吐量“淹没“处理器
  • CPU过载/处理器功率不足
  • 性能无法跟上SSD
Cache

由于服务器内存和CPU远比机械磁盘快得多,需为磁盘添加高速内存以缓存读写数据。例如,写入磁盘的数据存储在缓存中直到磁盘能够跟上,同时磁盘中的读数据放入缓存中直到能被主机读取。Cache比磁盘快1000倍,因此将数据写入和读出Cache对性能影响巨大。智能缓存算法能够预测你需要查找的数据,你是否会对此数据频繁访问,甚至是将访问频繁的随机数据放在缓存中。

可能发生的问题包括:

  • Cache memory不足
  • Cache写入过载,引起性能降低
  • 频繁访问顺序性数据引起cache超负荷
  • Cache中需要持续不断地写入新数据,因此如果cache总是在refill,将无法从cache获益。
磁盘

磁盘瓶颈与磁盘转速有关, 慢速磁盘会引入较多延时。存储性能问题的排查首先考虑的因素就是磁盘速度,同时有多少块磁盘可进行并发读写。而另一因素是磁盘接口。采用更快的接口能够缓解磁盘瓶颈,但更重要的是在快速接口与相应更大的缓存大小以及转速之间取得平衡。同样,应避免将快速和慢速磁盘混入同一接口,因为慢速磁盘将会造成快速接口与快速磁盘的性能浪费。

可能引发的问题包括:

  • 过多应用命中磁盘
  • 磁盘数量不足以满足应用所需的IOPS或吞吐量
  • 磁盘速度过慢无法满足性能需求及支持繁重工作负荷
  • Disk group往往是classic存储架构的潜在性能瓶颈,这种结构下RAID最多配置在16块磁盘。Thin结构通常每个LUN拥有更多磁盘,从而数据分布于更多spindle,因增加的并发性而减少了成为瓶颈的可能。
需要监控的指标

曾经一度存储厂商们强调的是IOPS和吞吐量,但现在重点逐渐转变成为响应时间。也就是说,不是数据移动的速度有多快,而在于对请求的响应速度有多快。

正常情况下,15,000 rpm Fibre Channel磁盘响应时间为4ms,SAS磁盘响应时间约为5ms至6ms,SATA为10ms,而SSD少于1ms。如果发现Fibre Channel磁盘响应时间为12ms,或SSD响应时间变成5ms,那么就说明可能产生了争用,可能芯片发生了故障。

除了响应时间,其他需要监控的指标包括:

  • 队列长度,队列中一次积累的请求数量,平均磁盘队列长度;
  • 平均I/O大小千字节数;
  • IOPS (读和写,随机和顺序,整体平均IOPS);
  • 每秒百万字节吞吐量;
  • 读写所占比例;
  • 容量(空闲,使用和保留)。
数据存储性能最佳实践

性能调优和改进的方式有很多种,用户当然可以通过添加磁盘,端口,多核处理器,内存来改善,但问题是:性价比,以及对业务是否实用。本文建议的方式是在预算范围内找寻性能最大化的解决方案。另外一个需要考虑的方面是环境并非一尘不变,系统部署方案要能够适应环境的改变需求。

首先需要考虑刷数据的性能特征,需要了解IO工作情况是怎样的。是否是cache友好型?是否是CPU集中型?业务数据很大数量很少,还是很小但数量很多?另外一方面就是构成存储环境的组件。包括应用,存储系统本身,网络。。。瓶颈可能在哪里,改善哪里最有效?

以下是一些常规建议:

  • 不要仅仅根据空闲空间来分配存储,而需要结合考虑性能需求,确保为吞吐量或IOPS分配足够多的磁盘。
  • 在磁盘间均衡分布应用负载,以减少热点地区的产生。
  • 理解应用负载类型,并针对负载选择匹配的RAID类型。例如,写密集型应用建议使用RAID 1而不是RAID 5。因为当写入RAID 5时,需要计算校验位,需耗费较多时间。而RAID 1,写入两块磁盘速度快得多,无需计算。
  • 磁盘类型(Fibre Channel, SAS, SATA)与期望性能相匹配。对于关键业务应用部署高性能磁盘,例如15,000 rpm Fibre Channel。
  • 对于I/O密集型应用考虑采用SSD,但并不适用于写性能重要型应用。只要没有达到控制器瓶颈,SSD对读性能提升显著,但对写性能提升并没有明显效果。
  • 采用端对端的监控工具,特别是虚拟服务器环境。虚拟端与物理端之间有一道防火墙,所以,需要穿透防火墙进行端到端的监控。
  • 有些性能分析工具涵盖从应用到磁盘,有些仅局限于存储系统本身。由于性能是一个连锁反应包含很多变量,所以需要全面地分析数据。
  • 以数据仅写入磁盘外部扇区的方式格式化磁盘。因减少数据定位时间而在高I/O环境下提升性能。负面作用是相当一部分磁盘容量未能得以使用。

1
0
评论 共 3 条 请登录后发表评论
3 楼 java_frog 2014-05-08 09:16
没到这层。
2 楼 pudong 2014-05-07 08:38
mark!
1 楼 lvwenwen 2014-05-06 13:47
mark 下

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Python实现一个混沌函数

    混沌函数的基本原理是通过迭代不断地对一个初始值进行变换,进而得到一系列看似随机的结果。在本次实现中,我们将使用Logistic Map作为混沌函数,其公式为:Xn+1 = r * Xn * (1-Xn),其中r为参数,Xn为当前的值。随机数在计算机科学中有广泛的应用,而混沌是一种看似无序但具有确定性的现象,也常常被用来生成随机数。在本文中,我们将使用Python语言实现一个简单的混沌函数。运行这段代码,我们就可以观察到Logistic Map的生成过程,并体会混沌函数的神奇之处。

  • 混沌算法工具箱

    C-C方法计算时间延迟和嵌入维数 主程序:C_CMethod.m, C_CMethod_independent.m 子函数:correlation_integral.m(计算关联积分) disjoint.m(将时间序列拆分成t个不相关的子序列) heaviside.m(计算时间序列的海维赛函数值) 参考文献Nonlinear dynamics, delay times, and embedding windows。 计算Lyapunov指数: largest_lyapunov_exponent.m(用吕金虎的方法计算最大Lyapunov指数) 参考文献:基于Lyapunov指数改进算法的边坡位移预测。 lyapunov_wolf.m(用wolf方法计算最大Lyapunov指数) 计算关联维数:G_P.m(G-P算法) 混沌时间序列预测 主函数 MainPre_by_jiaquanyijie_1.m(该程序用加权一阶局域法对数据进行进行一步预测) MainPre_by_jiaquanyijie_n.m(该程序用加权一阶局域法对数据进行进行n步预测) MainPre_by_Lya_1.m(基于最大Lyapunov指数的一步预测) MainPre_by_Lya_n.m(基于最大Lyapunov指数的n步预测) nearest_point.m(计算最后一个相点的最近相点的位置及最短距离) 子函数 jiaquanyijie.m(该函数用加权一阶局域法(xx)、零级近似(yy)和基于零级近似的加权一阶局域法(zz)对时间数据进行一步预测) pre_by_lya.m(基于最大Lyapunov指数的预测方法) pre_by_lya_new.m(改进的基于最大Lyapunov指数的预测方法)

  • 几个离散混沌映射系统(混沌函数)

    0.背景知识(1) 混沌系统是指在一个确定性系统中,存在着貌似随机的不规则运动,其行为表现为不确定性、不可重复、不可预测,这就是混沌现象。(2) Lyapunov指数是衡量系统动力学特性的一个重要定量指标,它表征了系统在相空间中相邻轨道间收敛或发散的平均指数率,当其指数大于0时,此时系统具有混沌性质。1.logistic映射1.1    简介此映射是目前应用最广泛的一类非线性动力学离散混沌映射系统...

  • Sine-Tent-Cosine混沌映射(提供参考文献及Matlab代码)

    混沌系统是用来描述确定的非线性系统所产生的对初值条件敏感、非周期性、内部随机性的一种复杂的混沌现象。一般情况下,混沌系统分为低维混沌和高维混沌。高维混沌系统结构较复杂,控制参数多,计算的复杂度高。低维混度系统结构简单,控制参数少,易于实现。但也存在一些问题,比如,混沌行为是有限的,混沌区间不连续,生成的混沌序列呈现非均匀数据分布等。为了开发具有更好混沌性能的混沌系统,研究人员将多种低维混沌结合在一起,形成新的复合混沌系统。该类混沌系统可以有效克服低维混沌的不足,并且与高维混沌相比,复杂度更低,更易实现。

  • Fuch混沌映射

    一、Fuch混沌映射 Fuch混沌映射公式如下: 该映射具有对初值不敏感,遍历均衡和收敛较快等优点,且在初值不为0的情形下均能产生混沌。 二、Fuch混沌映射代码 x(1)=rand; for i=2:2000 x(i)=cos(1./x(i-1).^2);%Fuch end figure plot(x,'.') xlabel('维度') ylabel('混沌值') figure hist(x) xlabel('混沌值') ylabel('频数') 三、Fuch混沌映射图 3.1 Fuch混沌映射分布图

  • c语言in函数,C++的输入cin函数的相关用法1

    1、cin>>用法1:最基本,也是最常用的用法,输入一个数字:#include using namespace std;main (){int a,b;cin>>a>>b;cout<}输入:2[回车]3[回车]输出:5用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束#include using namespace std;main (){ch...

  • MATLAB计算函数是否混沌,MATLAB编程之混沌系统

    一 概述简单来说,混沌科学中,同一个动力学方程或者是方程组,给出的初始值相差甚微,长时间后,系统的运动轨迹却有很大差别;混沌系统广泛应用在加密等领域。二 Matlab仿真混沌系统 以chen混沌系统为例:式中x,y,z是系统的状态变量,a,b,c为该系统的常数,当参数a=35,b=3,c=28时,系统处于混沌状态。用MATLAB仿真得到得到Chen混沌吸引子在x-y相面、x-z相面、y-z相...

  • C++中的In 和 Out用法

    参考:https://zhidao.baidu.com/question/541219383.html In 这是一个宏,它的实际意义就是告诉你,这个变量或参数是输入值,即你必须给这个变量填写好以后提交给某个函数去执行。 相对的还有_out_,意思是输出值,即你不需要预先给它值,当函数执行完毕以后可以从这个变量获取输出的数据。 这对宏并不参与编译和计算(空宏),但它对程序员(API使用...

  • C++简单表达式求值(多位数)

    数据结构学习笔记1:栈实现表达式求值 需求分析:实现包含多位数及负数的表达式的求值问题。 系统分析:任一表达式都是由操作数、运算符和界限符组成。界限符(左右括号、结束符等)可归并到运算符中。 理论上,对于输入的表达式,通过逐个读入字符的方式,只需建立两个栈分别存放操作数和运算符,存放运算符的过程中完成对运算符优先级的判断和整理,再通过弹出栈中元素进行运算的方式即可实现求值。 具体实现: 1、判断读入的字符是否为运算符(利用bool函数) bool In(char c) { if (c ==

  • 【C++】内联函数----inline函数的详细使用教程

    今天我们来学习C++中的一个比较重要的关键字–inline函数(内联函数),码字不易,希望多多支持!!!因此宏函数极易出现错误。这个知识点容易出错,但是面试的时候易被问到。inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。只要是内联函数,函数定义与声明分离的时候,内联函数的函数地址不会进符号表,要不然还要判断编译器是否应用内联函数,这样太复杂了!!!1.一个冷知识:屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

  • C++实现参数in、out、ref语义

    stl是一个好东西,但是一直唯一一点不爽的就是长长const std::string&,const std::vector<int>&的函数参数。 void test(const std::string& str, std::vector<int>& vec, std::vector<int>& outvec) { ...

  • C++之_In_和_out_

    宏_In_,_out_,__in_opt,__out含义

  • 深入理解C++

    Posted on 02 Apr 2013 说一下我为何回归 C++ 了吧 : 简单: 生命有限。用 C , 固然是只有一个范式, 学起来容易, 上手简单, 可是需要操心的问题太多了: 内存泄露, 野指针, 各种断错误。 可能你会说, 内存管理,小心点就可以了。 但我觉得,如果你总是用 200% 的精力去避免内存泄露,你就没有精力开发正常的软件了。你会对软件的逻辑进行折中,因为你实在没有精力开发需

  • MATLAB编程之混沌系统

    一 概述 简单来说,同一个动力学方程或者是方程组,给出的初始值相差甚微,长时间后,系统的运动轨迹却有很大差别;

  • C++ 高效位运算函数 之 __builtin_

    刷题时偶然发现了该系列函数,感觉不错,分享下 1.__builtin_popcount(n)该函数时判断n的二进制中有多少个1int n = 15; //二进制为1111 cout<<__builtin_popcount(n)<<endl;//输出42.__builtin_parity(n)该函数是判断n的二进制中1的个数的奇偶性int n = 15;//二进制为1111 int m = 7;//1

  • 笔记 c++ 中 _in_ 含义

    这是一个宏,它的实际意义就是告诉你,这个变量或参数是输入值,即你必须给这个变量填写好以后提交给某个函数去执行。 相对的还有_out_,意思是输出值,即你不需要预先给它值,当函数执行完毕以后可以从这个变量获取输出的数据。 这对宏并不参与编译和计算(空宏),但它对程序员(API使用者)起到了一个提示的作用。知道如何去使用它。 ...

  • 常用9种混沌映射函数及其适用场景(附带python代码)

    2)参数设置:a表示控制参数,取值范围通常在(0, 1)之间,当a接近1时,系统表现出混沌特性;参数a是控制参数,通常取值在(0,1)之间,用于调整混沌映射的行为。1)circle_map(x, a, b):根据Circle混沌映射函数公式计算下一个值,参数a和b是控制混沌行为的参数,通常a取值在[0, 1],b取值在[0, 1]。1)chebyshev_map(x, a):根据Chebyshev混沌映射函数公式计算下一个值,参数 a 通常取值在(0, 6)之间,以确保系统表现出混沌特性。

Global site tag (gtag.js) - Google Analytics