2012-06-21 16 views
5

Sto implementando il comando cp (file copy) usando mmap(). Per quello ho mappato il file sorgente in MAP_PRIVATE (come voglio solo leggere) la modalità e il file di destinazione in modalità MAP_SHARED (Come devo scrivere il contenuto modificato del file di destinazione).Come disabilitare Copy-on-write e zero riempito su richiesta per mmap()

Durante questa operazione ho osservato la penalità delle prestazioni a causa di numerosi errori di pagina minori dovuti a 2 motivi. 1) Zero riempimento su richiesta mentre si chiama mmap (MAP_PRIVATE) per il file sorgente. 2) Copia su scrittura mentre si chiama mmap (MAP_SHARED) per il file di destinazione.

C'è un modo per disabilitare Zero-fill-on-demand e Copy-on-write?

Grazie, Harish

+0

Sono sorpreso che si vede una penalizzazione delle prestazioni per riempimento a zero, come lo si misura? Non si desidera disabilitare COW, è fondamentale il modo in cui la memoria virtuale funziona e migliora le prestazioni. Hai considerato che usare 'write (2)' potrebbe essere più efficiente per la copia? Specificare la mappa privata come buffer da scrivere. Evita anche il passo dell'espansione del nuovo file, dal momento che 'write (2)' lo farà per te. – cdarke

+0

Sto misurando l'errore di pagina minore da getrusage(). Mostra che ci sono quasi 50000 errori di pagina minori per copiare 1gb di file con mmam() (quasi 25000 per leggere mmap (MAP_PRIVATE) e lo stesso per scrivere mmap (MAP_SHARED)). Sì, ho controllato che write (2) è più efficiente di mmap() per la copia, ma penso che mmap() possa essere efficiente se disabilitiamo Zero-fill-on-demand e Copy-on-write. – Harish

+0

Harish, controlla le syscalls 'madvice()' e 'mlock()'. Possono influire sul numero di errori di pagina. E per una copia veloce dei file, controlla syscall 'sendfile()'. – osgx

risposta

2

C'è bandiera MMAP_POPULATE di mmap (2):

http://linux.die.net/man/2/mmap

MAP_POPULATE (dal Linux 2.5.46) popolano (pre-trigger) tabelle di pagina per un Mappatura. Per un mapping di file, ciò causa read-ahead sul file. Gli accessi successivi alla mappatura non verranno bloccati dagli errori di pagina. MAP_POPULATE è supportato solo per i mapping privati ​​da Linux 2.6.23.

È necessario eseguire il pre-errore di tutte le pagine nella regione stampata. Dovrebbe funzionare per la domanda (1), e potrebbe non funzionare per la domanda (2) (condivisa).

+2

Nota: 'MAP_POPULATE' significa nessun ritardo quando si utilizza la mappatura (a meno che non venga interrotta dalla pressione della memoria), ma significa anche che la chiamata' mmap' si blocca fino a quando non viene letto l'intero file. Spesso è meglio evitare 'MAP_POPULATE' in favore di [' posix_madvise'] (http://linux.die.net/man/3/posix_madvise) (o non standardizzato ['madvise'] (http://linux.die.net/ man/2/madvise)) usando 'POSIX_MADV_WILLNEED', che è equivalente a' MAP_POPULATE', ma non blocca. È possibile aprire/mappare il file sorgente, consigliarlo per il caricamento e il sistema operativo leggerà lo storico in blocco, anziché richiedere l'errore. – ShadowRanger

+0

È possibile bloccare la lettura da 'mmap', ma poiché l'intera lettura è pianificata in anticipo, la lettura sarà già in corso quando si preme la pagina non popolata; non invierai nuove richieste di I/O dal vivo. – ShadowRanger