É razoável que um disco aleatório busque & leia custos ~ 16ms?

2

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; }
    
por Fan 28.11.2012 / 03:36

2 respostas

5

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.

    
por 28.11.2012 / 03:44
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?

    
por 01.12.2012 / 17:04