一种共享文件系统中实现快速接收和储存数据的方法转让专利

申请号 : CN201711095379.9

文献号 : CN107749893B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 徐荣波黄贤强许珊珊张广东赵子兰张跃

申请人 : 北京精一强远科技有限公司

摘要 :

本发明涉及一种共享文件系统中实现快速接收和存储数据的方法,包括:视音频获取;视音频处理;发送视音频数据;接收视音频数据;写入文件。本发明利用大页内存、用户态网卡驱动以及数据和元数据分离技术,存储服务器可以快速的接收多个客户端发来的多路数据流,并写入到文件中,从而达到同时存储上百路视频流的目的。本发明有效提高了共享文件系统的并发访问效率,而且同时访问的文件越多,效果越加明显,对于常见的教育录播行业或者视频监控行业,在很大程度上提高了视频存储的效率。

权利要求 :

1.一种共享文件系统中实现快速接收和存储数据的方法,所述方法所使用的硬件系统包括:多个客户端通过LAN网络与基于Linux的NAS子系统连接,所述的NAS子系统包括存储服务器和存储盘阵,各个客户端通过LAN网络分别与多个IP摄像机连接,其特征在于,所述方法的步骤如下:

步骤1,视音频获取的步骤:用于多个客户端通过各自连接的多个IP摄像机采集视音频数据;

步骤2,视音频处理的步骤:用于各个客户端分别对各个IP摄像机所采集到的视音频数据进行处理,转码、打包;

步骤3,发送视音频数据的步骤:用于请求发送数据的客户端向存储服务器提出发送请求,与存储服务器建立连接,开辟本地缓存空间,在待发送包中填写私有协议包头,向存储服务器发送视音频数据;本步骤具体包括如下子步骤:(1)建立连接的子步骤:客户端向存储服务器发送连接请求,等待存储服务器应答,如果连接成功,则进入下述子步骤,否则退出;

(2)发送打开文件命令的子步骤:客户端指定待写入文件的信息,并根据预设的私有传输协议组包,发送给存储服务器,等待应答,如果打开文件成功,则进入下述子步骤,否则退出;

(3)开辟缓存空间的子步骤:如果成功打开文件,在客户端本地开辟缓存空间,用于存储待发送数据;

(4)发送待写入数据的子步骤:客户端从缓存空间每次取固定大小的数据,然后根据预设的私有传输协议组包,填充包头以及实际待写入数据,发送给存储服务器,循环发送,直至待写入数据发送完毕;

(5)发送关闭文件命令的子步骤:用于客户端向存储服务器发出请求,关闭已打开的文件句柄,完成本次文件写入;

步骤4,接收视音频数据的步骤:用于存储服务器设置大页内存并将大页内存申请为内存池,将用来接收视音频数据的网卡注册为UIO设备,初始化一至两个元数据队列和多个内容数据队列,并创建与注册为UIO设备的网卡相对应的接收数据线程,并将各个接收数据线程与CPU绑定,以接收客户端发来的视音频数据;本步骤具体包括如下子步骤:

1)设置大页内存的子步骤:用于存储服务器设置系统,以支持大页内存;

2)PCI设备初始化的子步骤:用于存储服务器扫描PCI设备,注册PCI驱动,并利用Linux UIO技术,把用来接收数据的网卡注册为UIO设备,这样客户端应用程序直接使用网卡发送或者接收数据;

3)开辟内存池的子步骤:用于存储服务器在大页内存中申请若干个固定大小的内存块,组成内存池,用于缓存网络报文;

4)初始化数据队列的子步骤:用于存储服务器初始化2个元数据队列和8个内容数据队列,接收数据线程收到视音频数据后,会对视音频数据进行分类,并把相应视音频数据放入当前含有最少视音频数据的对应元数据队列和内容数据队列中;

5)创建接收数据线程的子步骤:为每个注册为UIO设备网口创建一个接收数据线程,并将该接收数据线程绑定到CPU核上;

6)数据存储处理的子步骤:用于存储服务器处理接收到的视音频数据;接收数据线程采用定期轮询,每隔一段时间查询网口是否有新视音频数据到达,如果接收到视音频数据,会存到之前开辟的内存池中,然后转入数据存储处理的子步骤,如果没有接收到视频数据则继续轮询;本子步骤具体包括如下分步骤:a.解析私有协议数据包的分步骤:用于存储服务器按照预设的私有协议解析数据包;

b.选择处理的分步骤:如果数据包中的数据为打开文件、关闭文件以及设置文件属性的相关元数据操作任务命令,则把这些任务命令加入元数据队列中;如果为待写入的内容数据包,则把待写入的内容数据拷贝到内容数据队列中;

步骤5,写入文件的步骤:用于存储服务器分别通过元数据操作线程和内容数据操作线程将视音频数据写入文件;本步骤具体包括如下子步骤:①创建写文件线程的子步骤:用于存储服务器分别创建2个元数据操作线程和8个内容数据操作线程,用于处理后续的写文件任务;元数据操作线程执行元数据操作的子步骤,内容数据操作线程执行写入文件的子步骤;

②元数据操作的子步骤:从元数据队列中获取信息,执行相应的元数据操作;

③写入文件的子步骤:存储服务器从内容数据队列中,获取待写入内容数据,然后根据待写入文件的内容,获取元数据段,并根据所获得的元数据段,对磁盘发起写入文件的块数据请求,以完成该元数据段对应块数据写入,循环的申请元数据段和写入元数据段对应的块数据,直至完成整个文件的写入。

说明书 :

一种共享文件系统中实现快速接收和储存数据的方法

技术领域

[0001] 本发明涉及一种共享文件系统中实现快速接收和存储数据的方法,是一种应用于共享文件系统存储视频数据的方法,是一种适用于视频存储领域的快速接收和存储数据的
方法。

背景技术

[0002] 目前,通用的NAS共享文件系统由NAS服务器和多客户端通过LAN网络组成。客户端在LAN网络下通过tcp/ip协议与NAS服务器相连并通讯。客户端要进行文件写操作时,需通
过LAN网络不断的发送数据给NAS服务器。
[0003] NAS存储具有分离服务器和存储,减轻服务器负担,方便数据共享,对现有的网络环境有很好的适应性,高扩展性等优点,已广泛应用于视频存储领域,包括其中的一个重要
应用场景:多个客户端同时对NAS共享文件系统中的多个文件进行存取操作,比如教育录播
系统、视频监控系统。在教育录播系统或视频监控系统中,往往有数百个甚至更多的IP摄像
机,以及数十个客户端需要进行文件的写入和操作,面对这样庞大的视频数据的存储,传统
NAS文件系统普遍存在以下明显的不足:因为传统的网卡驱动方式,当多台客户端同时访问
NAS文件系统的多个文件时,NAS的性能大大的下降,最终不能满足用户的需求。传统的网卡
驱动为内核态网卡驱动,报文需要在用户态和内核态之间多次拷贝,当数据量增加时,开销
尤其明显;传统的网卡驱动采用的是中断模式的驱动,大量的中断会耗尽CPU资源,导致性
能严重下降;传统的网卡驱动中各个数据线程以及控制线程在各个CPU核之间来回调度,浪
费资源。以上不足造成了当多个客户端同时访问NAS文件系统中的多个文件时,速度严重下
降,实时性不能保障。

发明内容

[0004] 为了克服现有技术的问题,本发明提出了一种共享文件系统中实现快速接收和存储数据的方法。所述的方法通过特定的方法快速接收和存储多路数据流,以达到多个客户
端同时对多个文件进行存取的目的。
[0005] 本发明的目的是这样实现的:一种共享文件系统中实现快速接收和存储数据的方法,所述方法所使用的硬件系统包括:多个客户端通过LAN网络与基于Linux的NAS子系统连
接,所述的NAS子系统包括存储服务器和存储盘阵,所述的各个客户端通过LAN网络分别与
多个IP摄像机连接,所述方法的步骤如下:
[0006] 视音频获取的步骤:用于多个客户端通过各自连接的多个IP摄像机采集视音频数据;
[0007] 视音频处理的步骤:用于各个客户端分别对各个IP摄像机所采集到的视音频数据进行处理,转码、打包;
[0008] 发送视音频数据的步骤:用于请求发送数据的客户端向存储服务器提出发送请求,与存储服务器建立连接,开辟本地缓存空间,在待发送包中填写私有协议包头,向存储
服务器发送视音频数据;
[0009] 接收视音频数据的步骤:用于存储服务器设置大页内存并将大页内存申请为内存池,将接收数据的网卡注册为UIO设备,初始化一至两个元数据队列和多个内容数据队列,
并创建与各个队列对应的接收数据线程,将各个接收数据线程与CPU绑定,以接收客户端发
来的视音频数据;
[0010] 写入文件的步骤:用于存储服务器分别通过元数据操作线程和内容数据操作线程将视音频数据写入文件。
[0011] 进一步的,所述的“发送视音频数据的步骤”包括以下子步骤:
[0012] 建立连接的子步骤:客户端向存储服务器发送连接请求,等待存储服务器应答,如果连接成功,则进入下述子步骤,否则退出;
[0013] 发送打开文件命令的子步骤:客户端指定待写入文件的信息,并根据预设的私有传输协议组包,发送给存储服务器,等待应答,如果打开文件成功,则进入下述子步骤,否则
退出;
[0014] 开辟缓存空间的子步骤:如果成功打开文件,在客户端本地开辟缓存空间,用于存储待发送数据;
[0015] 发送待写入数据的子步骤:客户端从缓存空间每次取固定大小的数据,然后根据预设的私有传输协议组包,填充包头以及实际待写入数据,发送给存储服务器,循环发送,
直至待写入数据发送完毕;
[0016] 发送关闭文件命令的子步骤:用于客户端向存储服务器发出请求,关闭已打开的文件句柄,完成本次文件写入。
[0017] 进一步的,所述的“接收视音频数据的步骤”包括以下子步骤:
[0018] 设置大页内存的子步骤:用于存储服务器设置系统,以支持大页内存;
[0019] PCI设备初始化的子步骤:用于存储服务器扫描PCI设备,注册PCI驱动,并利用Linux uio技术,把用于接收数据的网卡注册为uio设备,这样便可以在用户态直接使用该
网卡进行发送和接收数据;
[0020] 开辟内存池的子步骤:用于存储服务器在大页内存中申请若干个固定大小的内存块,组成内存池,用于缓存网络报文;
[0021] 初始化数据队列的子步骤:用于存储服务器初始化2个元数据操作队列和8个数据操作队列,接收数据线程收到视音频数据后,会对视音频数据进行分类,并把相应视音频数
据放入当前含有最少视音频数据的对应队列中;
[0022] 创建接收数据线程的子步骤:为每个注册为UIO设备网口创建一个接收数据线程,并将该接收数据线程绑定到CPU核上;
[0023] 数据存储处理的子步骤:用于存储服务器处理接收到的视音频数据;接收数据线程采用定期轮询,每隔一段时间查询网口是否有新视音频数据到达,如果接收到视音频数
据,会存到之前开辟的内存池中,然后转入数据存储处理的子步骤,如果没有接收到视频数
据则继续轮询。
[0024] 进一步的,所述的“数据存储处理的子步骤”包括以下分步骤:
[0025] 解析私有协议数据包的分步骤:用于存储服务器按照预设的私有协议解析数据包;
[0026] 选择处理的分步骤:如果数据包中的数据为打开文件、关闭文件以及设置文件属性等相关元数据操作任务命令,则把这些任务命令加入元数据操作队列中;如果为待写入
的内容数据包,则把待写入的内容数据拷贝到内容数据操作队列中。
[0027] 进一步的,所述的“写入文件的步骤”包括以下子步骤:
[0028] 创建写文件线程的子步骤:用于存储服务器分别创建2个元数据操作线程和8个内容数据操作线程,用于处理后续的写文件任务;元数据操作线程执行元数据操作的子步骤,
内容数据操作线程执行写入文件的子步骤;
[0029] 元数据操作的子步骤:从元数据操作队列中获取信息,执行相应的元数据操作;
[0030] 写入文件的子步骤:存储服务器从内容数据队列中,获取待写入内容数据,然后根据待写入文件的内容,获取元数据段,并根据所获得的元数据段,对磁盘发起写入文件的块
数据请求,以完成该元数据段对应块数据写入,循环的申请元数据段和写入元数据段对应
的块数据,直至完成整个文件的写入。
[0031] 本发明产生的有益效果是:本发明所述的方法利用大页内存、用户态网卡驱动以及数据和元数据分离技术,存储服务器可以快速的接收多个客户端发来的多路数据流,并
写入到文件中,从而达到同时存储上百路视频流的目的。利用大页内存,减少缺页中断,提
高内存访问效率;利用用户态网卡驱动技术缩短了网卡处理数据包的时间,并且打破了传
统网卡驱动高并发时性能的局限性,同时避免了数据在用户空间和内核空间的来回拷贝,
使得数据可以直接在用户空间下直接写到磁盘中去,同时使用数据和元数据分别处理技
术,加快了数据存储速度。本发明有效提高了共享文件系统的并发访问效率,而且同时访问
的文件越多,效果越加明显,对于常见的教育录播行业或者视频监控行业,在很大程度上提
高了视频存储的效率。

附图说明

[0032] 下面结合附图和实施例对本发明作进一步说明。
[0033] 图1是本发明的实施例一所述方法所述使用的硬件系统图;
[0034] 图2是本发明的实施例一所述方法的流程图;
[0035] 图3是本发明的实施例二所述的发送视音频数据的步骤流程图;
[0036] 图4是本发明的实施例三所述的控制线程处理流程图;
[0037] 图5是本发明的实施例三所述的数据线程接收数据的流程图;
[0038] 图6是本发明的实施例四所述的数据存储处理过程的示意图。

具体实施方式

[0039] 实施例一:
[0040] 本实施例是一种共享文件系统中实现快速接收和存储数据的方法,所述方法所使用的硬件系统包括:多个客户端通过LAN网络与基于Linux的NAS子系统连接,所述的NAS子
系统包括存储服务器和存储盘阵,所述的各个客户端通过LAN网络分别与多个IP摄像机连
接,如图1所示。
[0041] 多所述的客户端可以是普通的PC机工作站,也可以是服务器,具有连接LAN网络的能力,并可以从视音频源处采集视音频数据。本实施例所述的LAN网络是由以太交换机组成
并使用TCP/IP为通讯协议的以太网,是带宽超过1G的宽带网络,可以传输高清晰度的视频
文件。视音频源为高清IP 摄像机,能提供大码率高清视频码流。存储系统是基于Linux的
NAS,其中存储服务器是NAS服务器,存储盘阵是多个磁盘组成的存储阵列。
[0042] 本实施例的基本思路是:在进行视音频管理时,多个客户端从IP摄像机处获取实时视频数据,进行视频处理,转码、打包等,之后通过特定的传输以及存储方法将视频数据
保存到存储服务器。该传输以及存储方法可以提高存储服务器的并发访问效率,使得多个
客户端可以同时对上百路视频流进行存储操作,同时,多个客户端也可以同时对上百路视
频流进行回放操作,保证客户端能够实时处理多路视频。本实施例所述方法可表述为:多个
客户端在IP摄像机处采集视频数据并经过处理,生成多个视频流,分别为data1, data2, 
data3, …,dataN,通过共享文件系统使用特定的传输以及存储方法将多个视频流数据
data1,data2,data3,…,dataN快速存储到共享存储内,生成多个视频文件file1,file2,
file3,…,fileN,使得客户端可以同时对多个IP摄像机进行录像以及录像回放操作,从而
提高客户端的视频管理能力。
[0043] 在通常的NAS服务器中,传统的网卡驱动为内核态网卡驱动,报文需要在用户态和内核态之间多次拷贝,当数据量增加时,开销尤其明显;传统的网卡驱动采用的是中断模式
的驱动,大量的中断会耗尽CPU资源,导致性能严重下降;传统的网卡驱动中各个数据线程
以及控制线程在各个CPU核之间来回调度,浪费资源。本实施例则采用基于Linux UIO技术
的用户态网卡驱动,避免数据在用户空间和内核空间来回拷贝,节省CPU资源。Linux系统中
一般的驱动设备都是运行在内核空间,在用户空间用应用程序调用即可,而UIO则是将驱动
的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能,本实施例中网卡
驱动的数据接收以及发送功能都在用户态实现,因此避免了数据在用户空间和内核空间的
多次拷贝操作。
[0044] 本实施例把各个数据线程以及控制线程绑定到不同的CPU核上,提高了存储服务器的并发访问效率。从而使得客户端可以同时对多路IP摄像机进行录像存储以及录像回
放,这在IP摄像机安装密集的项目中意义尤其重大。
[0045] 本实施例所述共享文件系统中实现快速接收和存储数据的方法的具体过程如图2所示,具体步骤如下:
[0046] 1、视音频获取的步骤:用于多个客户端通过各自连接的多个IP摄像机采集视音频数据。本步骤中客户端与IP摄像机对接,获取IP摄像机的实时视频数据。
[0047] 2、视音频处理的步骤:用于各个客户端分别对各个IP摄像机所采集到的视音频数据进行处理,转码、打包等。
[0048] 3、发送视音频数据的步骤:用于请求发送数据的客户端向存储服务器提出发送请求,与存储服务器建立连接,开辟本地缓存空间,在待发送包中填写私有协议包头,向存储
服务器发送视音频数据。本步骤中客户端把从IP摄像机采集到的并经过处理的视频数据发
送到存储服务器,进行存储。
[0049] 4、接收视音频数据的步骤:用于存储服务器设置大页内存并将大页内存申请为内存池,将用来接收视音频数据的网卡注册为UIO设备,初始化一至两个元数据队列和多个内
容数据队列,并创建与注册为UIO设备的网卡相对应的接收数据线程,并将各个接收数据线
程与CPU绑定,以接收客户端发来的视音频数据,如图4所示。
[0050] 本步骤与传统NAS存储有以下不同:使用了大页内存,减少缺页中断,提高内存访问效率;使用用户态网卡驱动,避免数据在用户态和内核态之间来回拷贝;采用线程绑定,
消除线程在各个CPU核来回调度的开销。
[0051] 5、写入文件的步骤:用于存储服务器分别通过元数据操作线程和内容数据操作线程将视音频数据写入文件。本步骤首先创建写文件线程,可以在存储服务器创建一到两个
元数据操作线程和多个内容数据操作线程,用于处理后续的写文件任务。元数据操作线程
执行元数据操作,数据操作线程执行写入文件。写入文件时,存储服务器循环的申请元数据
段和写入元数据段对应的块数据,直至完成整个文件的写入。
[0052] 实施例二:
[0053] 本实施例是实施例一的改进,是实施例一关于“发送视音频数据的步骤”的细化。本实施例所述的“发送视音频数据的步骤”包括以下子步骤,过程如图3所示:
[0054] 建立连接的子步骤:客户端向存储服务器发送连接请求,等待存储服务器应答,如果连接成功,则进入下述子步骤,否则退出。
[0055] 发送打开文件命令的子步骤:客户端指定待写入文件的信息,并根据预设的私有传输协议组包,发送给存储服务器,等待应答,如果打开文件成功,则进入下述子步骤,否则
退出。
[0056] 开辟缓存空间的子步骤:如果成功打开文件,在客户端本地开辟缓存空间,用于存储待发送数据。
[0057] 发送待写入数据的子步骤:客户端从缓存空间每次取固定大小的数据,然后根据预设的私有传输协议组包,填充包头以及实际待写入数据,发送给存储服务器,循环发送,
直至待写入数据发送完毕。
[0058] 发送关闭文件命令的子步骤:用于客户端向存储服务器发出请求,关闭已打开的文件句柄,完成本次文件写入。
[0059] 实施例三:
[0060] 本实施例是上述实施例的改进,是上述实施例关于“接收视音频数据的步骤”的细化。本实施例所述的“接收视音频数据的步骤”包括以下子步骤:
[0061] 设置大页内存的子步骤:用于存储服务器设置系统,以支持大页内存。
[0062] PCI设备初始化的子步骤:用于存储服务器扫描PCI设备,注册PCI驱动,并利用Linux UIO技术,把用来接收数据的网卡注册为UIO设备,这样用户态应用程序直接使用网
卡发送或者接受数据。
[0063] 开辟内存池的子步骤:用于存储服务器在大页内存中申请若干个固定大小的内存块,组成内存池,用于缓存网络报文。
[0064] 初始化数据队列的子步骤:用于存储服务器初始化2个元数据操作队列和8个内容数据操作队列。后续接收数据线程收到视音频数据后,根据数据包内容进行区分,如果是视
音频元数据,会把该视音频元数据放入当前含有最少的元数据操作队列中;同样如果是视
音频内容数据,会把该视音频内容数据放入当前含有最少视音频内容数据的队列中。本实
施例设置了10个队列,其中2个对应元数据,8个对应内容数据队列。
[0065] 创建接收数据线程的子步骤:每个网口创建一个接收数据线程,并将该接收数据线程绑定到CPU核上。在CPU主核上绑定控制线程,用于初始化存储服务器的PCI设备,设置
大页内存,开辟内存池,并创建多个数据线程,过程如图4所示。创建过程首先,查询存储服
务器之前设置为UIO设备的网口数量,这些网口都是用来接收数据的,针对每个网口创建一
个接收数据线程,然后查询各个CPU核的占用率,选取一个占用率最小的CPU核,将接收数据
线程绑定到该CPU核上,并且每个CPU核只能绑定一个数据接收线程。本实施例中存储服务
器中可以采用4口网卡,6核CPU,因此创建4个接收数据线程,然后查询各个CPU核的占用率,
选取4个占用率相对较小的CPU核,每个核绑定一个接收数据线程。
[0066] 数据存储处理的子步骤:用于存储服务器处理接收到的视音频数据,如图5所示,每个接收数据线程采用定期轮询查询跟本接收线程绑定的UIO网口设备是否有新视音频数
据到达,如果接收到视音频数据,把接收到的数据暂时存储到之前开辟的内存池中,然后进
行数据存储处理过程,如果没有接收到视频数据则继续轮询。图5表示与1 4核绑定的1 4内
~ ~
容数据线程的接收过程。
[0067] 实施例四:
[0068] 本实施例是上述实施例的改进,是上述实施例关于“数据存储处理的子步骤”的细化。本实施例所述的“数据存储处理的子步骤”包括以下分步骤,如图6所示:
[0069] 解析私有协议数据包的分步骤:用于存储服务器按照预设的私有协议解析数据包。首先,根据存储服务器预设的私有协议对数据包进行解析,方便下一步进行判断本次接
收到时视音频数据是视音频元数据还是视音频内容数据。如果是视音频元数据使用私有协
议进行封装,主要包括是“打开文件”、“关闭文件”和“设置属性”等相关操作。
[0070] 选择处理的分步骤:如果数据包中的数据为打开文件、关闭文件以及设置文件属性任务命令,则把任务这些任务命令加入元数据操作队列中;如果为待写入的内容数据包,
则把待写入的内容数据拷贝到内容数据操作队列中。
[0071] 实施例五:
[0072] 本实施例是上述实施例的改进,是上述实施例关于“写入文件的步骤”的细化。本实施例所述的“写入文件的步骤”包括以下子步骤:
[0073] 创建写文件线程的子步骤:用于存储服务器分别创建2个元数据操作线程和8个内容数据操作线程,用于处理后续的写文件任务。元数据操作线程执行元数据操作的子步骤,
内容数据操作线程执行写入文件的子步骤。
[0074] 元数据操作的子步骤:从元数据操作队列中获取信息,执行相应的元数据操作。
[0075] 写入文件的子步骤:存储服务器从内容数据队列中,获取待写入内容数据,然后根据待写入文件的内容,获取元数据段,并根据所获得的元数据段,对磁盘发起写入文件的块
数据请求,以完成该元数据段对应块数据写入,循环的申请元数据段和写入元数据段对应
的块数据,直至完成整个文件的写入。
[0076] 最后应说明的是,以上仅用以说明本发明的技术方案而非限制,尽管参照较佳布置方案对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术
方案(比如所使用的硬件网络等、网络所使用的各种协议、步骤的先后顺序等)进行修改或
者等同替换,而不脱离本发明技术方案的精神和范围。。