美文网首页
解决UDP多线程并发和丢包问题

解决UDP多线程并发和丢包问题

作者: 多关心老人 | 来源:发表于2022-03-30 23:32 被阅读0次

项目使用了Netty UDP,代码中设置了BossGroup线程数如下

private void start() {
        group = new NioEventLoopGroup(10, r -> {
            return new Thread(r, "server-worker-" + WORKER_THREAD_INDEX.incrementAndGet());
        });
        try {
            Bootstrap b = new Bootstrap()
                    .group(group)
                    .channel(NioDatagramChannel.class)
                    .handler(new ChannelInitializer<Channel>() {
                        @Override
                        protected void initChannel(Channel channel) {
                            ChannelPipeline ch = channel.pipeline();
                            ch.addLast(new ServerChannelHandler());

                        }
                    });
            b.bind(9876).sync().channel().closeFuture().await();
        } catch (InterruptedException e) {
            log.error(e.getMessage(), e);
        } finally {
            group.shutdownGracefully();
        }
    }

但是压测后发现只有一个线程在处理请求,并不是想象中的10个线程并发处理。
debug发现ChannelContext中的Channel始终是同一个对象不是多个,而一个Channel只会被一个线程处理,因此需要在接收到请求后再放入到业务线程池处理。

并发数上来后发现有消息丢失,通过watch -d 'netstat -su' 发现UDP的packet receive errorsreceive buffer errors 同步增长,怀疑是内核缓存区太小应用层处理不过来导致的。通过调整如下参数解决:

sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400
sudo sysctl -w net.core.netdev_max_backlog=2000

如果要永久生效,需要在/etc/sysctl.conf中配置。
参考:https://blog.csdn.net/u011001084/article/details/79093393

项目中top命令发现CPU占用不高但是系统负载很高,排查发现是磁盘IO性能太差导致的。
具体为什么CPU使用率低而Load高 参考 https://developpaper.com/the-reason-of-low-cpu-utilization-and-high-load-take-a-look-at-this-article/#:~:text=Low%20CPU%20and%20high%20load%20means%20that%20there%20are%20too,or%20idle%20at%20this%20time.

相关文章

  • 解决UDP多线程并发和丢包问题

    项目使用了Netty UDP,代码中设置了BossGroup线程数如下 但是压测后发现只有一个线程在处理请求,并不...

  • 关于android 实现udp 过程

    注意 :udp存在丢包问题 也不能保证每次发包都能接收到 UDP通信步骤: 1、建立连接的IP地址和端口号,IP即...

  • 闲言之PHP不支持多线程??

    前言 为什么考虑到多线程呢?--------为了有效率的解决并发问题; 那怎么将多线程应用结合到PHP应用解决并发...

  • ThreadLocal源码解析与运用(上)

    ThreadLocal需要解决的问题是什么 ThreadLocal被用来“解决多线程并发”问题 ThreadLoc...

  • Tutorial

    Java Concurrency涵盖了Java平台上的多线程、并发性和并行性。这包括Java并发工具、问题以及解决...

  • LWIP UDP偶发丢包问题

    RTTHREAD LWIP实现UDP通讯,使用得socket通讯偶发UDP丢包,用Wireshark监控通讯数据,...

  • 一些基础之一

    高并发 面试的时候都喜欢问这个问题,解决高并发的问题根源在于解决高并发下共享资源的控制问题。也就牵扯到多线程下共享...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • iOS 多线程问题

    目录多线程简介iOS多线程NSThread解决线程阻塞问题多个线程并发线程状态扩展--NSObject分类扩展方法...

  • UDP丢包原因总结

    丢包检查方法 给每个UDP包编号,对比收发端的接收到的包。对于UDP协议层上的包,例如RTP包,可以从RTP包中读...

网友评论

      本文标题:解决UDP多线程并发和丢包问题

      本文链接:https://www.haomeiwen.com/subject/yfkgjrtx.html