オブジェクトに対して INSERT/READ/UPDATE/DELETE 操作のみを実行するキャッシュ アプリケーション (memcached に類似) 用に UDP (Linux で) を介して独自のプロトコルを開発していますが、どの設計が最適かわかりません。
- パケットごとに 1 つの要求を送信します。(クライアントはリクエストを準備し、すぐにサーバーに送信します)
- パケットごとに複数のリクエストを送信します。(クライアントはパケット内の要求をキューに入れ、満杯 (MTU サイズに近い) になると、それをサーバーに送信します)
リクエストのサイズ (つまり、レコード データ) は 32 バイトから 1400 バイトまでです。平均的にどれくらいになるかはわかりません。ユーザーのアプリケーションに完全に依存します。
パケットごとに単一のリクエストを選択すると、多数の小さなパケットを管理する必要があり、カーネルが何度も中断されます。これにより、ユーザー空間からシステムに切り替えるときにカーネルがレジスターを保存する必要があるため、操作が遅くなります。また、ユーザーのアプリケーションが 32 バイト (udp のパケット オーバーヘッドは約 28 バイト) の要求を多数送信すると、ネットワーク トラフィックが 2 倍になり、伝送速度に大きな影響を与えます。ただし、NIC には独自のプロセッサがあり、CPU が停止することはないため、ネットワーク トラフィックが多いからといってパフォーマンスが低いとは限りません。ネットワークのボトルネックが発生した場合に備えて、追加のネットワーク カードを取り付けることができます。単一パケットを使用することの大きな利点は、サーバーとクライアントが非常に単純であるため、命令を節約して速度を上げることができることです。
パケットごとに複数のリクエストを使用すると、パケットは少なくなりますが、より大きなパケットになるため、ネットワーク経由でより多くのデータを送信できます。システム コールの数は減りますが、サーバーが複雑になると、より多くのメモリとより多くの命令を実行する必要があるため、この方法でより高速に実行できるかどうかは不明です。CPUがボトルネックになることもあるかもしれませんが、CPUを追加するのとネットワークカードを追加するのとではどちらが安いのでしょうか?
アプリケーションには、最新の CPU で 1 秒あたり 100,000 リクエストなど、重いデータ負荷が必要です。私はそれを行う方法がわかりません。「パケットごとに 1 つのリクエスト」にしようと考えていますが、複数のリクエストを処理するために既に書いたすべてのコードを書き直す前に、推奨事項を尋ねたいと思います。
前もって感謝します。