大数据时代已经到来,面对各行各业日益增长的海量信息数据,我们应该如何去收集数据、存储数据(storing)、保留筛选数据(preserving)、分析数据、以及根据数据分析的结果采取相应行动的一系列过程,在大数据背景下这些问题都面临着巨大的挑战。
今天,我想从计算机体系结构中的存储层次结构(memory hierarchy)的角度出发,讨论一下在如今的大数据背景下,存储层次结构应该需要进行哪些创新,才能适应日益增长的大数据应用。
存储层次结构从处理器上的私有(private cache)和共享缓存(shared cache)、主存(memory)、外部存储(storage)等这三级结构。
(1) 处理器缓存相关的创新
处理器缓存的具体实现是由硬件决定的,其上的缓存组织形式以及缓存块的替换算法也都是硬件厂商决定的。但是,就研究而论,可以对缓存的组织形式和缓存块的替换算法等在simics和gem5等模拟器上实现。处理器上缓存的性能是计算机系统中最能直接影响应用程序性能的地方。一般缓存的设计是按照系统中适合各种应用程序的通用场景设计的,而现在的大数据环境下,应用数据的组织形式和使用方式都有所不同(比如海量图片的处理、地图位置信息的处理等等),因此,具有针对性地使用处理器缓存,以达到更好的性能和QoS保证是一个比较不错的尝试。
目前在研究的针对NUMA架构的服务器上,对共享缓存的使用进行优化,调度系统中的任务,使各个NUMA节点的共享缓存能够更加合理的使用,提高系统的吞吐率。通过调度的方法解决共享缓存资源竞争的问题,已经是一个研究比较多的点了。从目前看,这种方式可以提高性能,但是有比较大的不确定性。并不是所有场景都能通过调度解决性能问题。在这个调度方法提出来之前,采用动态的缓存分块技术解决共享缓存资源利用问题的方法是一种研究比较成熟的技术。调度和分块这两种技术能否进行结合使用,取长补短,调度方式更加灵活,相应系统的程序行为变化比较及时,而分块的方法更能够保证程序性能的稳定性。因此,两种技术相结合,既能提高性能,同时也保证程序的QoS。
传统操作系统的应用进程对处理器缓存的使用特点和在虚拟化环境下的缓存使用特点应该是不一样的(有待实验验证)。 虚拟化带来更多的系统开销,虚拟机之间的切换开销要远大于普通进程之间的切换开销,同时,在虚拟机环境下,TLB的使用也和传统OS对TLB的使用也有所不同。特别是虚拟机里运行特殊的应用时,比如移动应用APP的服务端程序跑在虚拟机中,对处理器缓存和TLB的使用特点需要进一步研究,提出能够更好适应这些大数据背景下的新型应用场景。
和缓存相关的还有就是移动端的智能设备,现在智能手机的硬件处理能力越来越强。已经出现8核处理器(4个大核+4个小核),这种异构多核处理器的架构,对系统软件的设计提出了更高的要求,如何实现异构处理器平台上的缓存有效利用、调度管理等问题也已经摆在我们面前。
以上几点是自己感兴趣和在做的内容,关于缓存的内容还有很多。
(2)主存相关的创新
目前的主存介质主要还是以DRAM为主。 主存是计算机系统中很重要,也是很复杂的一块内容。单纯的一个Linux内核中的内存管理模块子系统就已经足够复杂。如何能够高效地利用主存,减少运行的应用程序访问外存的次数,是一直需要不断提高的技术点。我只把自己感兴趣的几点内容写一写,相信以后还会有补充。
我以前的研究主要集中在主存这部分,试图建立一个分布式共享内存(Distributed Shared Memory)的系统。但是,我目前感觉分布式的共享内存系统已经不适应现在的大数据的应用场景了,以前的DSM系统是为了解决单台机器无法提供足够内存容量(访存空间)和性能,把多台机器的物理地址编址成统一的内存地址,可以让跑在DSM系统上的程序可以透明地访问内存不在本地机器上的数据。但是,这种方式产生了巨大的开销,内存数据一致性的协议也是非常地复杂。我觉得,现在的分布式大型应用,单个线程对性能的要求都不会超过一台服务器所能够提供的范围。而线程与线程之间可以通过消息通信的机制进行数据的同步和共享,这种方式更加高效,更具备可扩展性。 其实,某种意义上,NUMA架构就是软件DSM系统的硬件实现。
为了更加充分地利用内存资源,现在的memcached项目是业界普遍采用的方式,以提高数据中心对实时性要求较高的应用访问数据的响应速度。Memcached使用key-value的形式存储数据在内存中,通过哈希表和缓存替换算法维护存储在主存中的数据。我觉得,在大数据应用场景下,in-memory的处理特性是一个大趋势,这方面应该有非常广阔的研究前景。但是,需要比较好的系统结构的基础以及对并行算法有比较深入的研究。这是分布式的问题,单台机器上性能提升是一个永恒的话题,但是分布式的问题更具挑战性,意义也是非常大的。分布式系统中存在的问题更多,性能提升空间更大。
和主存相关的还有就是主存和外存的接口处,以及处理器和主存的接口处。我觉得这两个接口处是存在问题比较多的地方,现在的多核处理器在访问内存数据的使用还是需要排队访问内存的,这就导致的多核处理器访问内存的性能瓶颈,如何提升并行内存访问的性能是一个巨大的难题,可以借鉴GPU的模式,怎么提高并行性。就算有那么一点点的提高,我觉得都是一个比较大的贡献了。 第二个接口处,就是主存和外存的接口,现在外存的介质丰富起来了,不仅有机械磁盘,还有固态硬盘,手机上的闪存等。这些介质的工作原理是非常不一样的,而现在主存和外存的接口是统一的,这样一来,难免影响新型的存储介质的性能发挥。这方面的研究也是一个比较重要的点,毕竟目前计算机系统中最大的性能瓶颈在于外部IO访存的速度过慢。
当然,主存中还有很多问题需要解决,比如虚拟化环境下,目前的页表维护工作我总觉得是非常地冗长和繁杂的,效率也不够高,这是一项巨大的工程,如果能在这里面找到新的问题,提出创新的解决方案,是一件令人激动的事情。 还有,虚拟机的内存共享问题,如何识别虚拟机之间(同一台物理机上的虚拟机之间以及不同物理机上的虚拟机之间)的数据共享情况,通过调度,进一步提高内存的利用率,也是一件非常值得做的事情。
(3)外部存储相关的创新
我个人觉得,外部存储是大数据的基石。没有外部存储技术的快速发展,也没有今天大数据概念的提出。现在外部存储的容量越来越大,但是,仍然不能够满足存储现在人们利用各种设备生产的数据。因此,如何提高数据存储的效率,去除冗余的数据,保证数据存储的可靠性等方面都是亟待解决的问题。
关于外部存储,我觉得非常重要的一个方向是大规模分布式文件系统的设计。这种大规模分布式文件系统(hdfs、ceph文件系统等)都还不是很成熟,也肯定存在诸多问题。性能问题,扩展性问题,稳定性问题等等。这些都是亟待解决的,而且对于大规模的数据,其文件类型也是千差万别的,怎么样去设计文件系统去适应各种不同类型的文件(文字、图片、视频、地图信息等等)。起初,我是对分布式文件系统比较感兴趣的,但是,现在精力不够,不知道哪一天又会重新去研究它。
外部存储需要创新的地方是如何高效可靠地利用SSD存储介质,提高外部存储的访问性能,保证寿命、降低能耗等等。由于SSD的工作原理和传统的机械硬盘相差较大,目前的文件系统其实不能够很好地发挥出SSD硬盘的特性。怎么去设计一种新的系统结构,包括和内存的结合,Linux内核的文件缓存部分和文件系统以及设备驱动这些方面都存在需要改进的地方,需要提出创新解决问题的方法。
先写这么多吧,感觉离自己期望写出来的东西还有点远,慢慢进步吧!