gpt4 book ai didi

performance - 在 32 核/10Gbit 主机上调优 Netty

转载 作者:行者123 更新时间:2023-12-01 04:05:12 27 4
gpt4 key购买 nike

Netty Server 流到 Netty 客户端(点对点,1 对 1):
好的

  • 案例:Server和Client都是12 cores , 1Gbit NIC => 以每秒 300K 200 字节消息的稳定速率运行

  • 不太好
  • 案例:Server和Client都是32 cores , 10Gbit NIC =>(相同的代码)从 130K/s 开始,在几分钟内下降到每秒数百个

  • 观察
  • Netperf 显示“糟糕”的环境实际上非常出色(可以以 600MB/s 的速度稳定传输半小时)。
  • 这似乎不是客户端问题,因为如果我将客户端交换到设置最大操作系统的已知良好客户端(用 C 编写)SO_RCVBUF并且除了读取 byte[]s 并忽略它们之外什么都不做 => 行为仍然相同。
  • 性能下降在达到高写入水印(200MB,但尝试过其他)之前开始
  • 堆感觉起来很快,当然,一旦达到最大值,GC 就会锁定世界,但这发生在“坏”症状浮出水面之后。在“良好”的环境中,堆在 1Gb 的某个地方保持稳定,从逻辑上讲,考虑到配置,它应该是。
  • 我注意到的一件事:Netty Server 流时使用了 32 个内核中的大部分,我试图通过将所有 Boss/NioWorker 线程设置为 1 来限制这一点。 (尽管无论如何都有一个 channel ,但以防万一):

  • 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 处理来说太多了。
    问题)
  • 关于性能下降的建议?
  • 如何限制 Netty 使用的内核数量(当然不走 OIO 路线)?

  • 旁注:很想在 Netty 的邮件列表上讨论它,但它已关闭。尝试了 Netty 的 IRC,但它已经死了

    最佳答案

    您是否尝试过 CPU/中断关联?
    这个想法是只将 io/irq 中断发送到 1 或 2 个内核,并防止其他内核中的上下文切换。
    给它一个好。尝试 vmstat 并监视前后切换的 ctx 和反向上下文。
    您可以从中断处理程序核心取消固定应用程序。

    关于performance - 在 32 核/10Gbit 主机上调优 Netty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916796/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com