Der Befehl nocache ist die allgemeine Antwort auf dieses Problem! Siehe https://github.com/Feh/nocache oder finden Sie es in Debian und Ubuntu 13.10 (frech).
Danke, Peter, dass du uns auf die Option --drop-cache" in rsync aufmerksam gemacht hast. Aber das wurde von den Originalautoren abgelehnt (Bug 9560 – drop-cache option), zugunsten einer allgemeineren Lösung dafür:dem neuen Befehl "nocache". basierend auf der rsync-Arbeit mit fadvise.
Sie müssen einfach "nocache" jedem gewünschten Befehl voranstellen. Es hat auch nette Dienstprogramme zum Beschreiben und Ändern des Cache-Status von Dateien. Z.B. Hier sind die Effekte mit und ohne Nocache:
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K]
$ ./nocache cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%) [filesize=7776.2K, pagesize=4K]\
$ cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 1945/1945 (100.0%) [filesize=7776.2K, pagesize=4K]
Hoffentlich funktioniert das auch mit anderen Sicherungsprogrammen (rsnapshot, duplicity, rdiff-backup, amanda, s3sync, s3ql, tar usw.) und anderen Befehlen, die Ihren Cache nicht zerstören sollen.
Kristof Provost war sehr nah dran, aber in meiner Situation wollte ich weder dd verwenden noch meine eigene Software schreiben, also bestand die Lösung darin, die Option „--drop-cache“ in rsync zu verwenden.
Ich habe dies viele Male verwendet, seit ich diese Frage erstellt habe, und es scheint das Problem vollständig zu beheben. Eine Ausnahme war, wenn ich rsync zum Kopieren von einem FreeBSD-Rechner verwende, der "--drop-cache" nicht unterstützt. Also habe ich einen Wrapper geschrieben, um den Befehl /usr/local/bin/rsync zu ersetzen und diese Option zu entfernen, und jetzt funktioniert auch das Kopieren von dort.
Es verwendet immer noch eine riesige Menge an Speicher für Puffer und scheint fast keinen Cache zu behalten, funktioniert aber trotzdem reibungslos.
$ free
total used free shared buffers cached
Mem: 24731544 24531576 199968 0 15349680 850624
-/+ buffers/cache: 8331272 16400272
Swap: 4194300 602648 3591652
Der Kernel kann nicht wissen, dass Sie die zwischengespeicherten Daten vom Kopieren nicht erneut verwenden werden. Das ist Ihr Informationsvorsprung.
Aber Sie könnten die Swapiness auf 0 setzen:sudo sysctl vm.swappiness=0. Dies bewirkt, dass Linux den Cache löscht, bevor Bibliotheken usw. in den Swap geschrieben werden.
Funktioniert auch gut für mich, besonders sehr performant in Kombination mit riesigem RAM (16-32 GB).