Почему отправка TCP-пакетов на локальный хост занимает так много времени?

0

Я написал простую пару [клиент]/сервер CN10]. Сервер просто запускает процесс на сокет, а затем ждет пакет от клиента, а затем отвечает другим пакетом. Клиент просто отправляет пакет на сервер, а затем ждет ответа. У меня есть код времени в клиенте прямо перед отправкой, а затем после получения.

Я запускаю сервер и клиент в своем локальном поле и подключаю клиент к локальному хосту.

В моих таймингах средняя латентность, по-видимому, составляет около 2 миллисекунд. Учитывая, что я действительно ничего не посылаю в сети. Задержка в 2 миллисекунда кажется мне ужасно высокой.

Может ли кто-нибудь объяснить, почему я вижу такую высокую задержку, или если такое количество времени реалистично для обратного адреса?

Я нахожусь в Linux Ubuntu 12.04. Я напрямую использую вызовы системных сокетов TCP, а не любую оболочку (т.е. Принимать, слушать, отправлять, получать).

Корпус сервера:

while (1) 
{   
    ++msgNum;

    sin_size = sizeof their_addr; 
    new_fd = accept(sockfd, (struct sockaddr*) &their_addr, &sin_size);
    if (new_fd == -1) 
    {   
        perror("accept");
        continue; 
    }   

    inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr*) &their_addr), 
        s, sizeof s); 
    printf("server: got connection from %s\n", s); 

    if (!fork())
    {   
        close(sockfd); // child doesn't need the listener

        MyMsg msg;
        strcpy(msg.buf, "Hello world");

        for (int i = 1; i <= NUM_TEST_MSGS; ++i)
        {   
            msg.id = i;

            int numbytes = 0;
            int bytesRecv = 0;

            while (numbytes < MSG_LEN)
            {   
                int sendSize = MSG_LEN - numbytes;
                if ((bytesRecv = send(new_fd, ((char*) &msg) + numbytes, 
                        sendSize, 0)) == -1) 
                {   
                    perror("send");
                    exit(1);
                }   
                numbytes += bytesRecv;
            }   

            assert(numbytes == MSG_LEN);

            //printf("Server sent %d num bytes\n", numbytes);
        }   

        printf("Server finished sending msgs.\n");

        close(new_fd);
        exit(0);
    }   
    close(new_fd);
} 

Тело клиента:

for (int i = 1; i <= NUM_TEST_MSGS; ++i)
{
    MyMsg msg;

    int numbytes = 0;
    int bytesRecv = 0;

    int start = rdTsc.Rdtsc();

    while (numbytes < MSG_LEN)
    {
        int recvSize = MSG_LEN - numbytes;
        if ((bytesRecv = recv(sockfd, ((char*) &msg) + numbytes, recvSize, 0)) == -1)
        {
            perror("recv");
            exit(1);
        }

        numbytes += bytesRecv;
    }

    int end = rdTsc.Rdtsc();

    perfCounter.Track(end - start);

    if (numbytes != MSG_LEN)
    {
        printf("COMP FAILED: %d %d\n", numbytes, MSG_LEN);
    }

    assert(numbytes == MSG_LEN);

    if (i != msg.id)
    {
        printf("Msg %d id %d \n", i, msg.id);
    }

    //if (numbytes != MSG_LEN) printf("GOT WEIRD SIZE %d\n", numbytes);
    assert(msg.id == i);

    //printf("client: received %d num bytes id %d body '%s'\n", numbytes, msg.id, msg.buf);

    if (i % 1000 == 0)
    {
        printf("Client: Received %d num msgs.\n", i);
    }
}

printf("Client: Finished successfully.\n");

close(sockfd);
  • 0
    Если вы разместите свой код, мы можем помочь вам лучше.
Теги:
performance
tcp

1 ответ

0

2ms, безусловно, звучит высоко для чего-то, что, вероятно, никогда не покидало буферы ядра. Я подозреваю, что на самом деле это могут быть неточности в функции, используемой для тиснения времени.

  • 0
    Ну, моя временная метка использует счетчики tsc, а не системные вызовы. И я использовал эти счетчики раньше для других целей. Так что я могу исключить отметку времени.
  • 0
    Насколько большие сообщения? С первого взгляда не могу обнаружить ничего очевидного (повторяющиеся printf () и / или постоянное открытие / закрытие), поэтому я сейчас перехожу к действительно умозрительным вещам, таким как Linux, решив блокировать, а не наращивать буферы ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню