2013-04-08 8 views
6

voglio eseguire un semplice test di prestazioni del disco su una piattaforma RHEL 6. È solo per scrivere 1 GB byte sul disco. Ho trovato se il file è stato scollegato per primo, sarebbe molto più veloce di quanto non fosse troncato. Era circa 1.5s contro 15s.fwrite() è più veloce se unlink() il file in prima di troncare lo

Perché? Ho pensato che unlink() l'ultimo hard link troncherà il file a 0 e cancellerà l'inode. Perché le fwrites erano più veloci con unlink() che truncate?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int 
main(int argc, char* argv[]) 
{ 
    if (argc < 2) { 
     return -1; 
    } 

    char buf[1024]; 

    srand(time(0)); 

    int i; 
    for (i = 0; i < 1024; ++i) { 
     buf[i] = rand(); 
    } 

    /* unlink(argv[1]); */ 
    FILE* fp = fopen(argv[1], "wb+"); 
    if (fp == NULL) { 
     perror("fopen"); 
     return -1; 
    } 

    for (i = 0; i < 1024 * 1024; ++i) { 
     if (fwrite(buf, 1024, 1, fp) != 1) { 
      perror("fwrite"); 
      return -1; 
     } 
    } 

    return 0; 
} 

risposta

5

eliminazione di un file può apparire più velocemente di troncare quando si dispone di spazio libero sufficiente sul disco e il file system in grado di eliminare i file e recuperare il loro spazio pigramente. Può semplicemente contrassegnare l'inode come cancellato ed eliminare il file in background o in un secondo momento e creare un nuovo inode quasi istantaneamente, pronto per nuove scritture.

+0

Alexey, grazie per la risposta. Ho pensato la stessa cosa anche se non ne sono sicuro. Ma ancora non capisco perché truncate non sia implementato in questo modo. Se un file viene troncato a zero, perché non spostare i blocchi troncati in un nuovo inode e mantenere pulito l'inode corrente per la prossima scrittura? – Zhongzhi

+0

Non lo so per certo. In realtà, la risposta alla tua domanda dipende dall'implementazione del file system. Si consiglia di effettuare ulteriori ricerche, consultare la documentazione del file system o il codice sorgente e consultare le discussioni sul rendimento sul web. –

+1

@Zhongzhi "perché non spostare i blocchi troncati in un nuovo inode" - Quale nuovo inode? L'allocazione di un inode solo per rendere il tuo programma più veloce a spese del resto del sistema è un'idea pessima e una inutile complicazione del codice FS. Questo è molto diverso dal fatto che il recupero dei blocchi dopo aver eliminato l'ultimo collegamento a un file non viene addebitato al deleter perché i blocchi vengono recuperati in modo asincrono. –

Problemi correlati