潘慕晗 刘云
摘要:随着科学技术的发展,嵌入式系统对于大数据量高速率的存储要求越来越高,因此,该文提出一种用于嵌入式系统的高速存储系统模块。它作为一个独立模块存在于整个系统中,为系统中的所有成员提供文件服务,是通过SRIO以及网络进行通信以及数据交互。
关键词:嵌入式;存储系统;高速存储
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)35-0021-02
随着嵌入式的发展,越来越多的嵌入式平台对于存储性能的要求也越来越高。大数据量的存储,高速率的读写已经成为越来越多嵌入式用户的基本需求了。在嵌入式领域,串行Rapid IO(简称SRIO)作为一种高可靠、高性能、基于包交换的新一代高速互联技术,已经成为嵌入式系统互联的最佳选择之一。在嵌入式领域,很多产品都是在一个相对复杂的环境(震动、噪音等)下工作,老式的机械硬盘无法在这种环境下工作,而由NAND组成的固态盘克服了这些缺点,所以本文介绍的存储系统,就是通过SRIO进行互联,本地采用NAND阵列进行数据存储,以实现高速的读写。而用户在编程的过程中,只需要调用编程API即可,屏蔽了底层的协议以及数据传输。
1 存储系统
存储系统为用户提供远程的文件访问服务,其基本功能有文件的读写、文件的创建以及删除、文件系统的格式化、服务的连接与断开等。存储系统和用户之间采用请求-应答的模式进行通信,用户向存储系统发送请求,而存储系统则执行用户的请求,对本地的文件进行操作并将操作的结果以及数据返还给用户。系统对外有2种通信链路,分别是千兆以太网以及SRIO。以太网在系统中用作协议的传输,SRIO则用作数据传输,通过这种方式将数据与协议进行分离,同时确保SRIO只进行单纯的数据传输从而提高SRIO的传输速率。
存储系统的对外通信功能由以太网和SRIO组成,其本地存储功能是由NAND阵列和文件系统组成。NAND阵列是通过PCIe与系统互连的。NAND阵列作为存储介质的优势在于其容量大、性价比高、没有机械特性(可以在震动环境下工作)。文件系统用于管理NAND阵列,为系统提供文件管理服务。
2 系统实现
存储系统可以分为2各部分来实现,本地文件系统和服务程序。
本地文件系统在实现过程中,主要有2方面的考虑,NAND驱动以及文件系统的类型选择。一个大容量的存储系统,其容量应该在10TB以上,对于这个容量并不是所有的文件系统都可以支持的。本文选择使用Linux下的EXT4文件系统,该文件系统可以支持的容量达到1EB,而文件大小也由16TB。采用该文件系统,在后期可以对系统的容量进行较大的扩充,同时对于大型文件的支持也是相当不错。
拥有了一个文件系统后,则是考虑如何接收用户的请求并将用户的请求转换为本地操作,这就是服务程序。服务程序的功能是将用户的请求转换为本地操作并将操作结果以及数据传输给用户。服务程序需要关注的2个方面,分别是通信和数据传输。用户与存储系统通信时,是请求-应答的模式。这种模式下,存储系统完成本地的初始化后,就开始被动地等待用户请求,一旦接收到用户的请求就开始工作。
图1示了服务程序的基本流程,服务程序从接收到一个连接请求,到服务结束的基本流程。主线程在程序中的角色,是请求的接收者与分发者,从外部接收请求,将请求的内容分发给子线程来处理,主线程不处理请求。而子线程则是请求的执行者,完成用户的请求,当请求执行完,子线程也就结束消亡了。
在服务程序运行的过程中,需要保证各个子线程之间使用的资源是互斥的。以避免出现读写不一致、SRIO发送失败的情况。
下面对单用户以及多用户的情况进行分析。
单用户连接时,系统资源都被该用户所占有,并不会有其他用户或程序来抢占资源,所以单用户情况下系统在逻辑上不会有问题。
当有多个用户连接时,服务程序中将有多个子线程。当他们不操作同一个文件时,这些子线程是独立运行的。如果有2个用户同时打开某个文件时,其中有个用户必然会打开失败。那么该用户只能等待这个文件被关闭后再打开,这时子线程会通知用户文件打开失败。这样子线程对于文件的操作是互斥的。
再考虑2个子线程同时向用户发送数据的情况,这时必然发生资源抢占的问题。因此要为SRIO发送创建一个信号量,所有需要使用SRIO的子线程都必须先获取该信号量,才能使用SRIO来发送数据。这样做,在所有子线程都需要使用SRIO发送数据时,会使得多数子线程进入等待,但SRIO速率高,子线程的等待时间不会过长,应该在可以接受的范围内。所以对于SRIO发送,采用一个信号量来互斥多个子线程的操作。
可以看出,在单用户和多用户的情况下,通过信号量以及一些特殊的限制使得系统资源对于用户都是互斥的。当一个用户占有了该资源后,其他用户无法获取该资源,只能等待该资源被释放后,才能获得。
图2双方通信的包格式,其中用户ID用于区别不同的用户,是存储系统分配给用户的;包属性是保留字段;命令字用于表示用户请求的类型或者系统回应的类型;参数是命令字的后续部分。本通信协议是建立在tcp/ip协议之上,因此协议在传输过程中的可靠性不需要系统考虑。
拥有了通信协议后,考虑存储系统的数据传输。数据传输的协议是SRIO,而在SRIO中传输模式中,速率最高的是DIO/DMA(Direct IO/Direct Memory Access),所以本文采用这种模式来进行数据传输。在DIO/DMA模式下,SRIO传输数据是直接向对方的内存中写入数据,这就需要在模块初始化的时候对内存进行一定的规划,以避免数据混乱。在内存规划时,主要是考虑为不同的用户分配不同的内存空间,对不同用户的数据进行隔离以保证数据的正确性以及安全性。
在存储系统工作中,数据传输应该是占据了大部分的时间,所以在系统实现时,应该尽可能的取出一些不必要的操作,以保证数据传输的占有比。存储系统在处理读文件操作时,读出的数据应该是考虑对齐的问题,以避免SRIO发送时的2次拷贝。
3 系统瓶颈
存储系统的瓶颈主要表现在存储总容量以及读写速率上。存储总容量可以通过增加NAND芯片的容量以及数量来改善。
存储系统的读写速率瓶颈,主要有三方面,硬件传输速率的限制、软件数据转发的速率、网络通信延迟造成的速率降低。
1) 硬件传输速率的限制是由PCIe的速率以及SRIO的速率决定的,两者中速率较慢的成为瓶颈;
2) 软件转发的速率是指文件读写过程中需要将数据写入到内存中才能传输,例如存储系统从文件系统中读出一段数据,它不会直接通过SRIO发送,而是先存放在内存中,再通过SRIO发送,这样就使得文件在读写过程需要更多的时间;
3) 网络通信的延时一般都在几十微秒以上,如果在文件读写过程中,存在较多的协议通信,必然会造成整体的速率降低。
对于存储系统的读写速率瓶颈,除了硬件造成的瓶颈是软件无法改善的,其余2个都可以通过一定的手段进行改善。
1) 软件转发速率,可以通过一个二级流水线加快转发的速度。当内存中写入的数据达到了一次的传输量后,就开始传输同时继续写入,形成一个二级的流水线。这种模式需要2个并行的线程来支持,并且只对数据量较大的情况适用。而该存储系统就是为大数据量的存储而设计的,所以采用该方式对于提高性能有一定的帮助。
2) 减少在整个服务过程中的通信次数,例如文件的读写,尽量在一次操作中完成,而不是将一批数据分多次读写。
4 总结
本文介绍了一种用于大数据量的存储系统,分析了其基本的工作机理,以及瓶颈所在,并提出了相应的解决方案。在下一步工作中,将会使用SRIO来传输通信协议,以解决网络延迟的问题。
参考文献:
[1] 陈智育.嵌入式系统中的Flash文件系统[J].单片机与嵌入式系统应用,2002(7).
[2] 董明,刘加,刘润生.适宜于嵌入式多媒体应用的Flash文件系统[J].电子技术应用,2002(6).
[3] 沈莉.PVFS文件系统及在集群系统中的应用[J].高性能计算技术,2005(7).