0

Debian Wheezy (リアルタイム パッチ付き) でリアルタイム プロジェクトに取り組んでいます。TCP 通信プロトコルを使用した強力な反応性が必要です。

リクエストを送信すると、応答時間が長すぎて (220us)、理由がわかりません。私の問題は、リクエストを送信したときに、アプリケーションサーバーの応答がニーズに対して遅すぎることです。

そこで、TCP ソケットを使用してサーバーの応答時間を取得する短いプログラムを作成することにしました。(以下のコードを参照)

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

int main(int argc, char* argv[])
{
    char sendBuffer [] = "OK";
    char buffer [10];
    int socket1;
    int workingSocket;
    socklen_t len;

    int nodelay = 1;

    struct sockaddr_in sa1;
    struct sockaddr sa2;
    socket1 = 0;
    workingSocket = 0;

    len = sizeof(sa1);
    memset(&sa1, 0, len);

    sa1.sin_addr.s_addr = htonl (INADDR_ANY);
    sa1.sin_family = AF_INET;
    sa1.sin_port = htons(12345);

    socket1 = socket(AF_INET, SOCK_STREAM, 0);

    bind(socket1, (struct sockaddr *)&sa1, len);

    listen(socket1, 10);

    workingSocket = accept(socket1, &sa2, &len);

    setsockopt (workingSocket, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay));

    // receive and send message back
    while (1)
    {
        recv(workingSocket, buffer, 5, MSG_WAITALL);

        send(workingSocket, sendBuffer, 2, 0);
    }
}

次の手順で応答時間を確認します。

  • Wireshark セッションを開始して、ネットワーク トラフィックをトレースします
  • 私のCサーバーを起動します。
  • たとえば、TCP リクエストを送信します: $echo 'abcde'|netcat 192.168.0.1 12345

文字列が送信された瞬間 (abcde) からソケットで応答を受信した瞬間 (OK) までの応答時間は約 200 µs でした。

今回はかなり高いようです。VxWorks で同じ経験をしたところ、応答時間が 10µs に近づきました。

Linux カーネルは本当に遅いのでしょうか、それともシステムの反応性を高める方法はありますか?

あなたの助けとアドバイスをありがとう。

4

0 に答える 0