2010-07-26 2 views
3

Je voudrais comprendre la question suivante:Seuls les écritures sur le disque, mais montre iotop lit ainsi

Un processus fait appel en écriture sys seulement, dans une boucle infinie. Quand j'apporte iotop je m'attendrais à voir une vitesse d'écriture non nulle et une vitesse de lecture nulle liée à ce processus. Mais iotop dit que read et write peuvent être égaux (en fonction de la taille d'écriture). Jetez un oeil sur le code C:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#define BUFSIZE 1000000 

char buf[BUFSIZE]; 
const int write_size = 4000; 

int main(){ 
    int fd; 
    if ((fd = open("filename", O_RDWR | O_CREAT, 0666)) < 0){ 
    return -1; 
    } 
    ssize_t ret; 
    while (1){ 
    ret = write(fd, buf, write_size); 
    if (ret != write_size){ 
     return -1; 
    } 
    } 
    return 0; 
} 

Si vous attribuez des valeurs différentes à « write_size » vous verrez différentes vitesses de lecture en iotop. Si la valeur est comme dans le code ci-dessus, les lectures iotop read et write sont égales.

Important:
La question apparaît que sous certaines conditions:
- Le fichier doit être créé et rempli de données (permet de dire au moins 8 Go) avant d'exécuter le code

OS conf:
Debian lenny, 2 To disque, (xfs et ext4 testé), uname -a Linux g-6 2.6.26-bpo.1-xen-amd64 # 1 SMP lun. 12 janv. 14:32:40 UTC 2009 x86_64 GNU/Linux

Merci dans le Advan ce pour résoudre le mystère,
Michal.

+0

Super écrit pour cette question! Je souhaite que chaque débutant était si bien écrit et complet en décrivant leur problème. Bienvenue sur le site! –

Répondre

3

Vous ouvrez un fichier existant avec des données. Vous l'écrasez (pas O_APPEND). Ainsi, lors de l'écriture de données X, un système de fichiers doit obtenir le contenu (= block), mettre votre écriture dessus, puis repousser le bloc sur le disque.

2

Vous ouvrez le fichier en mode remplacement mais vous écrivez en morceaux qui ne sont pas un multiple de la taille de bloc sur le disque (4000 au lieu de 4096). Donc, de temps en temps, le processus va vider les tampons et il devra lire un bloc à partir du disque pour compenser l'écart.

Ajoutez O_TRUNC pour faire disparaître le mystère. Notez que le processus va maintenant se bloquer au démarrage, car il faut un certain temps pour supprimer 8 Go.

0

Essayez d'ouvrir le fichier avec O_WRONLY | O_CREAT, si vous voulez l'ouvrir juste pour écrire. Il peut résoudre le problème et semble raisonnable lorsque vous dites que le fichier doit contenir des données avant d'appeler open().

Questions connexes