Die Verbesserung der Disk - Cache Performance im Allgemeinen ist mehr als nur die Dateisystem - Cache - Größe zu erhöhen , wenn Ihr gesamtes System in RAM paßt , in dem Fall , dass Sie RAM - Laufwerk verwendet werden sollen ( tmpfs
ist gut , weil es erlaubt , zurück auf der Platte fallen , wenn Sie die RAM in einigen Fällen müssen) für die Laufzeitspeicherung (und möglicherweise ein initrd-Skript, um das System beim Start vom Speicher auf das RAM-Laufwerk zu kopieren).
Sie haben nicht festgestellt, ob es sich bei Ihrem Speichergerät um eine SSD oder eine Festplatte handelt. Hier ist, was ich gefunden habe, um für mich zu arbeiten (in meinem Fall sda
ist ein HDD angebracht an /home
und sdb
ist SSD angebracht an /
).
Optimieren Sie zuerst den Teil zum Laden des Materials vom Speicher zum Cache:
Hier ist mein Setup für die Festplatte (stellen Sie sicher, dass AHCI + NCQ im BIOS aktiviert ist, wenn Sie umschalten):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
Beachten Sie, dass das Festplattengehäuse hoch fifo_expire_async
(normalerweise schreibend) und lang ist slice_sync
, damit ein einzelner Prozess einen hohen Durchsatz erzielt (auf slice_sync
eine niedrigere Anzahl eingestellt, wenn mehrere Prozesse gleichzeitig auf Daten von der Festplatte warten). Das slice_idle
ist immer ein Kompromiss für HDDs , aber es irgendwo in Reichweite Einstellung 3-20 sollte je nach Festplattennutzung und Disk - Firmware in Ordnung sein. Ich bevorzuge es, auf niedrige Werte zu zielen, aber eine zu niedrige Einstellung zerstört Ihren Durchsatz. Die quantum
Einstellung scheint den Durchsatz stark zu beeinflussen, aber versuchen Sie, dies so gering wie möglich zu halten, um die Latenz auf einem vernünftigen Niveau zu halten. Eine quantum
zu niedrige Einstellung zerstört den Durchsatz. Werte im Bereich von 3 bis 8 scheinen mit Festplatten gut zu funktionieren. Die ungünstigste Wartezeit für einen Lesevorgang ist ( quantum
* slice_sync
) + ( slice_async_rq
*slice_async
) ms wenn ich das kernelverhalten richtig verstanden habe. Der asynchrone Modus wird hauptsächlich für Schreibvorgänge verwendet. Da Sie bereit sind, das Schreiben auf die Festplatte zu verzögern, sollten Sie beide slice_async_rq
und slice_async
sehr niedrige Werte festlegen . Wenn Sie jedoch einen slice_async_rq
zu niedrigen Wert einstellen , werden die Lesevorgänge möglicherweise unterbrochen, da die Schreibvorgänge nach den Lesevorgängen nicht mehr verzögert werden können. Meine Config wird versuchen , nach 10 Sekunden auf den meisten Daten auf der Festplatte zu schreiben , nachdem die Daten übergeben wurde auf Kernel aber da Sie Datenverlust bei Stromausfall tolerieren können auch eingestellt , fifo_expire_async
um 3600000
zu sagen , dass 1 Stunde für die Verzögerung auf der Festplatte in Ordnung ist. Halten Sie den slice_async
Wert jedoch niedrig, da ansonsten eine hohe Leselatenz auftreten kann.
Der hdparm
Befehl ist erforderlich, um zu verhindern, dass AAM einen Großteil der von AHCI + NCQ zugelassenen Leistung beeinträchtigt. Wenn Ihre Festplatte zu laut ist, überspringen Sie diese.
Hier ist mein Setup für SSD (Intel 320 Serie):
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
Hier sind die niedrigen Werte für verschiedene Slice-Einstellungen zu beachten. Die wichtigste Einstellung für eine SSD ist slice_idle
die Einstellung 0-1. Das Setzen auf Null verschiebt alle Sortierentscheidungen zu nativem NCQ, während das Setzen auf 1 es dem Kernel ermöglicht, Anforderungen zu sortieren (aber wenn der NCQ aktiv ist, kann die Hardware die Sortierung des Kernels teilweise außer Kraft setzen). Testen Sie beide Werte, um festzustellen, ob Sie den Unterschied erkennen können. Für 320 Serie Intel scheint es , dass Einstellung slide_idle
zu 0
den besten Durchsatz gibt aber Einstellung es 1
gibt am besten (niedrigsten) Gesamtlatenz.
Weitere Informationen zu diesen Tunables finden Sie unter http://www.linux-mag.com/id/7572/ .
Nachdem wir den Kernel so konfiguriert haben, dass Daten mit vernünftiger Leistung von der Festplatte in den Cache geladen werden, ist es an der Zeit, das Cache-Verhalten anzupassen:
Gemäß den Benchmarks, die ich durchgeführt habe, würde ich mir überhaupt nicht die Mühe machen, vorausgelesene Daten zu setzen blockdev
. Die Standardeinstellungen des Kernels sind in Ordnung.
Stellen Sie das System so ein, dass das Auslagern von Dateidaten dem Anwendungscode vorgezogen wird (dies spielt keine Rolle, wenn Sie über genügend RAM verfügen, um das gesamte Dateisystem und den gesamten Anwendungscode sowie den gesamten von den Anwendungen im RAM zugewiesenen virtuellen Speicher zu behalten ). Dadurch wird die Wartezeit für den Austausch zwischen verschiedenen Anwendungen über die Wartezeit für den Zugriff auf große Dateien von einer einzelnen Anwendung aus verringert:
echo 15 > /proc/sys/vm/swappiness
Wenn Sie es vorziehen, Anwendungen fast immer im RAM zu behalten, können Sie dies auf 1 setzen. Wenn Sie dies auf Null setzen, wird der Kernel überhaupt nicht ausgetauscht, es sei denn, dies ist unbedingt erforderlich, um OOM zu vermeiden. Wenn der Arbeitsspeicher begrenzt ist und Sie mit großen Dateien arbeiten (z. B. HD-Videobearbeitung), ist es möglicherweise sinnvoll, diesen Wert auf nahezu 100 festzulegen.
Heutzutage (2017) bevorzuge ich es, überhaupt keinen Swap zu haben, wenn du genug RAM hast. Wenn Sie keinen Swap haben, verlieren Sie normalerweise 200-1000 MB RAM auf einem lang laufenden Desktop-Computer. Ich bin bereit, so viel zu opfern, um Wartezeiten im schlimmsten Fall zu vermeiden (Austausch von Anwendungscode, wenn der RAM voll ist). In der Praxis bedeutet dies, dass ich OOM Killer dem Tauschen vorziehe. Wenn Sie das Austauschen zulassen / benötigen, möchten Sie möglicherweise auch die Anzahl erhöhen /proc/sys/vm/watermark_scale_factor
, um eine gewisse Latenz zu vermeiden. Ich würde Werte zwischen 100 und 500 vorschlagen. Sie können diese Einstellung als Handelswert für die CPU-Auslastung betrachten, um die Swap-Latenz zu verringern. Der Standardwert ist 10 und der maximal mögliche Wert 1000. Ein höherer Wert sollte (gemäß der Kerneldokumentation ) zu einer höheren CPU-Auslastung für kswapd
Prozesse und einer geringeren Gesamtwartezeit für das Austauschen führen.
Als nächstes teilen Sie dem Kernel mit, dass er die Verzeichnishierarchie lieber im Speicher als im Dateiinhalt belassen soll, falls RAM freigegeben werden muss.
echo 10 > /proc/sys/vm/vfs_cache_pressure
Rahmen vfs_cache_pressure
Ein zu niedriger Wert ist sinnvoll, da der Kernel in den meisten Fällen die Verzeichnisstruktur kennen muss, bevor er Dateiinhalte aus dem Cache verwenden kann. Wenn der Verzeichnis-Cache zu früh geleert wird, wird der Datei-Cache nahezu wertlos. Ziehen Sie in Betracht, mit dieser Einstellung auf 1 zu gehen, wenn Sie viele kleine Dateien haben (mein System verfügt über etwa 150.000 Fotos mit 10 Megapixeln und zählt als System mit vielen kleinen Dateien). Setzen Sie es niemals auf Null, oder die Verzeichnisstruktur bleibt immer im Speicher, auch wenn das System nicht genügend Speicher hat. Dies auf einen hohen Wert zu setzen ist nur dann sinnvoll, wenn Sie nur wenige große Dateien haben, die ständig neu gelesen werden (auch hier wäre HD-Videobearbeitung ohne genügend RAM ein Beispiel). Die offizielle Kernel-Dokumentation besagt, dass "
Ausnahme: Wenn Sie eine wirklich große Menge an Dateien und Verzeichnissen haben und selten alle Dateien berühren / lesen / auflisten, die vfs_cache_pressure
höher als 100 sind, kann dies sinnvoll sein. Dies gilt nur, wenn Sie nicht über genügend RAM verfügen und nicht die gesamte Verzeichnisstruktur im RAM behalten können und dennoch über genügend RAM für den normalen Dateicache und die normalen Prozesse verfügen (z. B. firmenweiter Dateiserver mit vielen Archivinhalten). Wenn Sie der Meinung sind, dass Sie auf vfs_cache_pressure
über 100 ansteigen müssen, verfügen Sie nicht über genügend RAM. Erhöhen vfs_cache_pressure
kann helfen, aber die einzige echte Lösung ist, mehr RAM zu bekommen. Wenn Sie vfs_cache_pressure
eine hohe Anzahl von Opfern eingestellt haben, bedeutet dies, dass die durchschnittliche Leistung insgesamt stabiler ist.
Schließlich weisen Sie den Kernel an, bis zu 99% des Arbeitsspeichers als Cache für Schreibvorgänge zu verwenden, und weisen Sie den Kernel an, bis zu 50% des Arbeitsspeichers zu verwenden, bevor der zu schreibende Prozess verlangsamt wird (Standard für dirty_background_ratio
ist 10
). Warnung: Ich persönlich würde dies nicht tun, aber Sie haben behauptet, über genügend RAM zu verfügen und sind bereit, die Daten zu verlieren.
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
Und sagen Sie, dass eine Schreibverzögerung von 1 Stunde in Ordnung ist, um überhaupt mit dem Schreiben von Dingen auf die Festplatte zu beginnen (wieder würde ich dies nicht tun):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
Wenn Sie all diese /etc/rc.local
Elemente an das Ende setzen und "following" einfügen, wird alles so schnell wie möglich nach dem Booten im Cache gespeichert (tun Sie dies nur, wenn Ihr Dateisystem wirklich in den Arbeitsspeicher passt):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
Oder eine etwas einfachere Alternative, die möglicherweise besser funktioniert (nur Cache /home
und dies /usr
nur tun, wenn Sie /home
und /usr
wirklich in RAM passen):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&