2009-09-29 11 views
2

Je vais d'abord admettre que c'est pour un projet de classe, car ce sera assez évident. Nous sommes supposés faire des lectures pour tester la taille de bloc du système de fichiers. Mon problème est que le temps pris pour faire ceci semble augmenter linéairement, sans étapes comme je m'attendrais.Sondage pour la taille de bloc de système de fichiers

Je chronométrer la lecture comme ceci:

double startTime = getticks(); 
read = fread(x, 1, toRead, fp); 
double endTime = getticks(); 

où GetTicks utilise des instructions RDTSC. J'ai peur qu'il y ait une mise en cache/préextraction qui fait en sorte que les lectures ne prennent pas de temps pendant le fread. J'ai essayé de créer un fichier aléatoire entre chaque exécution de mon programme, mais cela ne soulage pas mon problème.

Quelle est la meilleure façon de mesurer avec précision le temps nécessaire à la lecture d'un disque? Je suis assez sûr que ma taille de bloc est 4096, mais comment puis-je obtenir des données pour soutenir cela?

+0

Voulez-vous que quelque chose donne la taille du bloc, ou des conseils sur l'amélioration de votre expérience pour deviner la taille du bloc à partir de la synchronisation? –

+0

Je suppose que je suis à la recherche d'aide expérimentale. J'ai du mal à faire en sorte que C fasse ce que je veux avec les E/S. – plor

+0

Extraire fcntl (.., F_NOCACHE, ..) pour désactiver complètement la mise en cache. – rpj

Répondre

1

Vous pouvez utiliser les appels système (open(), read(), write(), ...) directement pour réduire l'impact de la mise en mémoire tampon fait par les choses FILE*. En outre, vous pouvez utiliser des E/S synchrones en quelque sorte. Un moyen est l'ouverture du fichier avec l'indicateur O_SYNC défini (ou O_DIRECT selon la réponse d'ephemient). Citant Linux open (2) Manuel:

O_SYNC The file is opened for synchronous I/O. Any write(2)s on the 
      resulting file descriptor will block the calling process until 
      the data has been physically written to the underlying hardware. 
      But see NOTES below. 

Une autre option serait le montage du système de fichiers avec -o sync (voir mount (8)) ou définissant l'attribut S sur le fichier en utilisant la commande chattr (1).

2

La façon habituelle de déterminer la taille d'un bloc de système de fichiers consiste à demander au système de fichiers quelle est sa taille de bloc.

#include <sys/statvfs.h> 
#include <stdio.h> 
int main() { 
    struct statvfs fs_stat; 
    statvfs(".", &fs_stat); 
    printf("%lu\n", fs_stat.f_bsize); 
} 

Mais si vous voulez vraiment, open(…,…|O_DIRECT) ou posix_fadvise(…,…,…,POSIX_FADV_DONTNEED) va essayer de vous laisser contourner le cache de la mémoire tampon du noyau (non garanti).

+0

Merci, je dois générer un graphique que je peux pointer vers quelque chose qui indique la limite de bloc. Je vais essayer ceci et l'accepter si ça marche pour moi. – plor