Hallo,
32GB USB-Stick angeschlossen, per telnet
cp -p /media/hdd/movie/XYZ.ts /autofs/sdb1/
eingegeben und gewundert, weil der Kopiervorgang so lange dauerte.
Da wurde mit 1MB/s kopiert Geschwindigkeiten wie USB 1.0!
Stick an Laptop angeschlossen, Download .ts über LAN knapp 10MB/s,
Laptop hat mit 8MB/s auf USB Stick geschrieben, zusammen 8MB/s, das ist erträglich.
Schuld daran ist die Option sync in der Einstellung des autofs.
# cat /proc/mounts
/dev/sdb1 /autofs/sdb1 ext3 rw,sync,relatime,[...] 0 0
Aus der manpage zu mount:
Zitatsync All I/O to the filesystem should be done synchronously. In case
of media with limited number of write cycles (e.g. some flash
drives) "sync" may cause life-cycle shortening.
Ohje, sync soll also auch noch schädlich sein.
Sync heißt, dass dauernd Kleinteile geschrieben werden, wie die Anwendung sie produziert. Ohne sync sammelt und puffert das Dateisystem und schreibt große Blöcke am Stück. Das Fehlen von Sync ist verheerend. Hier ein paar Geschwindigkeitsmessungen mit einem anderen Stick:
# cd /autofs/sdb1/
# dd if=/dev/zero of=foo obs=1M count=200000 &
26214400 bytes (25.0MB) copied, 9.915029 seconds, 2.5MB/s
# dd if=/dev/zero of=foo obs=64K count=200000 &
42270720 bytes (40.3MB) copied, 23.951959 seconds, 1.7MB/s
# dd if=/dev/zero of=foo obs=4K count=200000 &
2232320 bytes (2.1MB) copied, 10.940550 seconds, 199.3KB/s
# dd if=/dev/zero of=foo count=200000 & # dd default sind 512 Bytes
2978304 bytes (2.8MB) copied, 35.990534 seconds, 80.8KB/s
73465344 bytes (70.1MB) copied, 17.666410 seconds, 4.0MB/s # mit async
Von 80KB/s(!) bis 4MB/s alles drin, je nachdem, wie ein Programm die Daten produziert. Kleinvieh macht's sehr langsam.
Weshalb benutze ich autofs? Ich liebe die Kommandozeile und kopiere Dateien auf einen Memory-Stick nicht über eine Fernseh-GUI der Dreambox, sondern indem ich mich per telnet einlogge und /autofs/sdb1 nutze, was mir die mount+umount Befehle erspart.
Vielleicht wurde sync bei autofs eingestellt, um das Risiko von Datenverlusten zu verringern, wenn man Geräte während oder kurz nach Schreibvorgängen entfernt. Hier überwiegen jedoch die Nachteile. Wenn ich in dmesg Zeilen wie "kjournald starting. Commit interval 5 seconds" richtig deute, schreibt der Linux-Kernel eh nach spätestens 5 Sekunden Restdaten auf die Platte. Vor 20 Jahren war bei Sun-Servern eine halbe Minute eingestellt, da war das Risiko bei Crash oder Stromausfall höher.
Abhilfe
- /etc/auto.hotplug editieren und sync bei /dev entfernen
* -fstype=auto,rw,relatime :/dev/& - Optional in /etc/auto.master timeout verringern (3 statt 5 Sekunden, vgl. /etc/default/autofs)
/autofs /etc/auto.hotplug --timeout=3 - autofs neu starten (nur nötig falls auto.master nicht verändert wurde)
# /etc/init.d/autofs restart
Die Verringerung des Timeouts dient dazu, Restdaten spätestens 3 Sekunden nach Ende der letzten Benutzung zu schreiben. Dann entfernt autofs den mount-Eintrag und der Stick kann abgezogen werden. Ich benutze übrigens einen Stick mit Leuchtdiode.
Seither ist die Verwendung von autofs genau so schnell, als hätte ich einen mount über die Shell oder das GUI durchgeführt! Nach drei Sekunden wird das Dateisystem abgehängt, dabei kann noch ein letzter Schreibvorgang vorkommen. Wer mag, kann df oder cat /proc/mounts ausführen und prüfen, dass /dev/sdb1 verschwunden ist. Danach kann ich den USB-Stick sicher entfernen.
Ich würde es sehr begrüßen, wenn diese Änderung auf der Dreambox Einzug fände.
Frohes neues Jahr!