2009-05-29 10 views
1

Dans les E/S de fichier C, l'indicateur O_DIRECT peut être utilisé pour réduire les effets de cache pour un fichier open(). Je comprends que ce n'est pas une fonctionnalité POSIX, a été présent dans le noyau Linux depuis la version 2.4.10, et que Linus est opposé à l'interface en général. Sous NetBSD, il semble fonctionner comme annoncé. Exemple d'appel:Portabilité de l'ouverture (... O_DIRECT) dans C?

 
int fd = open(filename, O_DIRECT); 

Je cherche à écrire des utilitaires d'analyse comparative de disque à faible niveau, et l'utilisation O_DIRECT semble être un potentiellement bon moyen de mesurer le disque et les performances du disque sans les effets du système de fichiers OS/cache de bloc . Idéalement, je voudrais être capable d'exécuter le benchmark sur les systèmes Linux, Windows (Cygwin is OK), Mac OS X et BSD. Est-O_DIRECT le meilleur moyen de contourner les caches de disque du système d'exploitation, en termes de portabilité et de fiabilité pour l'analyse comparative? Existe-il des alternatives?

+0

Vous devez inclure un indicateur autre que simplement O_DIRECT dans l'appel à open(); ce que vous avez fait, implicitement, c'est utiliser O_RDONLY, alias 0. –

+1

Pour les prochaines recherches Google, cette question est traitée par cette autre question de StackOverflow: http://stackoverflow.com/questions/2299402/how-does-one-do -raw-io-sur-mac-os-x-ie-équivalent-à-linuxs-o-direct-flag –

Répondre

1

O_DIRECT n'existe même pas sur Mac OS X (je l'ai simplement grep dans/usr/include et il n'y était pas). En ce qui concerne Linux, que fera votre outil hdparm?

+0

Merci. hdparm est utile ("hdparm --direct -t" et "hdparm --direct -T" donnent respectivement les débits de transfert séquentiel et en rafale du lecteur), mais je voudrais aussi tester des modèles d'E/S aléatoires. – cheduardo

1

Je ne pense pas qu'il est pris en charge par Windows - au moins, je ne trouve aucune mention dans le MSDN. Cela signifie qu'il ne peut probablement pas être pris en charge par Cygwin non plus, car Cygwin doit utiliser le système d'exploitation Windows sous-jacent.