Почему эта программа на C сообщает о большей пропускной способности, чем nload? - PullRequest
1 голос
/ 07 октября 2011

Я запускаю следующую программу на C между двумя машинами с 10GibE;программа сообщает 12Gib / s, тогда как nload сообщает (более правдоподобно) 9.2Gib / s.Может кто-нибудь сказать мне, что я делаю неправильно в программе?

.
.
#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/s\n", 32.0/(((double) (clock() - start)) / CLOCKS_PER_SEC));
      start = clock();
    }
  }

Это CentOs 6.0 в Linux 2.6.32;нагрузка 0.7.3, gcc 4.4.4.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

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

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

1 голос
/ 07 октября 2011

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

РЕДАКТИРОВАТЬ: к сожалению, это должно было быть написать ().

...