本文主要详细解释了与阵列卡缓存电池充放电相关的各方面的问题。
上篇文章回顾:由ORM谈Python元类

磁盘阵列是服务器上历史悠久的一项技术,它能够通过不同的阵列模式合理利用空间和性能配比出性价比极高的磁盘阵列,被大部分服务器OEM厂商所广泛采用。其中以LSI公司的MegaRAID SAS产品为主,广泛用于各品牌(除惠普外)x86服务器。

为何有缓存?

阵列卡核心技术包含三部分内容:

1、数据条带化;

2、数据冗余;

3、高速缓存。

其中高速缓存即所谓的阵列卡内存(以下简称缓存):阵列卡控制器通过一系列算法将上层应用下发的写请求进行优化并存储在阵列卡的高速缓存内以此提高应用的写性能(上层应用不必等待数据实际Flush到磁盘上即可完成写操作)。由于阵列卡缓存也属于RAM(易失性存储)的一种,因此也存在掉电丢数据的风险。一旦服务器断电,阵列卡缓存中的数据就会丢失,这会给应用造成数据一致性的风险。

电池的诞生

为了保障断电后数据的一致性,于是一种可循环充电式的电池被应用到阵列卡缓存单元上。如今大部分阵列卡缓存单元都会外接一个可充电式的电池包,以此来为断电后的缓存提供电源支持,同时保障数据在一定时间内不丢失(这个时间通常为48小时)。待到下一次服务器再次恢复电源后,阵列卡控制器会将缓存中的数据Flush到磁盘,以避免脏数据的产生。

缓存的供电方式

1、一般情况下服务器通电时阵列卡缓存使用的是主板供电;

2、服务器断电后阵列卡板卡电路自动将缓存的供电方式由主板切换到电池。

电池为何要进行充放电操作?

LSI阵列卡用的是锂电池方案,我们知道锂电池有较强的惰性,它在非充电状态下会缓慢地自放电(电池特性),一段时间后电量就会下降。为了能够及时校准电量避免电池因为自放电而导致电量不明确,于是阵列卡控制器会对电池进行周期性地充放电操作(Relearn),以此保证电量的准确性,同时还可以判断电池是否故障或者老化。

电池充放电会有哪些操作?

1、控制器首先对电池进行完全放电直至零电量;

2、控制器重新对电池进行充电操作直至充满;

3、控制器对电池的电量重新进行计算校准;

4、等待下一个充放电时间点。

为何充放电会引发性能问题?

充放电操作时由于电池电量无法提供足够的数据保障时间,为了避免风险发生阵列卡控制器默认会将缓存关闭,正是由于缓存被关闭而引发了写性能急剧下降的问题。

惠普服务器为何没有同类问题?

1、惠普服务器使用的是自家设计的基于PMC控制器的阵列卡,它采用的是镍氢电池。镍氢电池没有太强的惰性,并且特性和锂电池不同,它并不需要通过完全放电来校准电量。

2、当镍氢电池由于自放电而导致电量降低时到一定程度时(比如80%),阵列卡控制器会检测到电量下降并对电池进行娟流充电以补充失去的电量。整个过程对用户是透明的,也不需要关闭缓存,因此并不会影响IO性能。

是否存在可充电式电池的替代方案?

有!闪存式电容方案不但可以替代电池提供几乎无限的数据保护时间,并且控制器也不会因为充放电操作而关闭缓存。闪存式电容能够在服务器断电时,由高容量电容向阵列卡短暂地供电(大约几分钟),随后阵列卡控制器会将缓存中的数据全部复制到同等容量的闪存介质上。因为闪存是非易失性存储器,因此可以认为数据保护时间是无限的。待下一次服务器正常通电开机,阵列卡控制器在初始化阶段会将闪存中的脏数据重新Flush到磁盘上。

当然闪存式电容方案也不是绝对完美的,缺点也显而易见,就是成本太高!

为何采用可充电式电池?

1、基于可充电式电池的缓存单元价格低廉,比起基于闪存式电容的缓存单元要便宜许多;

2、可充电式电池通过循环充电已经能够满足一定的数据保护时间。

说到底还是因为成本!

阵列卡自动充放电带来的运维问题?

1、电池寿命有限,更换周期通常是2-3年,更换需要停机操作,增加运维工作量;

2、电池自动充放电时会强制关闭缓存影响写性能,给业务性能造成很大影响,给运维带来压力;

3、由于电池问题引发的问题和故障数不胜数,增加运维团队的工作量。

为何放弃阵列卡自动充放电功能?

1、通常服务器都是双电方案,单电源故障的更换操作可在线完成;

2、绑线规范使得电源和插头之间不会出现松动脱离的情况,更加减少了掉电的风险;

3、单个电源的月故障率远远低于磁盘、内存、阵列卡,双电同时故障概率极其低。

充放电问题的解决方案

1、缓存单元的供电方案更换成闪存式电容;

2、缓存设置为WT(写缓存开启)和CachedBadBBU(强制写缓存开启),AutoLearn仍旧周期性进行只是该过程进行阶段缓存不会被关闭;(推荐)

3、担心AutoLearn期间电池的数据保护时间不够的话,也可以选择不强制打开写缓存,仅在业务低峰期时通过MegaCli工具人为地进行电池Relearn操作。

原文首发于公众号“小米运维”,点击查看原文。

阵列卡缓存电池充放电问题详解相关推荐

  1. 关于Linux的缓存内存 Cache Memory详解

    30 (总结)关于Linux的缓存内存 Cache Memory详解 发表于: Linux, UNIX, 个人日记, 原创总结 | 作者: 谋万世全局者 标签: cache,Linux,Memory, ...

  2. java写dnf外掛_dnf卡盟_Java的泛型详解(一)

    Java实现DDD中UnitOfWorkdnf卡盟 Java的泛型详解 泛型的利益 编写的代码可以被差别类型的工具所重用. 由于上面的一个优点,泛型也可以削减代码的编写. 泛型的使用 简朴泛型类 pu ...

  3. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

  4. caffeine本地缓存的使用和详解

    在项目中我们经常使用缓存架构,来缓存我们的数据,比如redis.caffeine等.那么redis和caffeine有什么区别?作用又有哪些不同呢? caffeine本地缓存的使用和详解 caffei ...

  5. Spring——三级缓存解决循环依赖详解

    三级缓存解决循环依赖详解 一.什么是三级缓存 二.三级缓存详解 Bean实例化前 属性赋值/注入前 初始化后 总结 三.怎么解决的循环依赖 四.不用三级缓存不行吗 五.总结 一.什么是三级缓存 就是在 ...

  6. Android 电池管理(BatteryService) 详解

    SystemServer在启动BatteryService时,一次会调用它的构造函数,onStart,onBootPhase方法;解析来我们分析一下这些方法: 1.Constructor方法: pub ...

  7. mtk 电池曲线_mtk 电池驱动流程详解

    mtk 电池驱动流程详解 充电算法,充9S停1S 电池温度高于50,充电器电压为>6.5V 停止充电, 充电电压最大值是6500mV 最小值是4400mV 3.4V为开机电压,电压大于3.4V才 ...

  8. 23.从0学ARM-网卡DM9000及uboot协议栈详解

    第二十三章 一.网卡 1. 概念 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件.由于其拥有MAC地址,因此属于OSI模型的第2层.它使得用户可以通过电缆或无线相互连接. 每一个网卡 ...

  9. OKHTTP缓存max-age和max-stale详解

    一.前言 此前了解过OKHTTP的缓存的使用,并对缓存的使用进行了初步的总结https://blog.csdn.net/polo2044/article/details/80650856.缓存主要是为 ...

最新文章

  1. Facebook发现:计算机识别系统更青睐识别“有钱人”,准确率高出20%
  2. IE11 统治浏览器市场 Chrome 终超 Firefox
  3. 打开新窗口的js代码
  4. 最小生成树的Kruskal算法实现
  5. 发现一个ps抠毛发简单快捷高质量的方法
  6. 感觉没睡好就..-shenmedoumeixie....
  7. 达梦数据迁移工具的使用
  8. sqoop导数据出现问题
  9. 生产上oracle扩展表空间,oracle基于裸设备(raw device)扩充表空间
  10. _thread_in_vm_Java Thread类的静态void sleep(long time_in_ms,int time_in_ns)方法,带示例
  11. $ajax 筛选某个属性,jQuery
  12. Leetcode中学到的SQL函数汇总
  13. win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)
  14. python中capitalize()函数的用法
  15. 让APP不被android系统杀掉
  16. 10月20日中国域名商解析量十四强:易名中国季军
  17. Maven项目中,jar包版本冲突导致运行时报错的问题
  18. [codeblocks下实现多个源文件2.0]类声明和成员函数定义的分离实战操作实现
  19. 魔兽世界单机mysql修改怪物血量_魔兽世界单机版如何修改怪物掉落物品个数
  20. Netty实现自定义协议和源码分析

热门文章

  1. day21IO流+FIle递归
  2. vagrant box php开发环境配置 -- 重新打包发布vagrant box
  3. excel 2010 学习笔记一 Vlookup 函数的使用
  4. Peter Cnudde谈雅虎如何使用Hadoop、深度学习和大数据平台
  5. Windows下 maven3.0.4的安装步骤+maven配置本地仓库(转载)
  6. MyEclipse+Tomcat部署发布webapp
  7. 10 个强大的 Apache 模块
  8. 批量 kill mysql 中运行时间长的sql
  9. 基于存储过程的可扩展性数据访问框架
  10. IT人应该具备的几种技能