Schlechte gleichzeitige E / A-Leistung, wie Latenz gegen Durchsatz zu handeln?

451
Davidmh

Ich habe einen ziemlich IO-schweren GPU-eingeschränkten Prozess, der zufällige Dateien aus einem Ordner auf einer lokalen Festplatte einlesen muss. Wenn der Prozess von alleine ausgeführt wird, erhalte ich einen konstanten Durchsatz von etwa 30 MB / s, aber bei zwei konkurrierenden Prozessen sinkt der Gesamtdurchsatz auf knapp 7 MB / s.

Wie kann ich den Durchsatz bei zwei Programmen maximieren? Latenz ist kein Problem.

Jede Datei hat eine Größe von 1 bis 20 MB. Die Prozesse werden auf unabhängigen GPUs ausgeführt und benötigen nur wenig CPU. Der gleiche Effekt wird beobachtet, wenn ich gleichzeitig eine GPU und einen reinen IO-Prozess starte.

Es gibt keine Unterschiede zwischen den verfügbaren Schedulern: Deadline, cfq und noop. Ich habe auch versucht, die Lesefristzeit ohne Änderungen auf 5 s zu erhöhen.

Maschinendetails:

  • Fedora Linux mit Kernel 4.16.7-200.fc27.x86_64
  • i7-4770 CPU bei 3.40 GHz
  • 32 GB RAM, von denen 20 durch laufende Prozesse belegt werden.
  • Swap ist aktiviert, aber leer.
  • Das Laufwerk ist ein WDC WD2003FYYS-0, 2 TB, aber ich sehe dasselbe, wenn ich alles auf andere Laufwerke schiebe.
  • cat big_file> / dev / null ergibt einen Durchsatz von fast 100 MB / s, sodass für beide eine Bandbreite zur Verfügung steht.
  • Die gesamten Daten belaufen sich auf etwa 500 GB.

Mehr Info:

  • Ich habe die Dateien auf ein anderes, schnelleres Laufwerk verschoben, das nicht für andere Zwecke verwendet wird, und verwendete die Komprimierung. Der Gesamtdurchsatz wird geringfügig verbessert.
  • Durch die maximale Priorität für einen der Prozesse wurde die Leistung um 10% verbessert.
  • Das Ausführen iostat -x 1zeigt, dass die Auslastung bei einem Prozess um 87% und bei einem Prozess von 100% liegt.
  • Die Prozesse lesen zufällige Dateien. Wenn ich nur einen Prozess hatte, kann er mehr als den doppelten Durchsatz bieten, den jeder einzelne verbrauchen kann.
1
Holen Sie sich eine SSD. Festplatten sind schrecklich mit gleichzeitigem Zugriff. Mokubai vor 5 Jahren 3
@Mokubai Ich brauche nicht mehr als das, was eine HD bieten kann, und da sich meine Anfragen in der Warteschlange befinden, kümmere ich mich nicht um Latenzzeiten. Der Scheduler könnte beispielsweise eine volle Sekunde für jeden Prozess angeben, bei maximalem Durchsatz. Davidmh vor 5 Jahren 0
Ein Schuss im Dunkeln: Experimentieren Sie mit "ionice -c best-effort" mit unterschiedlichen "-n" -Pegeln für die beiden Prozesse. oder versuchen Sie sogar '-c realtime' für einen von ihnen. Kamil Maciorowski vor 5 Jahren 0
@KamilMaciorowski scheint es geringfügig zu helfen (~ 10% Verbesserung). Vielen Dank! Davidmh vor 5 Jahren 0
Aber Sie * brauchen * mehr als Ihre Festplatten bieten können. SSDs sind bei wahlfreiem Zugriff um mehrere Größenordnungen schneller als mechanische Festplatten. Sie können natürlich einen benutzerdefinierten Dämon erstellen, um den Zugriff auf Dateien mit einem größeren Lese- und Schreibpuffer zu verwalten. Warum sollten Sie sich jedoch die Mühe machen? Daniel B vor 5 Jahren 0
@DanielB Wenn jedem Prozess eine Sekunde mit vollständigem Zugriff auf das Laufwerk zugewiesen wurde, würde dies ausreichen, da sie interne Puffer haben. Das ist etwas, was im Bereich des OS-Schedulers liegt. Davidmh vor 5 Jahren 0
Der OS-Scheduler ist so konzipiert, dass er * jeden * Prozess im System fair behandelt und gleich behandelt. Sie wurden so eingestellt, dass jeder Prozess eine Chance erhält, auf die Festplatte zuzugreifen, und es besteht eine gute Wahrscheinlichkeit, dass die Festplattenzugriffe innerhalb von zehn Millisekunden statt in Hunderten von Millisekunden abgewickelt werden. Wenn Sie mehr als die von dem bereitgestellten Scheduler bereitgestellten Standardwerte benötigen, können Sie Ihre eigenen Einstellungen ändern oder schreiben. Dies wäre jedoch eine Programmierfrage, die sich außerhalb des Geltungsbereichs dieser Site befindet. Was wir jedoch sagen können, ist, dass es andere Geräte gibt, die viel besser für kleine Direktzugriffe (SSDs) geeignet sind. Mokubai vor 5 Jahren 0

1 Antwort auf die Frage

2
Mikko Rantalainen

Verwenden Sie cfqshceduler für die Datenplatten und eingestellt slice_asyncund slice_syncauf ziemlich hohe Werte (zB 500) und slice_idleauf etwa 20 können Sie auch erhöhen müssen fifo_expire_asyncund fifo_expire_syncauf rund 4000 pro Person . (Weitere Informationen finden Sie unter https://unix.stackexchange.com/a/41831/20336 ).

Die Idee ist, jedem Prozess zu erlauben, jeweils 0,5 Sekunden lang die vollständige Kontrolle über das Gerät zu erlangen, so dass das Suchen zwischen verschiedenen Bereichen der Festplatte nicht die ganze Zeit dauert.

Wenn Sie es sich leisten können, ist die beste Wahl, ein gutes SSD-Laufwerk zu erhalten, das Ihre Daten aufnehmen kann. Für zufällige Leseleistungen empfehle ich die Samsung 860 EVO-Serie, da das Jahr 2018 das beste Verhältnis zwischen Kosten und Leistung zu sein scheint. Wenn der Preis kein Problem darstellt, wählen Sie die größte auf dem Markt verfügbare Intel Optane SSD.