ReadFile et performance

Signaler
Messages postés
23
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007
-
Messages postés
23
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007
-
Bonjour,
Je fait des test actuellement sur une machine équipée d'un RAID 0 de 4 disques, qui avec le logiciel hd_speed me donne un taux de lecture de 250Mo/s. j'ai peuplé le disque de fichier de taille identique (1Go), et ai écrit une petite boucle qui lit récursivement les données pour les placer dans un buffer. Chose très étonnante le taux de transfert refuse de depasser les 80Mo secondes, les disques ne peuvent pas être fragmenté, ils viennent d'être formatés, et la lecture est purement sequentielle, alors qu'aucun autre processus n'accede au disque.
Voici un exemple de boucle de lecture :

    while(1)
    {
        ReadFile(ithis->hwnd,ithis->buffer,ithis->bufsize,&ithis->byteread,NULL) ;
        if (ithis->byteread == 0 )
                break ;
        //WaitForSingleObject( ithis->mutex, INFINITE ) ;
        ithis->lasttime = time(NULL) ;
        ithis->totaldata += ithis->byteread ;
        if((ithis->lasttime - ithis->timebegin) !=0) 
            ithis->moyenne = (ithis->totaldata/(ithis->lasttime - ithis->timebegin))/1024 ;
        //ReleaseMutex(ithis->mutex) ;
    }
La vitesse passe de + de 250Mo/s a à peinne 80Mo/s (souvent moins), ce que je n'arrive à expliquer. Même en faisant varier la taille des blocs de données lue (de 512Ko à 512Mo), je n'arrive pas à dépasser ce résultat. Les choses se passent pourtant bien en mémoire, et pas dans le fichier d'échange. (machine avec 4Go de ram)
Quelqu'un connatrait il une méthode plus efficace pour lire à cette vitesse ?  ou un élément de réponse ?
Je précise que la consommation processeur est très faible, lorsque la boucle tourne (de l'ordre de 3, 4% )
Merci beaucoup
zat All fo'kz

3 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
ReadFile(ithis->hwnd << Ca fait peur (en général, hwnd c'est pour une fenêtre)

Sinon tu peux essayer d'ouvrir directement le disque dur, la au moins tu es sur que ce sera vraiment séquentiel.

Mais sinon vu que tu es en raid0, peut être que le logiciel qui lit à 250Mo/s s'arrange pour lire en même temps sur les 4 disques (je ne sais pas comment il pourrait faire ca, mais on ne sait jamais). Je remarque seulement que le rapport entre plus de 250 et moins de 80 est d'environ 4, en tous cas on peut toujours s'arranger pour que ca fasse 4 :)

Pour la taille du buffer, inutile de monter aussi haut, normalement 4 à 8Ko doivent donner de bons résultats

_____________________________________
Messages postés
23
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Oui, le hwnd peut faire peur, c'est écrit un peu salement ;p. Mais c'est bien un handle. le volume raid0 est géré par une carte raid, et en le testant sur le raid géré par le chipset de la carte mere, les resultats sont identiques. Les quatres disques  sont considérés comme un seul et unique volume sous l'OS, et à moin d'utiliser des techniques un peu exotique il n'est pas possible de lire en même temps sur les 4 disques, ou du moins, c'est ce que la carte raid est cencé faire ! Le logiciel doit lire des blocs de données sans se soucier du file system, et je doute qu'une telle perte soit dûe à NTFS, ce serait catastrophique sinon... je seche

zat All fo'kz
Messages postés
23
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Je reviens sur ce sujet après avoir suivis tes conseils : il semblerait qu'une taille de bloc de 4Ko voir moins, donne entiere satisfaction. Des que la taille de bloc dépasse le Mo les performances chutent (idem en dessous de 2Ko), c'est pourquoi j'ai du mal à saisir la logique qui se cache derriere cette fonction :

Quand on l'apelle 50000 fois pour lire un petit bloc, elle est plus performante (bcp plus) que quand on lui demande un très gros bloc, ce que je trouve un peu incoherent !

Cette fois ci, et dans une autre configuration RAID (6 disques en RAID 5), les performances dépassent les 300Mo/s.

zat All fo'kz