Claro - você vai querer dar uma olhada na especificação de tempo de busca do seu drive, mas 16ms está bem dentro do reino de "normal" para girar mídia magnética.
Estou frustrado com a latência da leitura aleatória de um disco não-ssd. Com base nos resultados do programa de teste a seguir, ele acelera ~ 16 ms para uma leitura aleatória de apenas 512 bytes sem a ajuda do cache do sistema operacional.
Eu tentei alterar 512 para valores maiores, como 25k, e a latência não aumentou tanto. Eu acho que é porque a busca do disco domina o tempo.
Eu entendo que a leitura aleatória é inerentemente lenta, mas apenas quero ter certeza de que ~ 16ms é razoável, mesmo para discos que não sejam ssd.
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
int fd = open(argv[1], O_RDONLY);
if (fd < 0) {
fprintf(stderr, "Failed open %s\n", argv[1]);
return -1;
}
const size_t count = 512;
const off_t offset = 25990611 / 2;
char buffer[count] = { '#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
int fd = open(argv[1], O_RDONLY);
if (fd < 0) {
fprintf(stderr, "Failed open %s\n", argv[1]);
return -1;
}
const size_t count = 512;
const off_t offset = 25990611 / 2;
char buffer[count] = { '%pre%' };
struct timeval start_time;
gettimeofday(&start_time, NULL);
off_t ret = lseek(fd, offset, SEEK_SET);
if (ret != offset) {
perror("lseek error");
close(fd);
return -1;
}
ret = read(fd, buffer, count);
if (ret != count) {
fprintf(stderr, "Failed reading all: %ld\n", ret);
close(fd);
return -1;
}
struct timeval end_time;
gettimeofday(&end_time, NULL);
printf("tv_sec: %ld, tv_usec: %ld\n",
end_time.tv_sec - start_time.tv_sec,
end_time.tv_usec - start_time.tv_usec);
close(fd);
return 0;
}
' };
struct timeval start_time;
gettimeofday(&start_time, NULL);
off_t ret = lseek(fd, offset, SEEK_SET);
if (ret != offset) {
perror("lseek error");
close(fd);
return -1;
}
ret = read(fd, buffer, count);
if (ret != count) {
fprintf(stderr, "Failed reading all: %ld\n", ret);
close(fd);
return -1;
}
struct timeval end_time;
gettimeofday(&end_time, NULL);
printf("tv_sec: %ld, tv_usec: %ld\n",
end_time.tv_sec - start_time.tv_sec,
end_time.tv_usec - start_time.tv_usec);
close(fd);
return 0;
}
Se você estiver fazendo algo que acabará em produção, deverá haver uma camada de cache, um controlador RAID real e outros fatores em jogo. O que você está correndo? Qual é o objetivo deste exercício? Você pode elaborar os detalhes dessa configuração?
Tags performance hard-drive linux