WS服务器的CPU使用率异常

时间:2016-05-26 09:32:02

标签: java websocket tyrus

我使用Tyrus实现创建了一个websocket服务器,它占用了50%的cpu,但我不知道为什么。起初我以为它是除了之后的过程,但在那之后,我写了一个非常简单的ws服务器,之后它仍然是相同的......

以下是资源监视器(Windows Server 2008 R2)的屏幕截图:enter image description here

服务器运行在Intel(R)Xeon(R)CPU E5-2650 0 @ 2.00 Ghz上,带有4GB内存 我不知道确切的架构...

简化的ws服务器的代码:

package wstest;

import javax.websocket.DeploymentException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.glassfish.tyrus.server.Server;

public class Wstest {

private static final Logger logger = LogManager.getLogger();

public static void main(String[] args) {
    runServer();
}

private static void runServer() {
    Server server = new Server("localhost", 8025, "/tp", null, wsendpoint.class);
    Runtime.getRuntime().addShutdownHook(new Thread() { 
        @Override
        public void run() {
            logger.info("Server stopped.");
        }
    });
    try {
        server.start();
        logger.info("Server started.");
        while (true) { }
    } catch (DeploymentException ex) {
        logger.fatal(ex);
    }
}

}



package wstest;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@ServerEndpoint(
    value = "/test"
)
public class wsendpoint {

private static final Logger logger = LogManager.getLogger();

@OnOpen
public void onOpen(Session session) {
    logger.info("Client " + session.getId() + " connected");
}

@OnClose
public void onClose(Session session, CloseReason closeReason) {
    logger.info("Client " + session.getId() + " disconnected.");
}

@OnMessage
public void onMessage(String request, Session session) {
    logger.info(session.getId() + " sent message : " + request);
}

@OnError
public void onError(Session session, Throwable t) {
    logger.error("Error !", t);
}

}

以下是我使用的图书馆:

enter image description here

1 个答案:

答案 0 :(得分:1)

使服务器保持运行的while循环没有限制。正因为如此,完全的cpu使用会尽可能快地实现,而不会发生任何事情。我很确定添加Thread.sleep(5)可以解决问题。修复了我需要制作一个侦听套接字的服务器的大部分时间。但是,我不知道这是否是最佳做法。