HUDP使用指南

硬件搭建

万兆网卡:需要电脑主板有多余的PCIE x8插槽插入,具体安装可见万兆网卡安装

dac线缆:Direct Attach Cable,相当于SFP+模块加上光纤线缆,可直接插入,方便好用

准备工作

由于dac线缆一段连接万兆网卡,另一端连接ACQ400的SFP+ D口,因此需要分别知道两端的ip地址

Host端(万兆网卡端):直接在cmd输入ipconfig

ip

采集端:需要执行python脚本去配置

(在Linux环境下执行,在Windows下执行会报错)

python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1 1,16,0' 192.168.0.169 none

其中169.254.185.112为我们给采集端设置的ip地址,169.254.185.111为Host端的ip地址,192.168.0.169是ACQ400 eth0的ip地址

--run0='1 1,16,0'中的第一个1表示开启site1,--run0='1,2,3,4,5,6 1,16,0则表示开启site1,2,3,4,5,6

后面的1,16,0表示开启16个SPAD

设置成功后,可以使用浏览器输入192.168.0.169访问ACQ400 网页端来查询

screen1

使用Netcat

需要打开两个命令行窗口

第一个输入

nc -ulvnp 53676 > udp_data

然后在另一个窗口执行

python ./user_apps/acq400/acq400_continuous.py  --run=1 192.168.0.169

会在第一个窗口显示

listening on [any] 53676 ...
connect to [169.254.185.111] from (UNKNOWN) [169.254.185.112] 53676

想使用pv工具,但这个工具似乎不适用于Windows系统,只适用于Linux系统,所以无法查看数据传输速率

使用Udpperf

wsl

WSL(Windows Subsyetem for Linux,适用于 Linux 的 Windows 子系统),是 Microsoft 公司于 2016 年在 Windows 10 平台发布的一项功能,其使得用户可以在 Windows 操作系统上运行 ELF 格式的 Linux 可执行文件。

WSL 目前已发布两代产品:WSL 1 和 WSL 2。WSL 1 实现了 Linux 兼容层,将 Linux 系统调用转换为 Windows NT 系统调用;而 WSL 2 则利用 Windows 的 Hyper-V 功能,通过虚拟化技术直接运行 Linux 虚拟机,更接近原生 Linux 操作系统体验。

WSL安装参考教程:https://docs.eesast.com/docs/tools/wsl

编译Udpperf

Udpperf是个用于高速接收Udp包的收发程序:udpperf

这个程序建议在Linux系统下使用

而我研究出了在Windows系统使用的方法:那就是使用wsl

注意使用wsl1,不要更新到wsl2

然后再wsl中(装了个Ubuntu)

git clone https://github.com/D-TACQ/udpperf.git
cd udpperf
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release .. 
make

然后成功生成了udprx.exe

接收数据包

然后在acq400_hapi下

python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1 1,16,0' --spp=20 192.168.0.169 none

在udpperf下

./udprx -R 40 -p 53676 --spp 20 --ssb 128 -o 1 > shot_data

然后再在acq400_hapi下

python ./user_apps/acq400/acq400_continuous.py  --run=1 192.168.0.169

#停止stream的时候输入这条命令
python ./user_apps/acq400/acq400_continuous.py  --stop=1 192.168.0.169 

通过这条命令来查看信息

hexdump -e '32/2 "%04x," 16/4 "%08x," "\n"'  < shot_data_4m | cut -d, -f 1-4,33-36 | head -n 20

可以看到以下信息,我在通道1里设置了频率为1k的正弦输入,我认为这个打印的数据是符合预期的

07b9,fff7,fffe,fff6,00000001,00000000,2155ac35,00000000
07c0,fff9,ffff,fff5,00000002,00000000,2155ac5d,00000000
07bf,fff6,fffc,fff6,00000003,00000000,2155ac85,00000000
07c3,fff7,ffff,fff5,00000004,00000000,2155acad,00000000
07c1,fff7,fffd,fff5,00000005,00000000,2155acd5,00000000
07c2,fff8,fffe,fff4,00000006,00000000,2155acfd,00000000
07c2,fff8,fffe,fff4,00000007,00000000,2155ad25,00000000
07c2,fff6,fffe,fff5,00000008,00000000,2155ad4d,00000000
07cb,fff7,fffd,fff5,00000009,00000000,2155ad75,00000000
07c0,fff7,fffc,fff5,0000000a,00000000,2155ad9d,00000000
07cc,fff6,fffd,fff7,0000000b,00000000,2155adc5,00000000
07c7,fff6,fffd,fff7,0000000c,00000000,2155aded,00000000
07ce,fff6,fffd,fff6,0000000d,00000000,2155ae15,00000000
07ca,fff8,fffd,fff4,0000000e,00000000,2155ae3d,00000000
07cd,fff4,fffd,fff5,0000000f,00000000,2155ae65,00000000
07cb,fff8,fffd,fff5,00000010,00000000,2155ae8d,00000000
07d2,fff7,fffe,fff8,00000011,00000000,2155aeb5,00000000
07cc,fff6,0000,fff4,00000012,00000000,2155aedd,00000000
07d3,fff6,fffe,fff3,00000013,00000000,2155af05,00000000
07d3,fff7,fffd,fff4,00000014,00000000,2155af2d,00000000

绘波形图

可惜wsl是不支持图形界面的,我想直接在wsl里有python绘图把shot_data里的波形画出来,但不行

但是我还有Windows系统!直接把wsl里的shot_data拖到另一个文件夹里,然后用python脚本看就行了

输入50k正弦波

./udprx -R 40 -p 53676 --spp 20 --ssb 128 -o 1 -S 1000000 > shot_data_1m

这个命令表示只接受1M个sample,然后存到shot_data_1m中

然后我把shot_data_1m放到e:\\ad下,在用这个命令将shot_data_1m绘图(此时ACQ400必须处于开机状态)

python ./user_apps/analysis/host_demux.py --pchan=1,2 --src="e:\ad\shot_data_1m" 192.168.0.169 --pses 1:200:1

这个命令表示只将通道1,2的数据画成波形图,实际上我只有在通道1内接入了信号,似乎通道2也受到了影响

这种现象叫做信号串扰,注意到通道2的幅值比通道1要小20倍,实际上每个通道由一个低阻抗驱动器驱动,在每个通道都有输入的情况下,串扰可以忽略不计

然后--pses表示从1到200个sample,步长为1

sin

输入10k方波

python ./user_apps/analysis/host_demux.py --pchan=1,2 --src="e:\ad\shot_data_1m" 192.168.0.169 --pses 1:2000:1

sq

速度测试

**Single Site Configuration:**
python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1 1,16,0' --spp=20 192.168.0.169 none

./udprx -R 40 -p 53676 --spp 20 --ssb 128 -o 1 > shot_data
2024-09-21.09:08:28 Rx rate: 0.16 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-21.09:08:38 Rx rate: 1023.55 Mbps, rx 127 MB/s (total: 1279 MB), Elapsed 00:00:10, PktRec = 499900
2024-09-21.09:08:48 Rx rate: 1023.47 Mbps, rx 127 MB/s (total: 2559 MB), Elapsed 00:00:20, PktRec = 999700
2024-09-21.09:08:58 Rx rate: 1023.51 Mbps, rx 127 MB/s (total: 3838 MB), Elapsed 00:00:30, PktRec = 1499500

python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1 1,16,0' --spp=40 192.168.0.169 none

./udprx -R 40 -p 53676 --spp 40 --ssb 128 -o 1 > shot_data
2024-09-21.09:11:12 Rx rate: 0.36 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-21.09:11:22 Rx rate: 1023.90 Mbps, rx 128 MB/s (total: 1280 MB), Elapsed 00:00:10, PktRec = 250100
2024-09-21.09:11:32 Rx rate: 1023.65 Mbps, rx 128 MB/s (total: 2560 MB), Elapsed 00:00:20, PktRec = 500100
2024-09-21.09:11:42 Rx rate: 1023.73 Mbps, rx 128 MB/s (total: 3840 MB), Elapsed 00:00:30, PktRec = 750100


python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1 1,16,0' --spp=60 192.168.0.169 none

./udprx -R 40 -p 53676 --spp 60 --ssb 128 -o 1 > shot_data

root@DESKTOP-NQ0GI1S:~/udpperf/build# ./udprx -R 40 -p 53676 --spp 60 --ssb 128 -o 1 > shot_data
2024-09-21.09:13:47 Rx rate: 0.53 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-21.09:13:57 Rx rate: 1024.04 Mbps, rx 128 MB/s (total: 1281 MB), Elapsed 00:00:10, PktRec = 166800
2024-09-21.09:14:07 Rx rate: 1023.97 Mbps, rx 128 MB/s (total: 2561 MB), Elapsed 00:00:20, PktRec = 333500
2024-09-21.09:14:17 Rx rate: 1024.01 Mbps, rx 128 MB/s (total: 3841 MB), Elapsed 00:00:30, PktRec = 500200

**Multiple Sites Configuration:**
python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1,2,3,4,5,6 1,16,0' --spp=10 192.168.0.169 none

./udprx -R 40 -p 53676 --spp 10 --ssb 448 -o 1 > shot_data
root@DESKTOP-NQ0GI1S:~/udpperf/build# ./udprx -R 40 -p 53676 --spp 10 --ssb 448 -o 1 > shot_data
2024-09-21.09:46:27 Rx rate: 0.31 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-21.09:46:37 Rx rate: 1749.34 Mbps, rx 218 MB/s (total: 2187 MB), Elapsed 00:00:10, PktRec = 488200
2024-09-21.09:46:47 Rx rate: 1596.82 Mbps, rx 199 MB/s (total: 4183 MB), Elapsed 00:00:20, PktRec = 933800
2024-09-21.09:46:57 Rx rate: 1559.72 Mbps, rx 194 MB/s (total: 6133 MB), Elapsed 00:00:30, PktRec = 1369000

python3 ./user_apps/acq2106/hudp_setup.py --tx_ip 169.254.185.112 --rx_ip 169.254.185.111 --run0='1,2,3,4,5,6 1,16,0' --spp=20 192.168.0.169 none

./udprx -R 40 -p 53676 --spp 20 --ssb 448 -o 1 > shot_data
root@DESKTOP-NQ0GI1S:~/udpperf/build# ./udprx -R 40 -p 53676 --spp 20 --ssb 448 -o 1 > shot_data
2024-09-21.09:16:49 Rx rate: 0.44 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-21.09:16:59 Rx rate: 1839.74 Mbps, rx 230 MB/s (total: 2300 MB), Elapsed 00:00:10, PktRec = 256800
2024-09-21.09:17:09 Rx rate: 1582.57 Mbps, rx 197 MB/s (total: 4280 MB), Elapsed 00:00:20, PktRec = 477700
2024-09-21.09:17:19 Rx rate: 1521.27 Mbps, rx 190 MB/s (total: 6182 MB), Elapsed 00:00:30, PktRec = 690000
2024-09-21.09:17:29 Rx rate: 1546.04 Mbps, rx 193 MB/s (total: 8115 MB), Elapsed 00:00:40, PktRec = 905700

经过分析得知,sample per packet不影响rx rate,不过开启的通道数(或site number)会影响rx rate

在开启1个site的情况下:ssb = 32x2+16x4 = 128B ,采样率为1MSPS,故理论速率为 128x1 = 128MB/s

开启6个site的情况下:ssb = 192x2+16x4 = 448B,采样率为1MSPS,故理论速率为 448x1 = 448MB/s

后面没有达到448MB/s很有可能是因为硬盘写入速度的限制

root@DESKTOP-NQ0GI1S:~/udpperf/build# ./udprx -R 40 -p 53676 --spp 10 --ssb 448
2024-09-22.09:34:12 Rx rate: 0.28 Mbps, rx 0 MB/s (total: 0 MB), Elapsed 00:00:00, PktRec = 100
2024-09-22.09:34:22 Rx rate: 3473.10 Mbps, rx 434 MB/s (total: 4342 MB), Elapsed 00:00:10, PktRec = 969200
2024-09-22.09:34:32 Rx rate: 3569.39 Mbps, rx 446 MB/s (total: 8804 MB), Elapsed 00:00:20, PktRec = 1965200
2024-09-22.09:34:42 Rx rate: 3456.85 Mbps, rx 432 MB/s (total: 13125 MB), Elapsed 00:00:30, PktRec = 2929800
2024-09-22.09:34:52 Rx rate: 3568.48 Mbps, rx 446 MB/s (total: 17586 MB), Elapsed 00:00:40, PktRec = 3925500

再试了一下接收数据包后不写入硬盘(丢弃),rx rate已经很逼近理论速率448MB/s了

致谢

最后,非常感谢Peter Milne先生的帮助和建议,在研究ACQ400的过程中我向他发了至少十封邮件来请教问题,他的回答总能解决我的问题,非常感谢他


本文章使用limfx的vscode插件快速发布