Appearance
行情配置及参数调优
目录
1. 行情订阅配置
1.1. 行情配置概述
XTP Pro SDK订阅行情,新增了 quote_config.ini 配置。
(1)实盘环境是UDP连接,要修改quote_config.ini 文件,并在Login()之前调用SetConfigFile()读取quote_config.ini配置,否则可能登录失败、获取不到行情。
(2)测试环境是TCP连接,无需调用SetConfigFile()读取quote_config.ini文件。
注意:
quote_config.ini文件编码格式是UTF-8,Linux下的文件换行符是LF格式,Windows下的文件换行符是CRLF格式。
1.2. 配置文件版本
XTP Pro SDK-1.2.1 版本下的 quote_config.ini 文件跟之前版本有所不同。
(1)建议使用官网最新API版本 1.2.1
该版本减少了CPU绑核和接收线程的数量,并且增加了使用efvi的内部缓存,能有效缓解丢包。
下载链接:https://xtp.zts.com.cn/service/download/info?id=1&type=downloadProducts
(2)version 1.2.1 配置文件,相比之前版本的变化:
- 港股通HKC和指数通IndexPress与快照MD配置合并,不再单独配置;
- 配置文件中新增busy_wait配置项,所有接收线程均可单独配置,此选项默认开启;
1.3. quote_config.ini参数说明
以 XTP Pro SDK-1.2.1 版本的 quote_config.ini 为例,参数说明如下:
decode_flag 表示解码的快照数据,目前api提供的只有解码的行情数据,这个参数不用看。
1、主要组播行情类型
- [md] 是快照行情,[tbt]是逐笔行情,[ob]是订单簿行情。
[md]、[tbt]都有两路行情,一路是normal软件行情,另一路是fpga硬件行情。如果同时开启2路行情,虽然本地网卡会收到2路行情,但是Api会2路择优只推送更快的那一路行情,一般来说,fpga行情更快。 - 例如:
[md.normal] 是快照软件行情,[md.fpga] 是快照硬件行情。
[tbt.normal] 是逐笔软件行情,[tbt.fpga] 是逐笔硬件行情。 - 注意:
(1)南方机房只有深市的fpga行情,没有沪市fpga行情。
(2)金桥机房只有沪市的fpga行情,没有深市fpga行情。
2、细分组播行情类型
- [subscribe_quote_type] 是细分的组播行情类型。
sh是沪市,sz是深市,nq是北交所;
level1 是L1行情,L1行情只有快照数据,level2 是L2行情,有快照、逐笔、订单簿数据;
index表示指数,option表示期权,stock表示股票,bond表示债券; - 例如:
sh_level2_md_stock = ON,是开启L2 沪市股票快照行情;
sz_level2_tbt_bond = ON,是开启L2 深市债券逐笔行情; - 注意:
(1)如果需要订阅北交所行情,只需要开启 nq_rawtxt = ON 即可。
(2)nq_md_bond 没有配置行情源,nq_tbt_bond 目前没有部署债券的逐笔。
3、ON/OFF 开关配置
- 默认值为ON,说明是已支持的类型,默认值为OFF,说明是不支持的类型。
- 需要订阅的行情类型,保持设置ON,不需要订阅的类型,请不要删除,都设置为OFF。
4、local_ip 参数配置
- 实盘环境下的local_ip,如果订阅[md]、[tbt],则填20网段的网卡ip,如果订阅[ob],则有20网段和30网段2种情况。
- 南方中心:通过 20.99 网段的网卡接收快照、逐笔、SZOB,但需通过 30.99 网段接收SHOB。
- 金桥机房:通过 20.101 网段的网卡接收快照、逐笔,但需通过 30.101 网段接收SHOB、SZOB。
- 注意:
(1)Linux下执行ifconfig、windows下执行ipconfig,查看实际使用的网卡ip。
(2)接收OB行情,login()登录时是填20网段的网卡ip,而不是30网段的网卡ip。
5、cpu绑核 参数配置
- 如果不绑核,设置 parse_cpu_id = 0、 recv_cpu_id = 0;
- 如果绑核,请将不同的 parse_cpu_id、recv_cpu_id 分别绑在不同的cpu核id(逻辑核),并且是靠后的cpu核,第二个核也可以,但不能第一个核,靠前的核心容易被系统调度导致丢包。
- 例如:
如果只开启[tbt.normal]一路行情,需绑定2个核心,请将 parse_cpu_id、recv_cpu_id 分别绑定在不同的cpu核id;
如果同时开启[tbt.normal]、[tbt.fpga]两路行情,需绑定3个核心,请将 1个parse_cpu_id、2个recv_cpu_id 分别绑定在不同的cpu核。 - 注意:
如果核心实在不够,同时开启两路行情时,可将2个 recv_cpu_id 绑定到同一个cpu核。
6、efvi 参数配置
- 如果是SF网卡,并且安装了onload驱动,可以设置 enable_efvi = ON,开启efvi加速。
- 如果配置都对,但是开启efvi收不到行情,先试下关闭efvi接收行情。
- 注意:
(1)XTP Pro提供的linux库版本是onload-8.1.2.26、onload-7.1.0.265,onload驱动尽量安装 略高于8.1.2系列、7.1.0系列。
(2)如果用的X2522网卡固件不是全功能版本,暂时不能使用efvi功能。
7、buf缓存 参数配置
- L1_buf_capacity是一级缓存的大小,L2_buf_capacity是二级缓存的大小。这些缓存是Api申请分配的内存资源。
对于较小的组播包,都放到了一级缓存。 如果包比较大,需要重组,会放到二级缓存。 - 建议设置:
如果接收快照:[md] 设置 L1_buf_capacity = 512,L2_buf_capacity = 64
如果接收逐笔:[tbt] 设置 L1_buf_capacity = 512,L2_buf_capacity = 8
如果接收订单簿:[ob] 设置 L1_buf_capacity = 512,L2_buf_capacity = 8
8、busy_wait 参数配置
- busy_wait = ON,是开启接收线程忙等接收数据,默认是开启忙等,可提高行情接收速度。
- 除非托管服务器的CPU确实不够用,才需要设置OFF,否则建议开启ON。
1.4. quote_config.ini配置示例
南方机房,订阅Level2沪深股票和债券的快照、逐笔及shob行情,并且开启efvi,同时接收normal和fpga 两路行情。
Api-1.2.1 版本的quote_config.ini配置示例:
cpp
[md]
decode_flag = 1
parse_cpu_id = 2
[md.normal]
enable = ON
local_ip = 20.99.**.**
recv_cpu_id = 3
enable_efvi = ON
L1_buf_capacity = 512
L2_buf_capacity = 64
busy_wait = ON
[md.fpga]
enable = ON
local_ip =20.99.**.**
recv_cpu_id = 4
enable_efvi = ON
L1_buf_capacity = 512
L2_buf_capacity = 64
busy_wait = ON
[tbt]
decode_flag = 1
parse_cpu_id = 5
[tbt.normal]
enable = ON
local_ip = 20.99.**.**
recv_cpu_id = 6
enable_efvi = ON
L1_buf_capacity = 256
L2_buf_capacity = 8
busy_wait = ON
[tbt.fpga]
enable = ON
local_ip = 20.99.**.**
recv_cpu_id = 7
enable_efvi = ON
L1_buf_capacity = 256
L2_buf_capacity = 8
busy_wait = ON
[ob]
decode_flag = 1
parse_cpu_id = 8
[ob.normal]
enable = ON
local_ip =30.99.**.**
recv_cpu_id = 9
enable_efvi = ON
L1_buf_capacity = 256
L2_buf_capacity = 8
busy_wait = ON
[subscribe_quote_type]
sh_ob = OFF
sz_ob = ON
sh_level1_md_index = OFF
sh_level1_md_stock = OFF
sh_level1_md_option = OFF
sh_level2_md_index = OFF
sh_level2_md_stock = ON
sh_level2_md_bond = ON
sh_level2_tbt_stock = ON
sh_level2_tbt_bond = ON
sz_level1_md_index = OFF
sz_level1_md_stock = OFF
sz_level1_md_option = OFF
sz_level1_md_bond = OFF
sz_level2_md_index = OFF
sz_level2_md_stock = ON
sz_level2_md_bond = ON
sz_level2_tbt_stock = ON
sz_level2_tbt_bond = ON
nq_rawtxt = OFF
nq_md_bond = OFF
nq_tbt_bond = OFF
#以下为指数通indexpress订阅配置
sh_level1_rawtxt = OFF
#以下为港股通hkc相关订阅配置
sz_level1_md_hkc = OFF
sz_level1_md_hkcsta = OFF2. 行情参数调优
在使用XTP Pro SDK接收UDP组播行情时,为了避免丢包,请尽量按以下建议做好调优。
2.1. Api端优化
1、请更新Api版本至 1.2.1。
2、在收到行情的回调函数里快速返回,请将行情数据copy到另外的内存空间,并在另一个线程内处理。
3、调试期间建议日志设为debug级别,调试好之后可设为info级别,以减少大量写日志操作导致的延时。
4、quote_config.ini 配置中
(1) 如果使用的solarflare网卡,安装了onload驱动,设置 enable_efvi = ON,对api和fpga行情都有效;
(2) L1_buf_capacity,L2_buf_capacity 是默认的最小值,接收L2行情建议调整为:
如果接收快照:[md] 设置 L1_buf_capacity = 512,L2_buf_capacity = 64
如果接收逐笔:[tbt] 设置 L1_buf_capacity = 512,L2_buf_capacity = 8
如果接收订单簿:[ob] 设置 L1_buf_capacity = 512,L2_buf_capacity = 8
(3) recv_cpu_id、parse_cpu_id 设置接收线程、解析线程绑核。
为了避免丢包,请将不同行情的接收线程、解析线程分别绑在不同的cpu核上,并且是靠后的cpu核,第二个cpu核也可以,但不能是第一个,因为第一个cpu核容易被系统调度。
2.2. socket参数优化
1、socket参数优化
a. Linux下,修改/proc/sys/net/core/rmem_max 以及rmem_default数值到128MB或256MB大小,/proc/sys/net/core/netdev_max_backlog 调整到4000
(1) 修改/proc/sys/net/core/rmem_max 以及rmem_default数值到128MB大小,命令如下:
vi /etc/sysctl.conf
net.core.rmem_default=134217728
net.core.rmem_max=134217728
net.core.wmem_default=134217728
net.core.wmem_max=134217728
net.ipv4.udp_mem=134217728 134217728 268435456
net.ipv4.udp_rmem_min=134217728
net.ipv4.udp_wmem_min=134217728
立即生效,无需重启系统。服务器重启后配置会保留。
重启完成后确认参数,可执行以下命令:
bash
sysctl -a | grep net.core.rmem修改后,执行以下命令使配置立即生效并验证:
bash
# 重新加载配置
sudo sysctl -p
# 验证所有参数
sysctl net.core.rmem_default net.core.rmem_max net.core.wmem_default net.core.wmem_max net.ipv4.udp_mem net.ipv4.udp_rmem_min net.ipv4.udp_wmem_min(2) 调整 netdev_max_backlog 队列大小
查看队列大小,执行命令如下:
bash
cat /proc/sys/net/core/netdev_max_backlog如果输出结果大于4000,则不用调整。
如果输出结果小于4000,则需要调整到4000。执行命令如下:
bash
# 先执行:
echo "net.core.netdev_max_backlog=4000" >> /etc/sysctl.conf
# 再执行:
/sbin/sysctl -p
# 立即生效,重启后会保留。说明:
该命令将网络接收路径中“驱动上送后、协议栈处理前”的软件队列长度加大到 4000,有助于应对瞬时突发流量,降低因 CPU 来不及处理而导致的丢包。
b. Windows下,打开注册表
“\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters ”
增加DefaultReceiveWindow 字段,DWORD类型,大小设置为134217728(128MB)
2、Linux下,设置网卡的接收环形缓冲区(RX Ring Buffer)
bash
ethtool -g <interface>
# === 输出示例 ===
# [root@localhost ~]# ethtool -g enp179s0f1d1
# Ring parameters for enp179s0f1d1:
# Pre-set maximums:
# RX: 6144
# RX Mini: 0
# RX Jumbo: 0
# TX: 512
# Current hardware settings:
# RX: 4096
# RX Mini: 0
# RX Jumbo: 0
# TX: 512Pre-set maximums 为可设置的最大值,Current hardware settings 为当前设置的值。
使用ethtool设置接收队列数 [参考官方文档说明](https://docs.amd.com/r/en-US/ug1523-x3522-user/Configuring-Receive-Ring-Buffer-Size)
bash
ethtool -G <网卡名> [rx N]
# N的最小值是1024,请设置为512的倍数,但不能超过网卡"可设置的最大值",一般来说4096足够了。修改后会立即生效,不需要重启系统。需要注意,网卡或系统重启后,配置会恢复成默认值。
# 示例:设置接收队列数为 4096
ethtool -G enp179s0f1d1 rx 40963、Linux下,tuned优化
切换为“网络低延迟”模式,执行命令如下:
bash
tuned-adm active
tuned-adm profile network-latency
tuned-adm active4、Linux下,CPU睿频设置,提高处理器性能
执行命令参考(只针对centos、OpenEuler系统):
bash
cat /proc/cmdline
grubby --default-kernel
grubby --args="nohz=off idle=poll intel_idle.max_cstate=0 processor.max_cstate=0 intel_iommu=off mce=ignore_ce nmi_watchdog=0 transparent_hugepage=never audit=0 irqaffinity=0 nosoftlockup skew_tick=1 watchdog=0 pcie_aspm=off" --update-kernel=`grubby --default-kernel`
# 重启生效
reboot2.3. efvi/onload注意事项
1、如果使用的solarflare网卡,开启efvi接收行情,并且一台机器上开启了多个程序接收L2行情,要么每个程序都要开efvi,或者每个都不开。
如果只是部分开启efvi,会导致没开启efvi的程序收不到行情。
2、如果使用的solarflare网卡,不开启efvi接收行情,而是通过Onload启动的行情程序,并且一台机器上开启了多个程序接收L2行情,要么每个程序都要开onload,或者每个都不开。
如果只是部分开启onload,会导致不是onload启动的程序收不到行情。
3、如果托管服务器有重启,注意看一下设置的网卡缓存参数等是否重置了。为了避免重置,建议把设置参数的命令写到启动脚本里。
