#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() .