ReadFile et performance

bAzilew Messages postés 23 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 23 mars 2007 - 12 mars 2007 à 17:19
bAzilew Messages postés 23 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 23 mars 2007 - 20 mars 2007 à 11:38
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mars 2007 à 18:51
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

_____________________________________
0
bAzilew Messages postés 23 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 23 mars 2007
12 mars 2007 à 21:34
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
0
bAzilew Messages postés 23 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 23 mars 2007
20 mars 2007 à 11:38
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
0
Rejoignez-nous