性能 – 在32个核心/ 10Gbit主机上调整Netty

Netty Server流式传输到Netty客户端(点对点,1对1):

>案例:服务器和客户端都是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和逆向上下文切换之前和之后.

您可以从中断处理程序核心取消固定应用程序.

点赞