目录
[0. 背景](#0. 背景)
[1. Topology 介绍](#1. Topology 介绍)
[2. 问题描述:sfnt-pingpong TCP 时延报错](#2. 问题描述:sfnt-pingpong TCP 时延报错)
[3. 解决方法](#3. 解决方法)
[3.1 搜索含 sfnt-pingpong.c 的源码文件夹](#3.1 搜索含 sfnt-pingpong.c 的源码文件夹)
[3.2 在三份源码里直接搜这个 hash](#3.2 在三份源码里直接搜这个 hash)
[3.3 进入目录,先清理旧编译产物(关键!避免把旧 obj 传到对端)](#3.3 进入目录,先清理旧编译产物(关键!避免把旧 obj 传到对端))
[3.4 打包纯净源码(上层目录打包)](#3.4 打包纯净源码(上层目录打包))
[3.5 将打包的cns-sfnettest_90.tar.gz 传到对端 10.1.22.18](#3.5 将打包的cns-sfnettest_90.tar.gz 传到对端 10.1.22.18)
[3.6 远端编译流程(重点!远端也要进 src 编译)](#3.6 远端编译流程(重点!远端也要进 src 编译))
[4. 测试校验](#4. 测试校验)
0. 背景
需要测试数据包时延
1. Topology 介绍
10.1.22.18 -----------直连----------- 192.168.2.73
swift1f0:192.168.1.18 -----------直连----------- swift1f0:192.168.2.73
2. 问题描述:sfnt-pingpong TCP 时延报错
定位原因:sfnt-pingpong version 版本不一致
3. 解决方法
将其中一台中的snft-pingpong 打包到另一台机器上重新编译安装
3.1搜索含 sfnt-pingpong.c 的源码文件夹
# 想要本地(192.168.2.73) 的sfnt-pingpong 版本安装到 另一台机器(10.1.22.18)上
# 192.168.2.73
[root@[localhost](https://localhost) ~]# sfnt-pingpong --version
version: no-version
src: 90b95efce4ec5ab3987cb432a34702e0
[root@[localhost](https://localhost) ~]#
[root@[localhost](https://localhost) ~]#
[root@[localhost](https://localhost) ~]# find / -name "sfnt-pingpong.c" 2>/dev/null
/home/bf/autotest/cns-sfnettest-master/src/sfnt-pingpong.c
/home/guokh/cns-sfnettest-master/src/sfnt-pingpong.c
/home/yanyiwei/cns-sfnettest-master/src/sfnt-pingpong.c
[root@[localhost](https://localhost) ~]#
//***************************************************************************
这台机器192.168.2.73(src=`90b95efce4ec5ab3987cb432a34702e0`)上有 3 份源码副本,
先确认哪一份对应正在跑的二进制,然后把这份源码打包传到另一台重新编译即可。
3.2 在三份源码里直接搜这个 hash
在三份源码里直接搜这个 hash
# grep -rn "90b95efce4ec5ab3987cb432a34702e0" /home/bf/autotest/cns-sfnettest-master /home/guokh/cns-sfnettest-master /home/yanyiwei/cns-sfnettest-master 2>/dev/null
# 192.168.2.73:
[root@localhost cns-sfnettest-master]#
[root@localhost cns-sfnettest-master]# grep -rn "90b95efce4ec5ab3987cb432a34702e0" /home/bf/autotest/cns-settest-master 2>/dev/null
Binary file /home/guokh/cns-sfnettest-master/src/sfnt_sysinfo.o matches
Binary file /home/guokh/cns-sfnettest-master/src/libsfnettest.a matches
Binary file /home/guokh/cns-sfnettest-master/src/sfnt-pingpong matches
Binary file /home/guokh/cns-sfnettest-master/src/sfnt-stream matches
Binary file /home/yanyiwei/cns-sfnettest-master/src/sfnt_sysinfo.o matches
Binary file /home/yanyiwei/cns-sfnettest-master/src/libsfnettest.a matches
Binary file /home/yanyiwei/cns-sfnettest-master/src/sfnt-pingpong matches
Binary file /home/yanyiwei/cns-sfnettest-master/src/sfnt-stream matches
[root@localhost cns-sfnettest-master]#
grep 匹配到的都是 .o / .a / 可执行文件(编译后的二进制产物),源码文本里没有硬写这个 hash,这个 hash 是 Makefile 编译阶段生成、嵌入二进制的
3.3 进入目录,先清理旧编译产物(关键!避免把旧 obj 传到对端)
#这里才是真正的 Makefile 位置,clean、make 都在这里执行
# cd /home/guokh/cns-sfnettest-master/src
# ls -l Makefile
# 清理编译产物
make clean
[root@localhost src] cd /home/guokh/cns-sfnettest-master/src
[root@localhost src]# ls -l Makefile
-rw-r--r--. 1 root root 1779 Sep 4 2023 Makefile
[root@localhost src]#
[root@localhost src]# make clean
find . -name "*.o" | xargs rm -f
find . -name "*.d" | xargs rm -f
find . -name "*.a" | xargs rm -f
rm -f sfnt-pingpong sfnt-stream
[root@localhost src]#
3.4 打包纯净源码(上层目录打包)
cd /home/guokh
tar -zcvf cns-sfnettest_90.tar.gz cns-sfnettest-master/
# 192.168.2.73:
[root@localhost src]# cd /home/guokh/
[root@localhost guokh]#
[root@localhost guokh]# tar -zcvf cns-sfnettest_90.tar.gz cns-sfnettest-master/
cns-sfnettest-master/
cns-sfnettest-master/.github/
cns-sfnettest-master/.github/CODEOWNERS
cns-sfnettest-master/.gitignore
cns-sfnettest-master/ChangeLog
cns-sfnettest-master/LICENSE
cns-sfnettest-master/README.md
cns-sfnettest-master/README.sfnt-pingpong.md
cns-sfnettest-master/README.sfnt-stream.md
cns-sfnettest-master/libsfnettest.vcxproj
cns-sfnettest-master/libsfnettest.vcxproj.filters
cns-sfnettest-master/sfnettest.sln
cns-sfnettest-master/sfnt-pingpong.vcxproj
cns-sfnettest-master/sfnt-pingpong.vcxproj.filters
cns-sfnettest-master/sfnt-stream.vcxproj
cns-sfnettest-master/sfnt-stream.vcxproj.filters
cns-sfnettest-master/src/
cns-sfnettest-master/src/Makefile
cns-sfnettest-master/src/rules.mk
cns-sfnettest-master/src/rules_pre.mk
cns-sfnettest-master/src/sfnettest.h
cns-sfnettest-master/src/sfnettest_gcc.h
cns-sfnettest-master/src/sfnettest_msvc.h
cns-sfnettest-master/src/sfnettest_unix.h
cns-sfnettest-master/src/sfnettest_waitall_hack.h
cns-sfnettest-master/src/sfnettest_win32.h
cns-sfnettest-master/src/sfnt-pingpong.c
cns-sfnettest-master/src/sfnt-stream.c
cns-sfnettest-master/src/sfnt_affinity.c
cns-sfnettest-master/src/sfnt_cmd_line.c
cns-sfnettest-master/src/sfnt_fd.c
cns-sfnettest-master/src/sfnt_int_list.c
cns-sfnettest-master/src/sfnt_logging.c
cns-sfnettest-master/src/sfnt_macosx.c
cns-sfnettest-master/src/sfnt_mux.c
cns-sfnettest-master/src/sfnt_nonblocking_send.c
cns-sfnettest-master/src/sfnt_socket.c
cns-sfnettest-master/src/sfnt_stats.c
cns-sfnettest-master/src/sfnt_sysinfo.c
cns-sfnettest-master/src/sfnt_test.c
cns-sfnettest-master/src/sfnt_tsc.c
[root@localhost guokh]#
3.5 将打包的cns-sfnettest_90.tar.gz 传到对端 10.1.22.18
# scp cns-sfnettest_90.tar.gz root@10.1.22.18:/root/
# 192.168.2.73:
[root@localhost guokh]#
[root@localhost guokh]# scp cns-sfnettest_90.tar.gz root@10.1.22.18:/root/
The authenticity of host '10.1.22.18 (10.1.22.18)' can't be established.
ECDSA key fingerprint is SHA256:FV+ykBycwaRx4XhTBiEcV+3qiOzAPz+fKOym4RuxOs0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? Y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '10.1.22.18' (ECDSA) to the list of known hosts.
root@10.1.22.18's password:
cns-sfnettest_90.tar.gz
[root@localhost guokh]#
[root@localhost guokh]#
# 10.1.22.18:
3.6 远端编译流程(重点!远端也要进 src 编译)
ssh root@10.1.22.18
cd /root
tar -zxvf cns-sfnettest_90.tar.gz
cd cns-sfnettest-master/src
# 先清理(防止远端src自带旧产物)
make clean
# 编译
make
# 校验版本
./sfnt-pingpong --version
#***************************************************************
# 10.1.22.18
1. 解压cns-sfnettest_90.tar.gz
[root@localhost ~]#
[root@localhost ~]# tar -xvzf cns-sfnettest_90.tar.gz
cns-sfnettest-master/
cns-sfnettest-master/.github/
cns-sfnettest-master/.github/CODEOWNERS
cns-sfnettest-master/.gitignore
cns-sfnettest-master/ChangeLog
cns-sfnettest-master/LICENSE
cns-sfnettest-master/README.md
cns-sfnettest-master/README.sfnt-pingpong.md
cns-sfnettest-master/README.sfnt-stream.md
cns-sfnettest-master/libsfnettest.vcxproj
cns-sfnettest-master/libsfnettest.vcxproj.filters
cns-sfnettest-master/sfnettest.sln
cns-sfnettest-master/sfnt-pingpong.vcxproj
cns-sfnettest-master/sfnt-pingpong.vcxproj.filters
cns-sfnettest-master/sfnt-stream.vcxproj
cns-sfnettest-master/sfnt-stream.vcxproj.filters
cns-sfnettest-master/src/
cns-sfnettest-master/src/Makefile
cns-sfnettest-master/src/rules.mk
cns-sfnettest-master/src/rules_pre.mk
cns-sfnettest-master/src/sfnettest.h
cns-sfnettest-master/src/sfnettest_gcc.h
cns-sfnettest-master/src/sfnettest_msvc.h
cns-sfnettest-master/src/sfnettest_unix.h
cns-sfnettest-master/src/sfnettest_waitall_hack.h
cns-sfnettest-master/src/sfnettest_win32.h
cns-sfnettest-master/src/sfnt-pingpong.c
cns-sfnettest-master/src/sfnt-stream.c
cns-sfnettest-master/src/sfnt_affinity.c
cns-sfnettest-master/src/sfnt_cmd_line.c
cns-sfnettest-master/src/sfnt_fd.c
cns-sfnettest-master/src/sfnt_int_list.c
cns-sfnettest-master/src/sfnt_logging.c
cns-sfnettest-master/src/sfnt_macosx.c
cns-sfnettest-master/src/sfnt_mux.c
cns-sfnettest-master/src/sfnt_nonblocking_send.c
cns-sfnettest-master/src/sfnt_socket.c
cns-sfnettest-master/src/sfnt_stats.c
cns-sfnettest-master/src/sfnt_sysinfo.c
cns-sfnettest-master/src/sfnt_test.c
cns-sfnettest-master/src/sfnt_tsc.c
[root@localhost ~]#
[root@localhost ~]# cd cns-sfnettest-master/src/
[root@localhost src]# ll
total 236
-rw-r--r--. 1 root root 1779 Sep 4 2023 Makefile
-rw-r--r--. 1 root root 409 Sep 4 2023 rules.mk
-rw-r--r--. 1 root root 415 Sep 4 2023 rules_pre.mk
-rw-r--r--. 1 root root 1691 Sep 4 2023 sfnettest_gcc.h
-rw-r--r--. 1 root root 18000 Sep 4 2023 sfnettest.h
-rw-r--r--. 1 root root 2075 Sep 4 2023 sfnettest_msvc.h
-rw-r--r--. 1 root root 4463 Sep 4 2023 sfnettest_unix.h
-rw-r--r--. 1 root root 2112 Sep 4 2023 sfnettest_waitall_hack.h
-rw-r--r--. 1 root root 10340 Sep 4 2023 sfnettest_win32.h
-rw-r--r--. 1 root root 1646 Sep 4 2023 sfnt_affinity.c
-rw-r--r--. 1 root root 10813 Sep 4 2023 sfnt_cmd_line.c
-rw-r--r--. 1 root root 1059 Sep 4 2023 sfnt_fd.c
-rw-r--r--. 1 root root 2575 Sep 4 2023 sfnt_int_list.c
-rw-r--r--. 1 root root 1218 Sep 4 2023 sfnt_logging.c
-rw-r--r--. 1 root root 1011 Sep 4 2023 sfnt_macosx.c
-rw-r--r--. 1 root root 6016 Sep 4 2023 sfnt_mux.c
-rw-r--r--. 1 root root 1477 Sep 4 2023 sfnt_nonblocking_send.c
-rw-r--r--. 1 root root 44069 Sep 4 2023 sfnt-pingpong.c
-rw-r--r--. 1 root root 13204 Sep 4 2023 sfnt_socket.c
-rw-r--r--. 1 root root 3059 Sep 4 2023 sfnt_stats.c
-rw-r--r--. 1 root root 52666 Sep 4 2023 sfnt-stream.c
-rw-r--r--. 1 root root 3197 Sep 4 2023 sfnt_sysinfo.c
-rw-r--r--. 1 root root 784 Sep 4 2023 sfnt_test.c
-rw-r--r--. 1 root root 3675 Sep 4 2023 sfnt_tsc.c
[root@localhost src]#
[root@localhost src]# make clean
find . -name "*.o" | xargs rm -f
find . -name "*.d" | xargs rm -f
find . -name "*.a" | xargs rm -f
rm -f sfnt-pingpong sfnt-stream
[root@localhost src]#
[root@localhost src]#
[root@localhost src]# make
cc -Wall -Werror -g -fPIC -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"'c -o sfnt_sysinfo.o sfnt_sysinfo.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_logging.o sfnt_logging.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_cmd_line.o sfnt_cmd_line.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_test.o sfnt_test.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_socket.o sfnt_socket.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_stats.o sfnt_stats.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_tsc.o sfnt_tsc.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_int_list.o sfnt_int_list.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_affinity.o sfnt_affinity.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_mux.o sfnt_mux.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_fd.o sfnt_fd.c
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt_nonblocking_send.o sfnt_nonblocking_send.c
ar -r libsfnettest.a sfnt_sysinfo.o sfnt_logging.o sfnt_cmd_line.o sfnt_test.o sfnt_socket.o sfnt_stats.o sftsc.o sfnt_int_list.o sfnt_affinity.o sfnt_mux.o sfnt_fd.o sfnt_nonblocking_send.o
ar: creating libsfnettest.a
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt-pingpong.o sfnt-pingpong.c
cc -Wl,-E -Wall -Werror -g sfnt-pingpong.o -L. -lsfnettest -lm -lrt -o sfnt-pingpong
cc -Wall -Werror -g -DSFNT_VERSION='"no-version"' -DSFNT_SRC_CSUM='"90b95efce4ec5ab3987cb432a34702e0"' -c -fnt-stream.o sfnt-stream.c
cc -Wl,-E -Wall -Werror -g sfnt-stream.o -L. -lsfnettest -lm -lrt -lpthread -o sfnt-stream
rm sfnt-stream.o sfnt-pingpong.o
[root@localhost src]#
[root@localhost src]#
[root@localhost src]# sfnt-pingpong --version
version: no-version
src: 2b01b02a25134b95306a16c81ae1d4bb
[root@localhost src]#
//=====================================================================
# 注意:当解压编译后,在解压目录:/root/cns-sfnettest-master/src 下的 ./sfnt-pingpong --version 版本与 sfnt-pingpong --version 版本不一致
解决方法:备份旧版本并覆盖
//=====================================================================
[root@localhost src]# pwd
/root/cns-sfnettest-master/src
[root@localhost src]#
[root@localhost src]# ./sfnt-pingpong --version
version: no-version
src: 90b95efce4ec5ab3987cb432a34702e0 # 来自192.168.2.73 打包的 sfnt-pingpong 版本
[root@localhost src]#
[root@localhost src]# sfnt-pingpong --version # 还是原来的 sfnt-pingpong 版本
version: no-version
src: 2b01b02a25134b95306a16c81ae1d4bb
[root@localhost src]#
[root@localhost src]# which sfnt-pingpong
/usr/bin/sfnt-pingpong
[root@localhost src]#
太好了!问题找到了 ------**你新编译出来的 `./sfnt-pingpong` 版本已经是正确的 `90b95efce4ec5ab3987cb432a34702e0`**,只是你之前直接敲 `sfnt-pingpong` 跑的是系统里 `/usr/bin/` 的旧二进制(2b01b02...),所以以为 "版本没变化"
# 检查新二进制依赖是否齐全
# ldd ldd ./sfnt-pingpong 确认没有 `not found` 的行
[root@localhost src]#
[root@localhost src]# ldd ./sfnt-pingpong # 确认没有 `not found` 的行
linux-vdso.so.1 (0x00007fff7493e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4b6ce54000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4b6cc4c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4b6c876000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4b6d1d6000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4b6c656000)
[root@localhost src]#
[root@localhost src]#
# 备份旧版本并覆盖
# 备份旧的
# cp /usr/bin/sfnt-pingpong /root/sfnt-pingpong_old_2b01b0.bak
# 覆盖
# cp ./sfnt-pingpong /usr/bin/sfnt-pingpong
# 刷新命令缓存
# hash -r
[root@localhost src]# cp /usr/bin/sfnt-pingpong /root/sfnt-pingpong_old_ae1d4bb.bak
[root@localhost src]#
[root@localhost src]# ll /usr/bin/sfnt-pingpong
-rwxr-xr-x. 1 root root 168752 Aug 1 2025 /usr/bin/sfnt-pingpong
[root@localhost src]# md5sum /usr/bin/sfnt-pingpong
9be07b3ab8b3fdf12abe7eb434788623 /usr/bin/sfnt-pingpong
[root@localhost src]#
[root@localhost src]# cp ./sfnt-pingpong /usr/bin/sfnt-pingpong
cp: overwrite '/usr/bin/sfnt-pingpong'? y
[root@localhost src]#
[root@localhost src]# hash -r
[root@localhost src]# sfnt-pingpong --version
version: no-version
src: 90b95efce4ec5ab3987cb432a34702e0
[root@localhost src]#
4. 测试校验

到此已解决 sfnt-pingpong 版本不一致问题