YuanHu
YuanHu
http://rsocketbyexample.info/rsocket-broker/index.html 这篇文章有提到:关于长连接的数量,不同语言实现的Broker性能不太一样,如基于Java开发的Broker,单机连接总数在30-50万之间,而C++ Broker可以做到单机100万左右。如果有更多连接,目前RSocket Broker通过集群方案进行解决。 那意思是性能上还是比不上EMQ????物联网几百万设备连接下是不是还是得用EMQ?
Netty默认情况下的策略是每8个对象回收1个,能否设置为全部回收(相当于100%绿色无污染,不给GC添负担)来提高并发性能?对于这种高并发、长连接场景,咱们测试时都是怎么配置Netty相关参数的( Netty里的Recycler对象池漏洞https://github.com/netty/netty/pull/9394 )
Netty对象池源码注释版和bug测试代码发你邮箱了,仅供参考。 对象池的其他相关参数如下: io.netty.recycler.ratio (8) 有概率的丢弃 缓存对象, 1/8的概率 io.netty.recycler.maxCapacityPerThread (io.netty.recycler.maxCapacity (4096)) 使用 内部的 threadlocal 的 objectPool时, 每个线程的最大threadlocal 的容量。 io.netty.recycler.maxSharedCapacityFactor (2) 多线程之间共享 objectPool 数量因子 (TODO) io.netty.recycler.maxDelayedQueuesPerThread (NettyRuntime.availableProcessors() * 2) Recycler 跨线程的最多数量 io.netty.recycler.linkCapacity...
将 io.netty.recycler.ratio设置为1的意思,就是用完的对象不再丢弃给GC处理,回收再利用。 不一定全部回收,还要满足下面几个条件: io.netty.recycler.maxCapacityPerThread (io.netty.recycler.maxCapacity (4096)) 使用 内部的 threadlocal 的 objectPool时, 每个线程的最大threadlocal 的容量。 io.netty.recycler.maxSharedCapacityFactor (2) 多线程之间共享 objectPool 数量因子 (TODO) io.netty.recycler.maxDelayedQueuesPerThread (NettyRuntime.availableProcessors() * 2) Recycler 跨线程的最多数量 io.netty.recycler.linkCapacity (16) WeakOrderQueue 中线程可以缓存的对象数量 如果并发高峰期是1000并发,那么会有1000个可回收对象;...
我们关心的应该是 可回收对象(PooledDirectByteBuf、ThreadLocalDirectByteBuf、WriteAndFlushTask、WriteTask等)的利用率。 和你用的是不是长连接,好像没有多大关系。 Netty框架里使用Recycler的地方有: `Recycler、Recycler、Recycler、Recycler、Recycler、Recycler、Recycler、Recycler` 在IoT的场景下,设置io.netty.recycler.ratio为1,再分如下两种情况讨论: a)50w长连接+白天业务高峰期:在长连接中流动的是新闻推送、聊天等高频业务。Netty需要创建的可回收对象很多,比如200w,且这200w一直被回收利用,利用率接近100%; b)50w长连接+半夜业务低峰期:在长连接中流动的是心跳等低频业务。Netty需要的可回收对象很少,只需要50w,利用率25%。多出的150w对象无用武之地(貌似除了多占点内存,也没什么坏处,是不是更费电,我就不清楚了); 另外,官方对io.netty.recycler.ratio的注释里提到了一点,避免爆发式的请求: // By default we allow one push to a Recycler for each 8th try on handles that were never recycled before....