转载:http://blog.csdn.net/cywosp/article/details/23970017
在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memcached、Redis、淘宝的Tair等,二、本地缓存,例如:Facebook的flushcache等,其中本地缓存又可以分为两种:本地磁盘缓存(现在一般都采用读写性能比较优异的SSD来做存储)和本地内存缓存。在系统中,为了提高缓存存储系统的性能以及热点数据的命中率,一般在本地磁盘缓存中也会引入内存缓存用于存储经常访问的数据。有时为了减少客户端对服务器的请求,也会在客户端上使用缓存,当然这是要考虑安全问题的。在这里,本文主要讨论分布式文件系统下的本地磁盘缓存。
1. 本地磁盘缓存与操作系统的关系
- 一、处于Storage Controller层,OS与应用相互独立,与硬件相关联,由硬件来做读写保护
- 二、处于Device Driver层,与应用独立,与硬件独立,需要第三方来完成读写保护,处于这一层的本地缓存系统有Facebook的flushcache
- 三、处于File System层,OS与应用相关联,与硬件独立,需要第三方来完成读写保护,这一层的本地缓存是在应用中使用最为广泛的,本文所讨论的本地缓存也是基于此层
2. 存储设备以及空间
根据现有的硬件存储技术,SSD的随机读写性能以非常优异,并且其使用寿命也得到了很好的保证,因此被广泛的应用于数据需要持久化存储和高速读写的服务器中。根据性价比来考虑,一般的分布式文件系统的服务器机器中不会放置太大的SSD来做缓存存储设备。——64GB至128GB的SSD是主流。
3. 磁盘缓存系统在分布式文件系统中的地位
缓存系统在整个分布式中以多种形态存在,常见的有以单独一个进程运行的方式存在,这种方式类似于C/S模式,需要进程间的通信;另外就是直接寄宿于分布式文件系统的进程中,由分布式文件系统的进程直接调用缓存的接口来进行数据读写操作,本文主要讨论后一种。
4. 分布式文件系统中,本地磁盘缓存的存储策略大概有一下所示的三种:
- 一、Write Around策略,该策略主要是读缓存,不直接写本地磁盘缓存,而是直接将数据写入分布式持久化存储当中,在读取数据时,如果发现缓存中没有对应的数据则向分布式持久化存储请求,然后再将请求后的数据写入缓存中。优点在于没有一致性问题,数据不会丢失,利于数据集中读取。缺点在于,分布式文件系统中直接将数据写入持久化存储速度会比较慢,对于用户体验会有很大的影响。
- 二、Write Through策略,该策略在读取数据方面与Write Around差不多,但是在数据写入方面有很大的区别,数据在写入的过程中,写入本地缓存的同时也将数据写入分布式持久化存储中。优点在于没有一致性问题,数据不会丢失,利于数据集中读取。缺点在于写入速度将会比较慢,不过这取决于分布式持久化存储的写入性能。
- 三、Write Back策略,该策略主要是读写缓存共用,将数据先写到本地缓存中,然后再通过异步的方式将脏数据同步到分布式持久化存储中,在本地读取数据Miss后才向分布式持久化存储请求,并回写到本地缓存中。优点在于写入速度快,利于数据集中读取,缺点在于会产生一致性问题以及数据可能会丢失。虽然这种策略容会导致数据的丢失,但是在不同层次的存储方案中其是常常被采用个的一种。
5. 存储数据类型
在分布式文件系统中,本地缓存效率极高,数据直接存储于服务器本地,对数据的操作就是对本地文件的操作,但是由于分布式的特征,本地缓存中的数据其它节点无法访问,那么如果相同的一份数据被多台机器缓存于本地,一旦该数据在其中一台机器中被修改,这就会导致一定数据的不一致,因此本地缓存最好只用于存储静态数据——一旦写入就再也不会修改的数据,例如文件的数据块内容、图片等等。
6. 索引
根据项目实践,在分布式文件系统中数据块的网络传输占用了绝大多数的时间,根据对数据随机访问概率的统计数据来分析,当一个文件被连续多次访问之后,其在最近一段时间内被访问到的概率非常之高,因此,为了减少对同一文件的网络IO,设计一个高效且符合实际的场景的本地磁盘缓存非常有必要。高效的缓存系统,必然少不了索引,利用索引快速定位对应数据的文件路径,然后尽可能的挖掘磁盘的读写潜力,让系统瓶颈落在对磁盘的读写上。同时,索引还可以很好的用于控制磁盘当前的使用空间;如果采用Write Back策略,还可以高效计算还未被同步到分布式持久化存储的存储大小;对索引的管理还可以提高缓存的命中率,什么样的数据可以被删除,什么时候删除等等。
缓存中一般都采用Key-Value的键值对形式将数据存储,Key由应用传入为了区分Value唯一的标志,为了能加速查找和减少索引的内存占用空间,缓存内部会将Key的内容进行MD5计算,然后存储在索引的数据结构中;Value的内容则以一个文件,或者多个Value存入一个文件中。由于使用SSD作为最后的Value存储,这里我们就简单的将每一个Key作为一个文件存储。另外,为了处理大量的小文件导致文件系统的inode耗尽的问题,可以将小于8KB的数据用leveldb来存储(leveldb对小数据的存储性能非常高)。
索引的组织方式有很多种,常用的有标准库的map,list,其它效率更高的有红黑树、B+树等等,这些也都是一种索引在内存中的存储和组织方式,其核心还是离不开对Key值的查找比较。在操作系统中,字符串的比较效率往往要低于系统整数类型,比如对两个32位MD5字符串的比较需要系统进行32次的比较,如果我们将MD5的值用4个unsigned int或者2个unsigned long long来存储的话(这里是在64位操作系统上的),那么直接利用CPU能对整型数进行计算的特性只需要比较4次或者2次即可,这样既可以节省16个字节的内存空间,同时还能加速比较,快速定位。
在索引的内存占用方面我们不必太过于担心,现在的服务中一般的内存配置都是十几GB,用1GB的内存来存储索引也不算太坑老板。假如每个索引所占字节数为32,那么1024 * 1024 * 1024 / 32 = 33554432个索引,如果每个索引所对应内容的平均大小为4KB,那么需要的磁盘空间为33554432 * 4KB = 134217728KB ≈ 128GB,128GB的容量正好与第2点中所说的存储相符。当然如果你开发的分布式文件系统就是用于存储小文件的,那么这些算法就需要额外考虑了。
7. 缓存的更新
在缓存系统中,由于容量有限,因此,在还有数据继续写入的情况下必须删除一些已存在缓存,腾出空间。在我们已知的常用缓存老化方法中大概有如下几种:
先进先出(FIFO: First In, First Out)
最近最少使用(LRU: Least Recently Used)
最少使用频率(LFU: Least Frequently Used)
随机删除(Random)
在实际开发过程中,有时还会采用一些其它的方式,比如,在每个数据中加入生命周期的管理——设置该数据在一定时间内自动失效并将其删除,这种方式需要对系统的时间有很精确的要求,系统时间不能随便被更改。
在分布式系统中,由于缓存会被老化或者删除,那么就会产生当缓存被老化后,某一时刻有同一数据被多人从同一台服务器中访问,所有的访问都会到缓存系统中查找,此时,发现缓存中数据不存在,那么都到分布式持久化存储中读取,返回之后,所有请求的操作会将同一份数据再回写到缓存系统中的问题。对于这个问题我暂时还没有找到什么比较好的处理方法,只能从缓存存储的数据以及业务逻辑上处理。像第5点所说的,缓存只用于存储静态数据,那样数据就可以覆盖,而不会产生一致性的问题。
如果在缓存策略中采用了Write Back策略,那么就需要做,在缓存中还未被持久化到分布式持久化存储的数据的特殊处理,这一类数据在备份持久化之前不能被内部的主动老化策略所删除。
8. 性能和命中率
在支持多线访问的缓存系统中,为提高索引的查找性能,避免锁的高频率碰撞,一般在设计索引的组织方式时会采用hash table的方法,使用多个hash桶,根据对应的hash算法来分散索引的存储,这种方法简单,易于实现,但其也存在无法动态添加hash桶的缺点。每个hash桶中放置的是一个LRU链表,LRU是缓存系统中最常见的数据替换算法,每次淘汰最久没有被访问的数据。每一个hash桶中只对LRU进行上锁,这样就能减少一部分的锁碰撞。memcached中也才用了hash table加LRU链表来管理内存的方法,其高效的管理,使得memcached被广泛用于网站的缓存中,其内存管理示意图如下:
memcache以slab方式管理内存块,从系统申请1MB大小的大块内存并划分为不同大小的chunk,不同slab的chunk大小依次为80字节,80 * 1.25,80 * 1.25^2, …。向memcache中添加item时,memcache会根据item的大小选择合适的chunk。
在项目中,为了权衡性能和命中率之间的关系,有时候常常会降低命中率来换取性能。在数据老化时可以将LRU的最少使用的前几个一起老化,减少每次只老化一个就得锁住当前的LRU链表的频率,从而加速索引的查找和写入,其次是增加hash桶个数,减少hash冲突,同时也减少了对同一LRU链表的操作。
9. 索引的持久化
在Google的好文《Introduction to Distributed System Design》中有阐明关于分布式的设计:design for failure。因此,在分布式文件系统中做好故障处理是及其重要有极其困难的,但是做好进程内的状态保存,当程序重启后能及时恢复到崩溃前的状态还是能够容易实现的。在缓存系统中,数据的索引尤为重要,因此可将其持久化,待程序重新启动后就可以重建索引。这里建议可以使用google的leveldb来做索引的持久化,其高效的读写性能,并不会对系统的性能太大的影响。——这里不考虑机器突然断电的情况。
总结
在现在的系统中,缓存无处不在,如果能合理的利用缓存,那么整个系统的性能将会得到大大个提高。那么如何判定一个缓存系统是高效的呢?在实际开发过程中,我们总结出:现在开源的缓存项目很多,但是符合自身项目需求的却寥寥无几,因此,设计一个满足自身业务需求的缓存系统时,切记不要过度设计,简单且满足需求,够用就行。
相关推荐
Ehcache 是一个开源的 Java 缓存库,它提供了本地内存缓存以及分布式缓存解决方案。在 Spring 框架中,Ehcache 可以被轻松地集成,以提升应用的性能,减少数据库的负载。这篇博客将深入探讨如何将 Ehcache 集成到 ...
内容概要:本文详细探讨了在Simulink环境中构建的风火水储联合调频系统中,储能系统的荷电状态(SOC)对区域控制偏差(ACE)的影响。文中通过具体案例和MATLAB代码展示了储能系统在不同SOC水平下的表现及其对系统稳定性的作用。同时,文章比较了储能单独调频与风火水储联合调频的效果,强调了储能系统在应对风电波动性和提高系统响应速度方面的重要作用。此外,作者提出了针对SOC变化率的参数整定方法以及多电源协同工作的优化策略,旨在减少ACE波动并确保系统稳定运行。 适合人群:从事电力系统调频研究的专业人士,尤其是熟悉Simulink仿真工具的研究人员和技术人员。 使用场景及目标:适用于希望深入了解储能系统在电力系统调频中作用的研究者和技术人员,目标是通过合理的SOC管理和多电源协同工作,优化调频效果,提高系统稳定性。 其他说明:文章提供了详细的MATLAB代码片段,帮助读者更好地理解和应用所讨论的概念。同时,文中提到的实际案例和仿真结果为理论分析提供了有力支持。
内容概要:本文深入探讨了欧姆龙PLC NJ系列中大型程序中结构化编程与面向对象编程的结合及其应用。首先介绍了结构化编程作为程序框架的基础,通过功能块(FB)实现清晰的程序结构和流程控制。接着阐述了面向对象编程的理念,将现实世界的对象映射到程序中,利用类的概念实现模块化和可扩展性。两者结合提高了程序的容错率,增强了程序的稳定性和可维护性。文中通过多个实际案例展示了如何在工业自动化领域中应用这两种编程方法,如电机控制、设备类的创建、异常处理机制、接口实现多态性、配方管理和报警处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些希望提升PLC编程技能的人群。 使用场景及目标:适用于需要优化PLC程序结构、提高程序可靠性和可维护性的场合。目标是帮助工程师掌握结构化编程和面向对象编程的技巧,从而写出更加高效、稳定的PLC程序。 其他说明:文章强调了在实际项目中灵活运用两种编程方法的重要性,并提醒读者注意实时性要求高的动作控制应采用结构化编程,而工艺逻辑和HMI交互则更适合面向对象编程。
matlab与聚类分析。根据我国历年职工人数(单位:万人),使用有序样品的fisher法聚类。
卡尔曼滤波生成航迹测量程序
内容概要:本文详细介绍了利用格子玻尔兹曼方法(LBM)对多孔电极浸润特性的模拟研究。首先阐述了LBM的基本原理,包括碰撞和迁移两个关键步骤,并提供了相应的Python伪代码。接着讨论了如何处理多孔介质中的固体边界,特别是通过随机算法生成孔隙结构以及结合CT扫描数据进行三维重构的方法。文中还探讨了表面张力、接触角等因素对浸润过程的影响,并给出了具体的数学表达式。此外,文章提到了并行计算的应用,如使用CUDA加速大规模网格计算,以提高模拟效率。最后,作者分享了一些实用技巧,如通过调整松弛时间和润湿性参数来优化模拟效果,并强调了LBM在处理复杂几何结构方面的优势。 适合人群:从事电池研发、材料科学领域的研究人员和技术人员,尤其是关注多孔电极浸润性和电解液扩散机制的人群。 使用场景及目标:适用于希望深入了解多孔电极内部流体动力学行为的研究者,旨在帮助他们更好地理解和预测电极材料的浸润特性,从而改进电池设计和性能。 其他说明:尽管LBM在处理多孔介质方面表现出色,但在某些极端条件下仍需引入额外的修正项。同时,参数的选择和边界条件的设定对最终结果有着重要影响,因此需要谨慎对待。
内容概要:本文详细介绍了在Zynq扩展口上使用FPGA和W5500实现TCP网络通信的过程。作者通过一系列实验和技术手段,解决了多个实际问题,最终实现了稳定的数据传输。主要内容包括:硬件搭建(SPI接口配置)、数据回环处理、压力测试及优化、多路复用扩展以及上位机测试脚本的编写。文中提供了大量Verilog代码片段,展示了如何通过状态机控制SPI通信、优化数据缓存管理、处理中断等问题。 适合人群:对FPGA开发和网络通信感兴趣的工程师,尤其是有一定Verilog编程基础的研发人员。 使用场景及目标:适用于需要在嵌入式系统中实现高效、稳定的TCP通信的应用场景。目标是帮助读者掌握FPGA与W5500结合进行网络通信的具体实现方法和技术细节。 其他说明:文章不仅提供了详细的代码实现,还分享了许多实践经验,如硬件连接注意事项、信号完整性问题的解决方案等。此外,作者还提到了未来的工作方向,如UDP组播和QoS优先级控制的实现。
python3.10以上 可安装pyside6(类似pyqt),具体安装操作步骤
内容概要:本文详细介绍了利用有限差分时域法(FDTD)进行可调谐石墨烯超材料吸收体的设计与仿真。文中解释了石墨烯超材料的基本结构(三层“三明治”结构)、关键参数(如化学势、周期、厚度等)及其对吸收性能的影响。同时展示了如何通过调整石墨烯的化学势来实现吸收峰的位置和强度的变化,以及如何优化结构参数以获得最佳的吸收效果。此外,还提供了具体的代码示例,帮助读者理解和重现相关实验结果。 适合人群:从事纳米光子学、超材料研究的专业人士,尤其是对石墨烯基超材料感兴趣的科研工作者和技术开发者。 使用场景及目标:适用于希望深入了解石墨烯超材料的工作原理及其潜在应用场景的研究人员;旨在探索新型可调谐光学器件的设计思路和发展方向。 其他说明:文中不仅分享了理论知识,还包括了许多实践经验,如避免常见错误、提高仿真相关效率的小技巧等。对于想要将研究成果应用于实际产品的团队来说,这些细节非常有价值。
随机生成2字,3字,4字,5字,6字,7字,8字,9字,10字的中文词组20个
内容概要:本文详细探讨了智能座舱域控设计的发展历程和技术趋势。首先介绍了智能座舱从被动式交互到主动式交互的技术演变,包括硬件和交互方式的进步。随后,文章重点讨论了智能座舱功能发展趋势,涵盖车载显示技术的多屏化、大屏化和高端化,以及SoC芯片的多核异构架构和算力融合,强调了其在智能座舱中的核心作用。此外,还阐述了电子电气架构从分布式向集成化的转型,分析了其面临的挑战和未来趋势。最后,基于当前智能座舱的发展需求,提出了一种基于双片龍鷹一号芯片的新域控平台设计方案,详细描述了其硬件设计实现方案,旨在提供高性能、高可靠性的智能座舱解决方案。 适合人群:汽车电子工程师、智能座舱研发人员及相关领域的技术人员。 使用场景及目标:①帮助读者理解智能座舱的技术发展历程及其未来发展方向;②为智能座舱域控平台的设计和开发提供参考和技术支持;③探讨电子电气架构的转型对汽车行业的影响及应对策略。 其他说明:文章结合实际案例和技术数据,深入浅出地解释了智能座舱的各项技术细节,不仅提供了理论指导,还具有较强的实践意义。通过对智能座舱域控平台的全面剖析,有助于推动智能座舱技术的创新发展,提升用户体验。
内容概要:本文详细介绍了多智能体协同编队控制的技术原理及其应用实例。首先通过生动形象的例子解释了编队控制的核心概念,如一致性算法、虚拟结构法和Leader-Follower模式。接着深入探讨了如何用Python实现基础的一致性控制,以及如何通过调整参数(如Kp、Ka)来优化编队效果。文中还讨论了实际工程中常见的问题,如通信延迟、避障策略和动态拓扑变化,并给出了相应的解决方案。最后,强调了参数调试的重要性,并分享了一些实用技巧,如预测补偿、力场融合算法和分布式控制策略。 适合人群:对多智能体系统、无人机编队控制感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解多智能体协同编队控制理论并能够将其应用于实际项目的研究人员和开发者。目标是帮助读者掌握编队控制的关键技术和实现方法,提高系统的稳定性和可靠性。 其他说明:文章不仅提供了详细的理论讲解,还附有具体的代码示例,便于读者理解和实践。同时,作者结合自身经验分享了许多宝贵的调试技巧和注意事项,有助于读者在实际应用中少走弯路。
评估管线钢环焊缝质量及其对氢脆的敏感性.pptx
C盘清理bat脚本自动清理C盘垃圾文件
GBT21266-2007 辣椒及辣椒制品中辣椒素类物质测定及辣度表示方法
弹跳球 XNA 游戏项目。演示如何使用 C# 在 Visual Studio XNA 中构建类似 arkanoiddx-ball 的游戏。
内容概要:文章全面解析了宇树科技人形机器人的发展现状、技术实力、市场炒作现象及其应用前景和面临的挑战。宇树科技成立于2016年,凭借春晚舞台的惊艳亮相和社交媒体的热议迅速走红,其人形机器人具备先进的运动控制算法、传感器技术和仿生结构设计。然而,市场炒作现象如高价租赁、二手市场炒作和虚假宣传等影响了市场秩序。尽管存在炒作,人形机器人在工业、服务和家庭领域仍具广阔前景,但也面临技术升级、成本控制、安全性和政策监管等挑战。 适合人群:对机器人技术、人工智能以及科技发展趋势感兴趣的读者,包括科技爱好者、投资者和相关行业的从业者。 使用场景及目标:①帮助读者了解宇树科技人形机器人的技术特点和发展历程;②揭示市场炒作现象及其影响;③探讨人形机器人的应用前景和面临的挑战。 其他说明:文章强调了宇树科技人形机器人在技术上的突破和市场上的表现,同时也提醒读者关注市场炒作现象带来的风险,呼吁各方共同努力推动人形机器人产业健康发展。
msvcp140.dll丢失怎样修复
超透镜是一种将具有特殊电磁特性的纳米结构、按照一定方式进行排列的二维平面透镜,可实现对入射光振幅、相位、偏振等参量的灵活调控,在镜头模组、全息光学、AR/VR等方面具有重要应用,具有颠覆传统光学行业的潜力。 目前,超透镜解决方案的市场处于起步阶段,企业根据客户的具体需求和应用场景为其定制专用超透镜或超透镜产品。 根据QYResearch最新调研报告显示,预计2031年全球超透镜解决方案市场规模将达到29.26亿美元,未来几年年复合增长率CAGR为79.55%。 全球范围内,超透镜解决方案主要生产商包括Metalenz, Inc., Radiant Opto-Electronics (NIL Technology),迈塔兰斯、纳境科技、山河元景等,其中前五大厂商占有大约77.84%的市场份额。 目前,全球核心厂商主要分布在欧美和亚太地区。 就产品类型而言,目前红外超透镜解决方案是最主要的细分产品,占据大约96.76%的份额。 就产品类型而言,目前消费电子是最主要的需求来源,占据大约36.27%的份额。 主要驱动因素: 独特性能优势:超透镜解决方案具有更轻薄、成本更低、成像更好、更易集成、更高效及更易自由设计等优势。能以微米级厚度实现传统厘米级透镜功能,还可集多个光学元件功能于一身,大幅减小成像系统体积、重量,简化结构并优化性能。 技术创新推动:超透镜解决方案技术不断取得进步,设计技术和工艺水平持续提升,其性能和稳定性得以不断提高。制造工艺方面,电子束光刻等多种技术应用到超透镜解决方案生产中,推动超透镜解决方案向更高分辨率、更高产量、更大面积、更高性能的方向发展。 市场需求增长:消费电子、汽车电子、医疗、工业等众多领域快速发展,对高精度、高性能光学器件需求不断增加。如在手机摄像头中可缩小模组体积、提升成像分辨率和降低成本;在汽车电子领域能提高车载摄像头、激光雷达等传感器性能。
内容概要:本文详细介绍了基于MATLAB和优化工具Gurobi/Cplex实现的新能源并网电力市场调度模型。该模型通过IEEE30节点系统进行仿真,重点探讨了风电接入对传统火电调度的影响。文中展示了关键决策变量如机组启停状态、实时出力以及风电出力的定义方法,并深入解析了目标函数的设计,特别是总成本函数中燃料成本、启停成本、备用成本和弃风惩罚之间的权衡。此外,文章还讨论了直流潮流约束的作用,以及节点电价计算背后的经济学原理。最后,通过对不同情景的模拟实验,验证了模型的有效性和实用性。 适用人群:适用于从事电力系统研究、电力市场运营管理和新能源并网调度的专业人士和技术人员。 使用场景及目标:①帮助理解和掌握新能源并网对电力市场调度的具体影响;②为制定合理的电力市场规则和政策提供理论依据和技术支持;③指导实际电力系统的调度操作,提高系统运行效率和经济效益。 其他说明:文中提供的代码片段和具体实现细节有助于读者更好地理解模型的构造和求解过程。同时,强调了在实际应用中需要注意的问题,如弃风惩罚系数的选择、备用容量的配置等。