суббота, 6 декабря 2008 г.

Мы писали, мы писали, наши пальчки устали...

Вознила необходимость проверить скорость записи (и обращение вчастности) к винчестеру на виртуальном сервере.

Посмотрим насколько шустро сервачок справится с данно командочкой:

[code=sh] time dd if=/dev/zero of=FileOfZeros.txt bs=1024k count=1024 [/code]

результат не заставил долго ждать:

[code=sh]

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 31.8767 seconds, 33.7 MB/s

real 1m4.198s
user 0m0.009s
sys 0m2.792s
[/code]

Насторожило несоответсвие времени которое посчитал time и dd, оно отличается в два раза. предполагаю, что лишние 32 секунды были потрачены на открытие/закрытие файлового дескриптора. Что очень странно. И такой фигни на локальной машине нет. Т.к. установить systrace патч на ядро нет возможности написал сишную прожку чтоб замерить время обращения на определенных этапах обрщения к венику.

[code=c]

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <signal.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>

#define SIZE 1024*5 //1024
#define TIMEOUT 30
#define FILESIZE 1024

time_t start;

void checkpoint(char point[100])
{
time_t end;

time(&end);

printf(".nCheckpoint: %s second, %.2f ms spentn",
point, 1000.0 * ( end - start ) );

start = end;
}

int main(int argc, char **argv)
{
int fd, i;
char buff[SIZE];

for(i = 0; i < SIZE; i++) buff[i] = 'q';

time(&start);

if (argc != 2) {
printf("Usage: mydd <file name>n");
exit(EXIT_SUCCESS);
}

fd = open(argv[1] , O_RDWR | O_CREAT | O_TRUNC, 0666);

checkpoint("Opened file");

if (fd < 0) {
exit(EXIT_FAILURE);
}

for(i = 0; i < FILESIZE; i++)
write(fd, buff, SIZE);

char str[100];
sprintf(str, "Writed %d Mb", (int)FILESIZE/ 1024 ) ;
checkpoint( str );

close(fd);

checkpoint("Closed File");
return 0;
}
[/code]

При тестировании с гиговым файлом удалось засечь багу...

[code]

=>./mydd test
Checkpoint: Opened file second, 0.00 ms spent
Checkpoint: Writed 1 Gb second, 5000.00 ms spent
Checkpoint: Closed File second, 0.00 ms spent

=>./mydd test
Checkpoint: Opened file second, 118000.00 ms spent
Checkpoint: Writed 1 Gb second, 5000.00 ms spent
Checkpoint: Closed File second, 0.00 ms spent

[/code]

Но с 5 меговым файлом повторить не удалось. Хотя при записи vim-ом исходники не раз была задержка в !пол минуты!

Загнал в цикл тулзню для 5 метров, в итоге за 20 циклов записи файла при открытии файла было 3 задержки 1, 3 и 8 секунд! Суппорт VDS64.com молчит!

1 комментарий: