3

我使用 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);
        }
    }

谢谢。

4

2 回答 2

1

没有办法准确衡量另一个线程的成本,这取决于太多的因素。

但是,对于您的特殊情况,Java 提供了 NIO 概念,使用选择器通过了解实际需要处理的连接来启用几个线程来处理所有传入请求。除非您是 Java 大师(或出于其他原因需要自己编写此代码),否则我强烈建议您使用现有的库,因为有太多的陷阱无法再次重新发明轮子。

如果每个核心有 1 个线程,并且可以确保它永远不会阻塞/休眠,那么您将始终拥有最佳性能。选择器 + 非阻塞 IO 将确保这一点。

于 2013-10-12T00:42:57.553 回答
1

任何或多或少的现代计算机都会处理 500 个线程,这不是问题(我想您不会在每个线程中分配 GB 的内存)

问题 -当所有 500 个线程同时运行时,每个线程需要多长时间才能完成它的执行

例如,如果每个线程不通过共享资源(如 db)阻塞其他线程,并且从开始到结束需要 1 秒,我们有 8 个线程 cpu - 这意味着只有 8 个线程将真正同时运行,所以每秒只有 8 个线程将完成,其他线程将等待启动,因此最后一个线程将在 63 秒内完成,常见的超时时间约为 30-60 秒,这意味着最后一个线程的结果将不会到达客户端

因此,为了大致了解,您可以计算一个线程的执行时间(T 秒或毫秒),然后您会发现您的服务器每秒能够处理多少个请求

当然这将是一个非常近似的值,因为线程之间的上下文切换也需要时间

于 2013-10-12T00:50:25.313 回答