Ich implementiere cp (Datei kopieren) -Befehl mit mmap(). Dafür habe ich die Quelldatei in MAP_PRIVATE (wie ich gerade lesen will) Modus und Zieldatei im MAP_SHARED-Modus (wie ich den geänderten Inhalt der Zieldatei schreiben muss) zugeordnet.Wie zu deaktivieren Copy-on-Write und Null gefüllt bei Bedarf für mmap()
Während ich dies getan habe, habe ich eine Leistungseinbuße aufgrund von vielen kleineren Seitenfehlern beobachtet, die aus zwei Gründen auftreten. 1) Zero fill on demand beim Aufruf von mmap (MAP_PRIVATE) für die Quelldatei. 2) Kopieren beim Schreiben beim Aufruf von mmap (MAP_SHARED) für die Zieldatei.
Gibt es eine Möglichkeit, Zero-Fill-on-Demand und Copy-on-Write zu deaktivieren?
Danke, Harish
Ich bin überrascht, dass Sie eine Leistungseinbuße für Nullfüllung sehen, wie messen Sie es? Sie möchten COW nicht deaktivieren, da dies für die Funktionsweise des virtuellen Speichers grundlegend ist und die Leistung verbessert. Haben Sie in Betracht gezogen, dass die Verwendung von 'write (2)' für die Kopie effizienter sein könnte? Geben Sie die private Map als Puffer zum Schreiben an. Es vermeidet auch den Schritt der Erweiterung der neuen Datei, da 'write (2)' es für Sie tun wird. – cdarke
Ich messe den kleineren Seitenfehler durch getrusage(). Es zeigt, dass es fast 50000 kleinere Seitenfehler gibt, 1gb Datei mit mmam() zu kopieren (fast 25000 für gelesene mmap (MAP_PRIVATE) und dasselbe für write mmap (MAP_SHARED)). Ja, ich habe überprüft write (2) ist effizienter als mmap() zum Kopieren, aber ich denke mmap() kann effizient sein, wenn wir Zero-fill-on-demand und Copy-on-write deaktivieren. – Harish
Harish, check 'madvice()' und 'mlock()' syscalls. Sie können sich auf die Anzahl der Seitenfehler auswirken. Überprüfen Sie für eine schnelle Dateikopie syscall 'sendfile()'. – osgx