Netty Server流式传输到Netty客户端(点对点,1对1): 好 案例:服务器和客户端都是12核,1Gbit NIC =以每秒300K 200字节消息的稳定速率运行 不太好 case:服务器和客户端都是32核,10Gbit NIC = (相同的
好
>案例:服务器和客户端都是12核,1Gbit NIC =>以每秒300K 200字节消息的稳定速率运行
不太好
> case:服务器和客户端都是32核,10Gbit NIC => (相同的代码)从130K / s开始,在几分钟内降低到每秒数百
意见
> Netperf表明“糟糕”的环境实际上非常出色(可以稳定地传输600MB / s半小时).
>它似乎不是一个客户端问题,因为如果我将客户端交换到已知的好客户端(在C中写入)设置最大操作系统的SO_RCVBUF并且除了读取byte [] s并忽略它们之外什么都不做=>行为仍然是一样的.
>性能降低在达到高写水印(200MB,但尝试其他)之前开始
> Heap感觉很快,当然一旦达到最大值,GC就会锁定世界,但这种情况发生在“坏”症状出现之后.在一个“好”的环境中,堆在1Gb处保持稳定,在逻辑上,给定配置,应该是.
>我注意到的一件事是:Netty Server流中使用了32个核心中的大多数,我试图通过将所有Boss / NioWorker线程设置为1来限制(尽管仍有单个通道,但以防万一):
val bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory ( Executors.newFixedThreadPool( 1 ), Executors.newFixedThreadPool( 1 ), 1 ) ) // 1 thread max, memory limitation: 1GB by channel, 2GB global, 100ms of timeout for an inactive thread val pipelineExecutor = new OrderedMemoryAwareThreadPoolExecutor( 1, 1 *1024 *1024 *1024, 2 *1024 *1024 *1024, 100, TimeUnit.MILLISECONDS, Executors.defaultThreadFactory() ) bootstrap.setPipelineFactory( new ChannelPipelineFactory { def getPipeline = { val pipeline = Channels.pipeline( serverHandlers.toArray : _* ) pipeline.addFirst( "pipelineExecutor", new ExecutionHandler( pipelineExecutor ) ) pipeline } } )
但这并不限制使用的核心数量=>仍然使用大多数核心.据我所知,Netty尝试循环工作任务,但怀疑32个核心“同时”可能对于NIC来说太多了.
问题(S)
>关于性能下降的建议?
>我如何限制Netty使用的核心数量(当然不使用OIO路由)?
附注:会喜欢在Netty的邮件列表上讨论它,但它已经关闭了.尝试过Netty的IRC,但它已经死了
你试过cpu / interrupt亲和力吗? 我们的想法是将io / irq中断仅发送到1或2个内核,并防止其他内核中的上下文切换. 给它一个好的.尝试vmstat并监视ctx和逆向上下文切换之前和之后. 您可以从中断处理程序核心取消固定应用程序.