-
Notifications
You must be signed in to change notification settings - Fork 475
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
客户端和服务端添加接收方限流 #348
Comments
根本上,限流是有损的。但是你真正想要的只是内存别占用太猛,并不需要真的拒绝那些连接本身。 |
宏观上的资源控制, 当然,连接本身也可以作为一种资源。就像http2maxStreamNum一样,为了保证资源不被耗尽. |
@someview 现在就是可以做的呀,你 onConnect onDicConnect 接口可以控制连接数 |
不仅仅是这方面,目前我们切了一个分支,做了三个改动,来做这件事情:
|
@someview 第二点我还是建议通过 malloc 的方式来维护长度。因为flush返回的长度一定等于malloc mallocack后真正用户写入的长度。这个因为是用户主动写入的,用户肯定知道。 第一点,现在都开放了内部参数调优了https://github.com/cloudwego/netpoll/pull/349/files |
如果做写入的流控的话,就需要在shardqueue flush之前,获取到to flush的长度. flush完毕以后,恢复缓冲区大小 |
@someview 写入和读不同,读是被动行为;写入是主动行为,写入的流控应该在应用层调用 Write/Malloc 的时候控制,否则即便netpoll不写入,它也还是在内存里,还是有问题的。 |
我们对netpoll有几个改动的需求,是否可以考虑添加这个,让linkedbuffer变得可以复用:
由于存在大量的频繁小包,无论是写入端还是读端,都会产生大量的linkedbuffer,所以需要框架层面linedbuffer本身是可以recycle的. 但是,目前linkedbuffer 对外暴露的方法不足以做到这件事情. |
写入的行为确实是写入方自己限流的 |
@someview 你如果是长连接但是有很多小包,是不会有大量linkbuffer的,因为一个连接readerbuffer是一个linkbuffer对象。不需要每个包来搞一个linkbuffer。 如果你是短连接,并且每个连接都是小包,那不只这个对象多,connection 对象也会很多。你是哪种情况? |
tcp框架层次的限流 ->协程池->应用层次协议实现的限流. netpoll 等同于tcp框架 + 协程池 + other feature.
我们在基于netpoll来开发rpc框架的过程中, 压测的时候经常发现内存炸了. 原因在于,服务端或者客户端应用层处理不过来,然而这里有本身又缺乏一种背压机制.netpoll 一旦接收到新的数据,用空的协程或者放在tasklist里面等待执行,这相当于一种无穷大的机制.
然而, 底层的变更不能依赖应用层的变化,所以背压机制在这里显得不恰当.
更好的描述是, 层级式的需求,
按照这种思路,我认为netpoll应该添加限流功能, 以便能够控制,观察netpoll自身级别的资源使用状况.
The text was updated successfully, but these errors were encountered: