测试 KCP 延时的样例程序
说明
为了达到最佳延时效果,按 KCP
的建议,每次都调用 ikcp_flush
函数进行强制发送。
kcpsrv
监听udp
12345
端口kcpcli
监听udp
54321
端口
kcpcli
连接到kcpsrv
的监听端口上,每隔1ms
上送执行时的时间戳。kcpsrv
接收到报文后,用当前时间与报文时间戳相减,得到单次通讯延时。kcpsrv
将KCP
底层确认包发送到kcpcli
的监听端口。
- 纯
kcp
测试结果:纯 kcp 实现 kcp
+pthread
测试结果:kcp + pthread 实现kcp
+libev
测试结果:kcp + libev 实现kcp
+libev
带负载测试结果:kcp + libev 带负载实现
从测试结果看,相当稳定。
前提
- 将
libkcp.a
及libev.a
放于lib
内 - 或将
libkcp.a
及libev.a
安装到/usr
下
$> mkdir build
$> cd build
$> cmake .. && make
可打开 kcpdemo.h
中的 __DEBUG
宏,添加更多输出信息
开两个终端
终端1
$> cd build
$> ./kcpsrv[n]
or
$> ./kcpsrv[n] <client ip(format: a.b.c.d)> #n=4,5
终端2
$> cd build
$> ./kcpcli[n]
or
$> ./kcpcli[n] <server ip(format: a.b.c.d)> #n=4,5
n
可取 [0,1,2,3,4,5]
, 分别对应于:
编号 | 含义 |
---|---|
0 | 纯 kcp 实现 |
1 | kcp +pthread 实现 |
2 | kcp +libev 实现 |
3 | kcp +libev 带负载实现 |
4 | kcp +libev 支持远端实现 |
5 | kcp +libev 支持远端实现,延时为客户端发出并收回时间 |
通过将应用绑定在不同的 CPU
核,得到最佳性能
taskset -c 0,1 ./kcpsrv4 127.0.0.1 &
taskset -c 4,5 ./kcpcli4 127.0.0.1
taskset -c 0,1 ./kcpsrv5 127.0.0.1 &
taskset -c 4,5 ./kcpcli5 127.0.0.1
添加负载,测试不同负载下的结果
目前无法支持太多次连续调用原因:
KCP
的队列不支持多线程操作,需要在一个线程中操作使用了线程锁,延迟降低严重原因:
kcpcli
一次只读一个包过慢,一次性读取足够多就能加速
感谢林伟大佬提供的优秀网络库!