我实现了一个系统来处理使用Java的500个套接字连接,每个连接都在自己的线程中。 因此,当所有连接都处于活动状态时,我运行了500个线程。
具有8 GB RAM的服务器英特尔®至强®处理器E5620是否足以处理所有这些线程?
答案是肯定还是否定,我如何计算成本?
示例代码:
Executor executor = Executors.newFixedThreadPool(500);
ServerSocket serverSocket = null;
Socket socket;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
if (serverSocket != null) {
socket = serverSocket.accept();
} else {
continue;
}
SocketClient client = new SocketClient(socket);//socket client is responsible for handling string values that will be read from socket, and insert values to the DB
executor.execute(client);
} catch (IOException e) {
connectedDevices.remove("Unknown" + i);
}
}
感谢。
答案 0 :(得分:1)
没有办法准确衡量另一个线程的成本,这取决于太多因素。
然而,对于您的特殊情况,Java提供了NIO概念,使用Selectors使一些线程能够通过了解哪个连接实际需要处理来处理所有传入请求。除非你是Java Guru(或者由于某些其他原因需要自己编写),我强烈建议使用现有的库,因为有太多的陷阱可以再次推理重新发明轮子。
如果每个核心有1个线程,如果可以确保它永远不会阻塞/睡眠,那么总是会有最佳性能。选择器+非阻塞IO将确保这一点。
答案 1 :(得分:1)
任何或多或少的现代计算机都会处理500个线程,这不是问题(我想你不会在每个线程中分配GB内存)
问题 - 每个线程完成所需的时间当所有500个线程同时运行时执行
例如,如果每个线程不通过共享资源(如db)阻止其他线程,并且从开始到结束需要1秒,并且我们有8个线程cpu - 这意味着只有8个线程将同时运行,所以每个第二个只有8个线程将完成,其他将等待启动,所以最后一个线程将在63秒左右完成,常见超时约为30-60秒,这将意味着最后一个线程的结果将无法到达客户端
所以,为了做近似的理解,你可以计算一个线程的执行时间(T秒或毫秒),然后你会发现你的服务器能够处理的每秒请求数
当然它将是非常近似的值,因为线程之间的上下文切换也需要时间