-
Notifications
You must be signed in to change notification settings - Fork 143
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
iMessageExecutorPool 关于线程模型 #14
Comments
运行两个KcpRttExampleClient 是两个进程吗? 对于单个Ukcp的连接来说 ScheduleTask,ReadTask,WriteTask其实都是一个线程在运行,都是串行在操作。对于多个Ukcp来说他们都是并行的,这样子业务都是无锁的,这样子单连接串行多连接并行充分利用了多核,对cpu的缓存也友好 |
如果是同一个进程的话,最佳实践是new一个KcpRttExampleClient实例然后多次调用connect不同的server |
希望读和写能分开线程,如果单线程,这样怕性能上有影响。 |
这里的线程只处理kcp层的逻辑不会处理网络io,逻辑通过visual分析不是瓶颈,测试的单线程单连接带fec的逻辑处理预计每秒可以处理6万个包,每个包如果算1K的话也有6W1K字节,这个应该满足99%的业务了,而且并行的话最少可以跑到70%cpu+的性能,整体吞吐量等于 cpu数6W1K70% |
实际测试下来,性能有影响,发送方数据包在20w以上,receivequeue或writequeue数据一多,就造成所有数据处理延迟,发送不及时,最终服务端读取超时。 |
例如用 #15 的例子,接收数据非常缓慢,耗时很长 |
|
1、我的是pc机,本机运行,用的无线网卡。 我的猜测是数据包太大,拆分成了很多分片,每个分片都需要ack来回,造成了时间延长。 |
我这边用你的例子在本地跑了两个进程,连接的127.0.0.1,看带宽峰值在38MB,来回rtt打印的在10ms以内,所以我感觉可能是网卡问题或者路由器问题,快手那边用这个库做过类似的测试瓶颈也出现在了公司内部路由器。 |
测算下来,耗时在fec编,解码,平均耗时1毫秒,累计起来,延迟增加。 |
啥配置的cpu?怎么这么耗时,fec的编码可以独立出去搞个线程 ,解码现在还不好搞出去单独搞个线程 |
i7-7700 3.6GHz 打印的时间代码 ReedSolomon:
|
Windows操作系统吗?明天我测试一下试试 |
windows10 |
有完整的测试代码吗? |
KcpRttExampleServer:
KcpRttExampleClient:
} |
cpu为何如此之高,如果开2个连接,直接占用到90%了。这点无法使用,能否优化? |
|
试试1.4版本,fec会好一点 |
优化后的fec单核每秒大概400MB 加密+解密,可以满足需求了,有时间再进一步优化成c艹版本 |
刚买个650m的无线网卡,:) |
650Mb的网卡跑满也就81.25MB,上面那个例子轻松跑满网卡,有延迟是正常的,瓶颈还是在这个无线网卡 |
在不丢包的环境,kcp没法跟tcp来比较的,因为窗口是固定的,在丢包环境下kcp会相对好挺多,kcp更多的应用是一定丢包得网络下低延迟要求的场景。 |
我找到了c++版本的reed-solomon,和目前java版本代码一样,地址:https://github.com/DrPizza/reed-solomon |
过段时间,最近挺忙的,等忙完这阵 |
看看nativeFec分支,jni调用c版本的fec,现在我只生成了mac版本lib,回头我提交c代码可以编译自己平台版本。 |
|
我一直尝试的用的jna,过年期间试下,非常感谢 |
windwos dylib加载不了,这个是mac用的吧 native\libjni.dylib: Can't load this .dll (machine code=0x7) on a AMD 64-bit platform |
https://github.com/l42111996/reedsolomon_jni 这个需要你自己百度编译一下,我没有windows的电脑,放到dylib同级别的目录就行了 |
CLion-2020.3.2.win + mingw,编译通过,生成dll,可以加载 另用上面的测试代码,会报错 java.io.IOException: No enough bytes of head KcpRttExampleClient: public class KcpRttExampleClient implements KcpListener {
} |
@testwen00 兄弟有在线上项目用过吗? 我看作者在源码里面有一些todo说可能会卡死。我有点不太敢用. qq问作者,作者还没回。 |
在一个pc上测试,运行两个KcpRttExampleClient,连接KcpRttExampleServer
ScheduleTask,ReadTask,WriteTask其实都是一个线程在运行,都是串行在操作,这设计是为何?
The text was updated successfully, but these errors were encountered: