分布式文件系统里的EC和RS编解码的效率问题
2013-09-02 10:33
134 查看
erasure code(纠删码)是通信、计算机领域常用技术。对于存储技术而言,纠删码是提高数据冗余和降低成本之间的一种折中。
传统盘阵上用的raid4、raid 5也是一种简单的ec,数据冗余度较低,编解码只是简单的异或操作。
分布式文件系统领域副本技术是最常见的提高数据冗余度的方法。但是副本的方式空间利用率太低,双副本也就50%。采用ec对于分布式文件系统而言,可以提高空间利用率,但是也带来的一定的性能损耗和管理复杂度。支持ec的分布式文件系统并不太多。isilon的oneFS是支持ec的,但是其编码比例比较固定的,最多不能超过n:4。HDFS最初也不支持ec,后面有社区做了ec的补丁。facebook对于社区的最新贡献是对传统的rs编码方式的ec做了改进,提出了一种LRC编码(locally reparable
code)。
http://storagemojo.com/2013/06/21/facebooks-advanced-erasure-codes/
想谈下RS(Reed Solomon)编码的效率问题。RS编解码矩阵的计算的损耗可以不考虑,因为编解码矩阵肯定是提前算好的。那这里需要考虑的就是编码时复杂的矩阵乘法。RS编码是基于有限伽罗华域上的运算。rs码的矩阵乘法而言,涉及两个操作“乘法”、“加法”。伽罗华域的加法比较简单,对计算机而言就是异或。乘法比较复杂。传统的RS码采用GF(2^8)域上的乘法。GF(2^8)域总共有2^8(256)个不同的数字,如果每次编码时都需要计算这些乘法,效率非常低。如果提前算好存下来,编码时只是去内存里面取以下,这样就不需要复杂的乘法计算,这也是空间换时间的一种trade
off。对于8位的rs码而言,需要(1+2^8)*2^8,大约2^(8*2-1) byte=32k byte来存储这些结果,对于现代计算机而言32k根本不算什么。如果是16位的编码,需要2^(16*2-1)*2 byte=4G byte来存储这些结果。4G的内存消耗有些大,但也并非无法承受。但是到了32位的rs吗而言,这种方法已经完全无法实现了,因为内存消耗达到了惊人的2^(32*2-1)*4 byte = 32 e byte。
对于通用处理器而言,伽罗华域的乘法过于复杂。当然128位的rs码也并非完全不可能。如果用空间换时间不行,那就只好时间换空间。伽罗华域的乘法结果只能每次临时算出来,这就需要专门的ASIC芯片或者用LPGA之类的方法直接用硬件算出来。
传统盘阵上用的raid4、raid 5也是一种简单的ec,数据冗余度较低,编解码只是简单的异或操作。
分布式文件系统领域副本技术是最常见的提高数据冗余度的方法。但是副本的方式空间利用率太低,双副本也就50%。采用ec对于分布式文件系统而言,可以提高空间利用率,但是也带来的一定的性能损耗和管理复杂度。支持ec的分布式文件系统并不太多。isilon的oneFS是支持ec的,但是其编码比例比较固定的,最多不能超过n:4。HDFS最初也不支持ec,后面有社区做了ec的补丁。facebook对于社区的最新贡献是对传统的rs编码方式的ec做了改进,提出了一种LRC编码(locally reparable
code)。
http://storagemojo.com/2013/06/21/facebooks-advanced-erasure-codes/
想谈下RS(Reed Solomon)编码的效率问题。RS编解码矩阵的计算的损耗可以不考虑,因为编解码矩阵肯定是提前算好的。那这里需要考虑的就是编码时复杂的矩阵乘法。RS编码是基于有限伽罗华域上的运算。rs码的矩阵乘法而言,涉及两个操作“乘法”、“加法”。伽罗华域的加法比较简单,对计算机而言就是异或。乘法比较复杂。传统的RS码采用GF(2^8)域上的乘法。GF(2^8)域总共有2^8(256)个不同的数字,如果每次编码时都需要计算这些乘法,效率非常低。如果提前算好存下来,编码时只是去内存里面取以下,这样就不需要复杂的乘法计算,这也是空间换时间的一种trade
off。对于8位的rs码而言,需要(1+2^8)*2^8,大约2^(8*2-1) byte=32k byte来存储这些结果,对于现代计算机而言32k根本不算什么。如果是16位的编码,需要2^(16*2-1)*2 byte=4G byte来存储这些结果。4G的内存消耗有些大,但也并非无法承受。但是到了32位的rs吗而言,这种方法已经完全无法实现了,因为内存消耗达到了惊人的2^(32*2-1)*4 byte = 32 e byte。
对于通用处理器而言,伽罗华域的乘法过于复杂。当然128位的rs码也并非完全不可能。如果用空间换时间不行,那就只好时间换空间。伽罗华域的乘法结果只能每次临时算出来,这就需要专门的ASIC芯片或者用LPGA之类的方法直接用硬件算出来。
相关文章推荐
- Django模板输出Dict所有Value的效率问题
- 关于开发效率和项目周期的问题
- 多线程性能及效率问题
- Python2.7编解码问题总结
- Mediacodec编码UDP传输,接收到数据不能解码显示的问题
- oracle中的 exists 和 in 的效率问题
- 请教winform加载效率的问题
- 关于多层for循环迭代的效率优化问题
- paip.提升效率--输入框不能粘贴的问题
- 2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
- 关于StringBuilder和String的效率问题
- linux内核不发(Router Solicit)RS报文问题
- 隐马尔可夫模型(五)——隐马尔可夫模型的解码问题(维特比算法)(转载)
- 使用java mail 包收发中文邮件的编码,解码问题以及解决方法
- SQL各种写法的效率问题
- cv::imdecode 效率问题
- VBA复制粘贴效率问题
- int转String效率问题
- C++-cin与scanf cout与printf效率问题
- cells[index],children[index]效率问题