Comments (4)
不好意思,最近比较忙,今天才看见。
我初步理解了你描述的问题。
观察这幅图高亮的部分。Send 所使用的 KcpSegment 与 Input 中的一个 Segment 竟然共享一个 ptr,我不知道这是否是预期之内的情况。
UnsafeSegManager约等于非托管内存的内存池。共享一个 ptr 绝对是非预期的。
多线程情况下,池出现问题的可能性还是非常大的。
但是没有测试环境,仅分析代码,没有办法想出哪里可能导致这种这种情况。
我自己的测试用例,没有复现这个bug。
如果你有时间,可以尝试在free函数加锁,看看bug会不会消失。
from kcp.
另外,如果不执着于GC alloc,PoolSegManager 使用dotnet内置的内存池,可靠性比我手写的内存管理要可靠的多。
PoolSegManager 也不见得会多分配多少内存。
非托管内存更多用于GC洁癖的用户。
from kcp.
刚刚看见,试着上 Github Actions 跑了几次测试。先进行了几次测试:
- SimpleSegManager
- 原版 UnSafeSegManager
- Free() 加锁的 UnSafeSegManager
测试的标准都是 5ms 一发包,重复 10000 次,包大小 3500 字节。Windows 平台上和 Ubuntu 平台上各跑一次。
从宏观上来看,Windows 下 1、3都完全没有出现问题,2 出现了丢包(或是错包)。Ubuntu 这里都没有出现问题,可能因为速度比较快减少了并发压力。
(好像是说本地网络通信都是直接内存拷贝,因此速度极快,项目同一份代码放 Windows 下平均延迟 22ms,放到 Ubuntu 下可以达到 4ms)
然后改了一下标准,10ms 一发包,但是包大小上调到了 15000 字节。重复上面的 2、3 试验。
加锁后 3 仍然没有出现问题。2 在 Ubuntu 下似乎没有问题,但是在 Windows 下出现了更为严重的坏包,程序记录的丢包有大约 80%-90%(在我提 issue 的时候测试出来异常确实会积累,但是更有可能是我自己的代码写炸了解包出异常没有处理)
现阶段比较忙,并没有把 merge 之前带一堆测试符号的代码拿回来跑(应该连改个包大小都不一定适配了),但是就 Actions 上跑的这些数据我认为改完应该就没有什么问题了。
from kcp.
多谢。下个版本我会在free上加锁。
from kcp.
Related Issues (20)
- 发生了数据损坏的现象 HOT 3
- 请教rcv_queue的数据结构问题 HOT 2
- 在收发消息的时候,segment频繁地在非托管堆申请和释放内存,导致频繁地在用户态和内核态切换,占用很高的CPU HOT 11
- 有加入FEC的计划吗? HOT 1
- 能不能提供udp和kcp结合起来的例子呢 HOT 4
- 大佬,在多个线程里调用Update会报错:无法访问已经释放的对象 HOT 5
- 如何连接指定的IP地址?
- 示例中两个客户端连接一个伺服器会发生延迟或丢包? HOT 5
- 没什么运行指南吗,VS打开都直接报错 HOT 3
- TryRecv() = Object reference not set to an instance of an object HOT 1
- rcv_queue 创建buffer和UncheckRecv拷贝数据时有几率会造成越界 HOT 7
- 已发送的数据包在超过dead_link仍在尝试继续发送 HOT 2
- 可能出现了数据虚报长度? HOT 4
- 2个客户端请求一个服务器时有一个客户端不会收到消息 HOT 6
- 非托管的GC表现如何?可以做到0GC吗? HOT 4
- 流模式
- 请教作者一些问题 HOT 2
- compatibility with kcp-go HOT 1
- 如何保证客户端和服务端conv值一致 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kcp.