Java 使用Undertow的Websocket代理的高CPU使用率

Java 使用Undertow的Websocket代理的高CPU使用率,java,websocket,proxy,reverse-proxy,undertow,Java,Websocket,Proxy,Reverse Proxy,Undertow,我使用Java的Undertow库创建了一个代理,它将用户websocket连接重定向到同一台计算机的不同端口 问题是,只有200或300个WebSocket连接,程序开始使用大量CPU 我已将JProfiler连接到应用程序,所有线程要么处于等待状态,要么处于网络IO状态 代理服务器以以下方式启动: Undertow reverseProxy = Undertow.builder() .addHttpListener(80, "0.0.0.0")

我使用Java的Undertow库创建了一个代理,它将用户websocket连接重定向到同一台计算机的不同端口

问题是,只有200或300个WebSocket连接,程序开始使用大量CPU


我已将JProfiler连接到应用程序,所有线程要么处于等待状态,要么处于网络IO状态

代理服务器以以下方式启动:

 Undertow reverseProxy = Undertow.builder()
            .addHttpListener(80, "0.0.0.0")
            .addHttpsListener(443, "0.0.0.0", sslContext)
            .setIoThreads(4)
            .setHandler(new ProxyHandler(reverseProxyServer, encodingHandler))
            .build();
    reverseProxy.start();
我认为这可能是一个配置问题,因为我不认为这样的CPU使用是正常的

(黄色正在等待,浅蓝色是净io,绿色正在运行)

编辑: 我发现代理CPU的CPU使用率通常保持在30%左右,在随机周期内几乎达到100%,其中一个IO线程开始执行大量可运行操作,请参见屏幕截图:


“所有线程要么处于等待状态,要么处于网络IO状态。”如果这是真的,则CPU负载不能很高-除非其他程序占用CPU时间。我会尝试另一台计算机,以确保它不是硬件/驱动程序问题。顺便说一下:300个开放式插座太多了。我看到的大多数服务器同时处理少于50个连接。@Stefan您可以查看屏幕截图以查看线程和方法。Linux上的“top”命令报告程序的CPU使用率很高,有时高达80%或更多。当套接字直接连接到端点程序(没有代理)时,它们的CPU使用是正常的。但是当通过代理完成时,代理的CPU使用率要高得多。我无法从“顶部”看到您的屏幕截图。我目前限制了用户数量,因此CPU使用率现在约为25%。你想看看top的具体部分吗?我想看看哪个程序会导致高CPU负载,它使用了多少内存,因为你的屏幕截图没有回答你的问题。目前,从默认的“top”视图中选择一个简单的屏幕截图就可以了。