3

Java を使用して 500 のソケット接続を処理するシステムを実装しました。各接続は独自のスレッドで行われます。したがって、すべての接続が有効な場合、500 個のスレッドが実行されています。

8 GB の RAM を搭載したサーバー Intel® Xeon® Processor 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

多かれ少なかれ最新のコンピューターは 500 スレッドを処理しますが、それは問題ではありません (それぞれに GB のメモリを割り当てていないと思います)。

問題 - 500 個すべてが同時に実行されている場合、各スレッドが実行を終了するのにかかる時間

たとえば、各スレッドが共有リソース (db など) を介して他のスレッドをブロックせず、開始から終了までに 1 秒かかり、8 スレッドの CPU がある場合、これは 8 スレッドのみが実際に同時に実行されることを意味するため、各秒は 8 のみですスレッドは終了し、他のスレッドは開始を待機するため、最後のスレッドは約 63 秒で終了します。一般的なタイムアウトは約 30 ~ 60 秒です。これは、最後のスレッドの結果がクライアントに届かないことを意味します。

したがって、おおよその理解を行うために、1 つのスレッドの実行時間 (T 秒またはミリ秒) を計算すると、サーバーが 1 秒あたりに処理できるリクエスト数がわかります。

もちろん、スレッド間のコンテキスト切り替えにも時間がかかるため、非常に近似値になります。

于 2013-10-12T00:50:25.313 に答える
1

別のスレッドのコストを正確に測定する方法はありません。あまりにも多くの要因に依存します。

ただし、特別なケースでは、Java は NIO の概念を提供し、セレクターを使用して、実際に処理が必要な接続を知ることで、いくつかのスレッドがすべての着信要求を処理できるようにします。あなたが Java Guru でない限り (または何らかの理由でこれを自分で作成する必要がある場合)、既存のライブラリを使用することを強くお勧めします。

ブロック/スリープしないことを確認できれば、コアごとに 1 つのスレッドがあれば、常に最高のパフォーマンスが得られます。そして、セレクター + ノンブロッキング IO がそれを確実にします。

于 2013-10-12T00:42:57.553 に答える