HUNDSUN®
一、场景介绍
1.1 背景概述
由于DMA通道只有一个,资源上的限制,客户只能启动一个程序接收行情数据。客户策略存在多个的场景,目前是订阅所有策略关注的品种和合约,然后各个策略相互过滤不需要的行情,这个过滤存在性能上的损耗。FPGA行情上期支持多通道隔离,满足不同策略使用不同通道订阅行情,我们支持16个DMA通道,多个通道之间独立订阅和使用行情,一张U50板卡相当于同时拥有16个FPGA。策略比较多的场景,可以一个策略一个线程一个通道,只订阅当前策略关注的行情。就不用在多个策略使用行情上取并集,然后各个策略再去过滤。多通道可以把这个过滤放到FPGA内部,同时支持多线程和多进程使用,充分利用多核CPU的优势。
1.2 读者对象
- 开发工程师
- 技术支持工程师
- 测试工程师
- 维护工程师
二、测试环境
2.1 FPGA固件机器
FPGA固件机器,将最新集成固件上传到该机器,执行以下命令刷固件,
--file_path指定固件rbf文件。
- 使用案例
enyx-firmware-manager --board=0 --file_path=shell_top_xilinx_u50_mem_eth_dyn.rbf --force driver
注意
重刷固件后需
reboot。
2.2 tcpreplay回放机器
tcpreplay向FPGA固件机器发送回放数据。
- 使用案例
tcpreplay -i p4p1 --pps=1000 zt_shfe_20230131_am_end.pcap
注意
-i指定发送口,需要提前确认接线。--pps指定发送速度。
三、配置说明
config.ini配置文件参考内容如下
[config]
device=xilinx0:0
# set cpucore=-1 to disable cpu binding
cpucore=5
ine2ps=disabled
shfe2ps=enabled
shfe4ps=disabled
ine4ps=enabled
# SHFE A/B 2ps/4ps, change only if SHFE change them.
shfe2ps_ip_a=239.3.42.71:21000
shfe2ps_ip_b=239.4.42.72:21000
shfe4ps_ip_a=239.3.2.3:21101
shfe4ps_ip_b=239.4.2.4:21101
# INE A/B 2ps/4ps, change only if INE change them.
ine2ps_ip_a=239.3.52.71:25000
ine2ps_ip_b=239.4.52.72:25000
ine4ps_ip_a=239.3.151.91:25101
ine4ps_ip_b=239.4.151.92:25101
# SHFE/INE topic id, change only if SHFE/INE change them.
shfe2ps_topic_id=1000
shfe4ps_topic_id=1101
ine2ps_topic_id=5000
ine4ps_topic_id=5101
# SHFE/INE TCP Snap port, change only if SHFE/INE change them.
shfe2ps_snap_port=33022
shfe4ps_snap_port=22000
ine2ps_snap_port=33022
ine4ps_snap_port=22000
# Does the startup wait for the snapshot to initialize the FPGA based on changes in the configuration file crc
crc_mux_check=0
# 0 to 15 bit identify whether the corresponding channel has the last tick enabled. Corresponding maximum contract number of the subject.
last_tick_channel=0
shfe2ps_max_inst_no=81000
shfe4ps_max_inst_no=81101
ine2ps_max_inst_no=85000
ine4ps_max_inst_no=85101
# license key
license=KkRBeU5qSTBPQT49$LWpBeU5URXlNhkU9
# 0 to 3 bits, respectively, are the error, warning, info, and debug log level bits. When the corresponding bit is set to 1, record the corresponding level log information
# Support specified log path ,must modify all config_*.ini . eg. log_path=/
log_level=15
# Network version configuration item, copying 0 channel subscription contract market push
DSTMAC=01:00:5E:01:02:03
DSTIP=224.1.2.3
DSTPORT=5000
SRCMAC=64:3f:5f:01:02:03
SRCIP=10.253.1.115
SRCPORT=1234
[channel0]
# subscribe instruments, e.g. all to receive all instruments, or ag2201,bu,ag2306P5800
insts=all
options=recv
[channel1]
insts=ag2512P6700,ag2510,ag2509P9,cu2509,fu,ni,rb2507C2800
options=recv
[channel2]
insts=ag2512P6700,ag2510,ag2509P9
options=norecv
[channel3]
insts=ag,al,al,au2504,sc25
options=norecv
[channel4]
insts=all
options=recv
#[channel5]
#insts=pb,ni,fu,cu,au
#options=norecv
3.1 [config]
0通道做统一订阅配置管理,1-15通道的行情订阅合约,在0通道config.ini对应“channel通道编号”配置即可。其他通道相互独立,可随时独立重启。如果盘中涉及到订阅合约变更,在0通道config.ini修改后重启0通道程序,其他通道程序无须重启。1-15通道就是一个纯receiver,只需关注device和cpucore配置即可。
device:设备配置,指定卡号和通道号xilinx卡号:通道号,如果是0卡0通道,配置xilinx0:0cpucore:设置绑核,多通道建议设置不同绑核编号(编号范围可lscpu查看)shfe2ps:上海每秒两笔是否启用标识,默认启用(enabled:启用disabled:不启用)shfe4ps:上海每秒四笔是否启用标识,默认不启用(enabled:启用disabled:不启用)ine2ps:能源每秒两笔是否启用标识,默认不启用(enabled:启用disabled:不启用)ine4ps:能源每秒四笔是否启用标识,默认启用(enabled:启用disabled:不启用)shfe2ps_ip_a:上海每秒两笔A路组播地址端口配置,239.3.42.71:21000shfe2ps_ip_b:上海每秒两笔B路组播地址端口配置,239.4.42.72:21000shfe4ps_ip_a:上海每秒四笔A路组播地址端口配置,239.3.2.3:21101shfe4ps_ip_b:上海每秒四笔B路组播地址端口配置,239.4.2.4:21101ine2ps_ip_a:能源每秒两笔A路组播地址端口配置,239.3.52.71:25000ine2ps_ip_b:能源每秒两笔B路组播地址端口配置,239.4.52.72:25000ine4ps_ip_a:能源每秒四笔A路组播地址端口配置,239.3.151.91:25101ine4ps_ip_b:能源每秒四笔B路组播地址端口配置,239.4.151.92:25101shfe2ps_topic_id:上海每秒两笔行情主题,1000shfe4ps_topic_id:上海每秒四笔行情主题,1101ine2ps_topic_id:能源每秒两笔行情主题,5000ine4ps_topic_id:能源每秒四笔行情主题,5101shfe2ps_snap_port:上海每秒两笔TCP快照端口,33022shfe4ps_snap_port:上海每秒四笔TCP快照端口,22000ine2ps_snap_port:能源每秒两笔TCP快照端口,33022ine4ps_snap_port:能源每秒四笔TCP快照端口,22000crc_mux_check:是否检测配置文件CRC变化,无变化不初始化FPGA,0last_tick_channel:last tick通道使能开关,0~15bit分别对应0~15通道,置1标识启用,当tick结束会上送一个结束报文,默认值0shfe2ps_max_inst_no:上海每秒两笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值81000shfe4ps_max_inst_no:上海每秒四笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值81101ine2ps_max_inst_no:能源每秒两笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值85000ine4ps_max_inst_no:能源每秒四笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值85101license:授权license,使用时校验licenselog_level:日志等级,[3:0]对应位置为1,则依次记录debug、info、warning、error等级日志信息。如:log_level=7,则记录info、warning、error日志信息DSTMAC:网络版配置,目的MAC地址DSTIP:网络版配置,目的IP地址DSTPORT:网络版配置,目的端口SRCMAC:网络版配置,源MAC地址SRCIP:网络版配置,源IP地址SRCPORT:网络版配置,源端口repeat_quote_upload:价量不变重复行情上送使能开关,默认注释,不启用(1:启用0:不启用)event_model_sel:某合约出现udp错包时行情不重启,继续接收其余合约行情使能开关,默认注释,不启用(1:启用0:不启用)shield_price_check:软件初始化价格保护使能开关,默认注释,启用(0:启用1:不启用)board_id:U50板卡编号,当一台机器存在多张U50板卡时需要指定,默认注释,值0log_path:配置该通道日志输出路径,默认注释,日志落在api当前路径init_tcpcnt:配置TCP初始化最大等待TCP超时次数,默认注释,超时等待3次
网络版行情是复用本地版0通道订阅的行情然后从网口0、1交替发送
3.2 [channel]
最多支持16个通道(0~15),配置时
channel通道号。
insts:配置订阅合约,all标识订阅全量合约。订阅指定合约时多个合约间用英文,分隔。options:当insts配置有all、品种时,当前配置项用于控制期权行情是否接收,默认norecv。recv:期权行情接收norecv:期权行情不接收
四、使用场景
4.1 按合约订阅
insts支持配置品种,标识订阅配置该品种下全量合约行情。options配置recv,标识期权合约参与合约行情订阅。
-
0通道配置订阅zn,ag,sc品种,不订阅期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=zn,ag,sc options=norecv 订阅zn,ag,sc品种下所有期货合约,不订阅对应期权合约。行情输出落地文件中不存在期权相关行情数据。
-
0通道配置订阅zn品种,订阅期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=zn options=recv 订阅zn品种下所有期货合约和对应期权合约。行情输出落地文件中存在期权相关行情数据。
-
0通道配置订阅cu2510合约,不订阅期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=cu2510 options=norecv 订阅cu2510期货合约,不订阅对应期权合约。行情输出落地文件中不存在期权相关行情数据。
-
0通道配置订阅cu2510合约和对应期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=cu2510 options=recv 订阅cu2510期货合约及对应期权合约。行情输出落地文件中存在期权相关行情数据。
-
0通道配置订阅al2505C10000期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=al2505C10000 options=recv 订阅al2505C10000期权合约。行情输出落地文件中存在al2505C10000期权相关行情数据。
-
0通道配置订阅al2505C10000期权合约行情。
[config] device=xilinx0:0 cpucore=0 [channel0] insts=al2505C10000 options=norecv 订阅al2505C10000期权合约。行情输出落地文件中存在al2505C10000期权相关行情数据。
4.2 订阅全量合约
insts配置all,标识订阅全量合约行情。options配置recv,标识期权合约参与合约行情订阅。
-
0通道配置
[config] device=xilinx0:0 cpucore=0 [channel0] insts=all options=recv 程序输出内容包含所有品种下所有期货合约行情订阅,期权合约也参与合约行情订阅。行情输出落地文件中存在所有品种期货和期权相关行情数据。

4.3 多通道订阅相同合约
此处以四个通道为例,订阅相同合约行情,测试不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。
注意
0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。
-
0通道配置
[config] device=xilinx0:0 cpucore=0 [channel0] insts=all options=recv [channel1] insts=ag2512P6700,ag2510,ag2509P9,cu2509,fu,ni,rb2507C2800 options=recv [channel2] insts=ag2512P6700,ag2510,ag2509P9 options=norecv [channel15] insts=ag,al,al,au2504,sc25 options=recv -
1通道配置
[config] device=xilinx0:1 cpucore=1 -
2通道配置
[config] device=xilinx0:2 cpucore=2 -
15通道配置
[config] device=xilinx0:15 cpucore=15
4.4 多通道订阅不同合约
此处以四个通道为例,订阅不同合约行情,测试不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。
注意
0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。
-
0通道配置
[config] device=xilinx0:0 cpucore=0 [channel0] insts=ag2506,al2506,zn2511 options=recv [channel1] insts=au2507,ni2506,rb2507,ru2503,sn2503,zn2508 options=recv [channel2] insts=bu2504,cu2503,fu2505,hc2505 options=recv [channel15] insts=bu2504,bu2507,cu2503,fu2505,hc2505 options=recv -
1通道配置
[config] device=xilinx0:1 cpucore=1 -
2通道配置
[config] device=xilinx0:2 cpucore=2 -
15通道配置
[config] device=xilinx0:15 cpucore=15
4.5 多通道退订
此处以四个通道为例,在原有订阅合约基础上删减部分合约,测试被删减合约是否还会有行情数据上送。并且验证不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。
注意
0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。
-
0通道配置
[config] device=xilinx0:0 cpucore=0 [channel0] insts=ag2303,zn2311 options=recv [channel1] insts=au2302,au2304,au2306C392,rb2303,rb2305P4800,ru2305P12500,sn2303,zn2303 options=recv [channel2] insts=bu2304,bu2307,cu2305P62000,hc2305 options=recv [channel15] insts=bu2304,bu2307,cu2305P62000,hc2305 options=recv -
1通道配置
[config] device=xilinx0:1 cpucore=1 -
2通道配置
[config] device=xilinx0:2 cpucore=2 -
15通道配置
[config] device=xilinx0:15 cpucore=15
4.6 多通道新增订阅
此处以四个通道为例,在原有订阅合约基础上新增部分合约,测试新增合约是否有行情数据上送。并且验证不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。
注意
0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。
-
0通道配置
[config] device=xilinx0:0 cpucore=0 [channel0] insts=ag2306P5800,ag2303,al2303,al2303C17000,zn2311,zn2303P23800 options=recv [channel1] insts=au2302,au2304,au2306C392,ni2306,rb2303,rb2305P4800,ru2303,ru2305P12500,sn2303,zn2303 options=recv [channel2] insts=bu2304,bu2307,cu2303,cu2305P62000,fu2305,hc2305 options=recv [channel15] insts=bu2304,bu2307,cu2303,cu2305P62000,fu2305,hc2305 options=recv -
1通道配置
[config] device=xilinx0:1 cpucore=1 -
2通道配置
[config] device=xilinx0:2 cpucore=2 -
15通道配置
[config] device=xilinx0:15 cpucore=15
4.7 全部通道测试
所有通道均参与订阅(目前0通道为管理通道,0~15通道均可参与行情订阅),查看各个通道行情订阅是否正常,也可结合上述场景进行全通道覆盖测试。
五、测试步骤
5.1 板卡烧最新集成固件
板卡烧制请跳转至固件烧制。首次烧制完成,后续测试无须烧制。
5.2 启动0通道监听tcp数据
0通道作为初始化和管理通道,如果需要再次初始化需要更改
config.ini,代码检测文件CRC发生变化,会重新REST硬件初始化,然后收取TCP数据进行FPGA初始化。
- 0通道启动输出(监听TCP初始化数据)

5.3 启动其他通道
其他通道作为数据接收者,启动即可。
- 1通道启动

- 2通道启动

-
15通道启动
3~14通道同理,此处不做赘述

5.4 tcpreplay回放数据
启动tcpreplay回放生产转包原始数据,0通道获取到TCP数据后开始解析并初始化FPGA。
[root@t5810 zt_pcap]# tcpreplay -i p4p1 --pps=1000 zt_shfe_20230131_am_end.pcap
- 0通道收到TCP数据初始化FPGA并发起合约行情订阅

5.5 关闭读写并开启DMA上送
0通道作为管理通道,在TCP初始化结束后发起合约行情订阅,然后关闭寄存器读写功能,最后启动DMA行情上送,随后各通道会收到MDA上送的当前通道订阅的合约行情数据。
- 0通道关闭寄存器读写并开启DMA上送

5.6 查看行情落地数据
在启动目录下会生成
nano_u50_yyyymmdd_hhmmss.csv记录当前通道收取到的行情数据。
5.7 日志输出
在启动目录下会生成
nano_u50_yyyymmdd_hhmmss.log记录启动日志,日志仅在启动是记录,运行期间不会记录日志信息。
六、附录
6.1 管理通道
0通道作为TCP初始化和管理通道,启动时如果检测到当前
config.ini配置CRC同上次不一致,就会重新Rest初始化FPGA。
- CRC校验未发生变化,无须初始化。此处考虑到如果客户只是盘中重启了程序,配置没有发生变更,无须等待快照重新初始化(期货公司向交易所获取快照一般是两分钟一次,此场景下重启就无须等待着两分钟)

- 对配置文件进行修改操作后重新启动,会重新Rest初始化FPGA,初始化FPGA后需重新等待TCP快照初始化(期货公司向交易所获取快照一般是两分钟一次)。

6.2 通道重启
开启MDA上送后,0~15通道均可随时重启。如果盘中需要更换订阅合约,必须修改0通道配置后重新启动,其他通道无须调整。
6.3 board id查看
使用
enyx-firmware-manager -l命令即可查看board id。

6.4 license获取
访问
https://www.nanoexpress.com/license网站,使用mac地址查询获取。获取到的秘钥配置到0通道config.ini配置中license配置项。
注意
运行demo实例程序,输出DNA和MAC地址。

- 参考实例
# license key
license=KVRZNU1UVXpORFo9$LWpBeU16RXlNYEk9
6.5 开发机器编译
如果开发机器不是板卡部署机器,编译程序需要安装U50板卡驱动。详情请参阅FPGA U50行情部署安装驱动安装部分。
6.6 DMA抓包
utils\reg目录下hs-capture,-i指定DMA通道编号,编号取值[0,15]。
[tangf@t7810 capture]$ ./hs-capture -i 8 -H 12 -N -w test.pcap
listening port
6.7 寄存器状态
utils\reg目录下nano_state, 即可查看接线和寄存器状态信息。

6.8 U50 API开发包
U50 API请跳转至发布包下载页签,下载对应release发布包,包内sample-code部分为API和示例代码。
6.9 U50 行情部署安装
详情请参阅FPGA U50行情部署安装

注意
注意