ZYNQ+NVMe 小型化全国产存储方案
针对小型化的存储场景,使用单片ZYNQ7045/7100(复旦微FMQL45T900/FMQL100TAI)FPGA,实现数据接口、存储、文件系统管理、导入导出等功能。
实现规格:
1) 2盘组成RAID阵列,双盘4TB容量
2)EXT4标准文件系统
3)EXT4文件系统下2GB/s的写、读速度;自定义文件系统4GB/s的写、读速度。
4)万兆网网盘导出、千兆网盘导出、FTP导出
FPGA实现NVMe控制器,配合PCIe(软核/硬核),实现对NVMe电子盘的驱动控制功能。

PCIe实现2.0/3.0等不同的速率规格,可以针对不同的速率要求情况。
NVME控制器主要由PCIE接口适配器、AXI交换桥、PRP计算模块以及命令/文件系统通道模块构成。
PCIE接口适配器通过逻辑实现AXI的Master接口以及Slave接口到PCIE的接口转换。由AXI的Master接口实现盘主动读写内存的功能,由AXI的Slave接口实现PS对盘的SQ/CQ队列的读写。
PRP计算模块实现解析盘请求的PRP2地址,计算、传送内存页地址给盘,从而实现大于4KB的读写请求的内存地址传送功能。
命令通过通过解析PS传送过来的SQ指令,填充RPR1、PRP2地址,使数据通道始终指向PL DDR,以及文件系统数据始终指向PS DDR,文件系统通道由盘主动读写PS DDR实现。
数据通道通过盘解析SQ指令,通过AXI桥,主动访问PL DDR实现。

PCIE控制器主要完成PCIE协议传输层以及数据链路层协议。组TLP包发送给PHY控制器;对PHY层数据解析成TLP、LCRC、Sequence number等字段;实现ACK/NCK协议保证报文的可靠性;流控制管理,根据链路层报文更新credit值。
PHY控制器主要实现PMA/PCS层协议,实现高速串行总线的串并转换以及8B/10B编码等功能。接口适配功能将TL层自定义接口转换成标准的AXI Stream总线接口。
PCIE控制器可使用软核实现,也可以使用器件内的硬核。
SOC处理器PL和PS协同工作,共同完成数据高速实时记录、传输、存储、加卸载和文件管理等功能。 SOC内部采用异构的架构,PL完成带宽要求高、实时性要求高的底层协议转换处理,如以太网UDP协议处理、NVMe协议处理等,PS完成数据量比较小的处理,如文件系统管理、以太网L3以上的相关处理等。同时,PS还负责单板管理、版本在线升级、温度、电源电压等健康检测。
FPGA内部实现接口处理,包解析处理,对于要记录和加载的数据,经过包解析后会送到核心交换模块,进行存储接口的调配以及和PS的文件系统管理的交互。
软件驱动方案如下:

Linux应用层接受相关读写NVMe磁盘指令,通过PCIe硬核驱动将控制命令队列发送给自定义NVMe磁盘驱动,自定义驱动程序根据数据类型不同,然后将队列存放于PS端的DDR中,并通过门铃告知NVMe磁盘。磁盘接收到门铃通知后,去相应地址读取指令并解码,然后执行相关读写流程。

Linux系统应用层接受读写磁盘命令。触发系统调用函数,进程由用户态转换到内核态,文件系统通过目录项检索缓存,如果没有则创建文件。通过虚拟文件系统接口调用具体文件系统读写函数,此处为ext4文件系统。
经过文件系统的管理,创建磁盘管理的IO请求,此处IO请求分为,文件系统管理IO请求与原始数据读写请求。将修改后的IO请求发送给磁盘驱动,磁盘解码命令,并执行相关IO请求。
Linux ext4文件系统读写控制流程如下:

使用XILINX的ZYNQ7100作为测试核心板,如下图所示:

核心板背面为连接器

核心板的尺寸为 70mm x 80mm

底板上放两块NVMe的电子盘,核心板插在底板上进行测试。


整体硬件测试平台如下图:

每个盘写入1.2GB/s, Raid0可达到2.4GB/s

每个盘读出1.4GB/s, Raid0可达到2.8GB/s

每个盘写入2.1GB/s, Raid0可达到4.2GB/s

每个盘读出1.7GB/s, Raid0可达到3.4GB/s

可以看到,在系统下有两个Xilinx的PCIe设备。
2块1TB的盘组成RAID0阵列,文件系统为ext4。

写入1GB的数据,可以看到速度为2GB/s

按照本文方式处理,使用ZYNQ标准的文件系统下可以达到2GB/s的存储带宽。该方案的文件系统采用标准的Linux内核系统,移植性好,成本低,运行也稳定。
通过PCIE核的更换,PCIe核的增加,也能够适应不同的存储带宽核存储容量的需求。
如果有技术实现细节相关的讨论,欢迎来电交流,13882182579。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR