Почему эта программа на C сообщает о большей пропускной способности, чем nload?

#c #networking #tcp #centos #benchmarking

#c #сеть #tcp #centos #сравнительный анализ

Вопрос:

Я запускаю следующую программу на C между двумя машинами с 10 гигабайтами; программа сообщает 12 гигабайт / с, тогда nload как сообщает (более правдоподобно) 9,2 Гигабайт / с. Кто-нибудь может сказать мне, что я делаю не так в программе?

 .
.
#define BUFFSZ (4*1024)
char buffer[BUFFSZ];
.
.
  start = clock();

  while (1) {
    n = write(sockfd, buffer, BUFFSZ);
    if (n < 0)
       error("ERROR writing to socket");
    if (  blocks % (1024*1024) == 0)
    {
      blocks = 0;
      printf("32Gib at %6.2lf Gib/sn", 32.0/(((double) (clock() - start)) / CLOCKS_PER_SEC));
      start = clock();
    }
  }
  

Это CentOS 6.0 на Linux 2.6.32; nload 0.7.3, gcc 4.4.4.

Комментарии:

1. Может ли быть так, что ваша программа измеряет пропускную способность в системном буфере, а nload измеряет всю его?

2. @spraff ваше замечание верно, если сокет открыт в неблокирующем режиме.

3. @Fixee можете ли вы предоставить код открытия сокета?

Ответ №1:

Во-первых, clock() возвращает оценку времени процессора, используемого программой, а не время настенных часов — таким образом, ваш расчет показывает, что вы передаете 12 ГБ в секунду используемого времени процессора. Вместо этого используйте clock_gettime() с идентификатором часов CLOCK_MONOTONIC для измерения времени настенных часов.

Во-вторых, после write() возврата данные еще не обязательно отправляются в сеть — они просто копируются в буферы ядра для отправки. Это даст вам более высокую скорость передачи данных в начале соединения.

Комментарии:

1. При изменении на clock_gettime() программа сообщает о правильной пропускной способности.

Ответ №2:

Проверьте, что возвращаемое значение из read() n может быть короче BUFFSZ .

РЕДАКТИРОВАТЬ: упс, это должно было быть write() .