Linux - Real-World-Hardware-RAID-Controller-Tuning (scsi und cciss)

29

Die meisten von mir verwalteten Linux-Systeme verfügen über Hardware-RAID-Controller (hauptsächlich HP Smart Array ). Sie laufen alle mit RHEL oder CentOS.

Ich suche nach realistischen Tunables, um die Leistung für Setups zu optimieren, die Hardware-RAID-Controller mit SAS-Datenträgern (Smart Array, Perc, LSI usw.) und batteriegepuffertem oder flashgepuffertem Cache enthalten. Angenommen, RAID 1 + 0 und mehrere Spindeln (4 + Festplatten).

Ich verbringe viel Zeit damit, Linux-Netzwerkeinstellungen für Anwendungen mit geringer Latenz und für Finanzhandelsanwendungen zu optimieren. Viele dieser Optionen sind jedoch gut dokumentiert (Ändern der Sende- / Empfangspuffer, Ändern der TCP-Fenstereinstellungen usw.). Was machen Ingenieure auf der Speicherseite?

In der Vergangenheit habe ich Änderungen am E / A-Planungsaufzug vorgenommen und mich vor kurzem für den Planer deadlineund entschieden noop, um die Leistung in meinen Anwendungen zu verbessern. Mit dem Fortschritt der RHEL-Versionen ist mir auch aufgefallen, dass sich auch die kompilierten Standardeinstellungen für SCSI- und CCISS-Blockgeräte geändert haben. Dies hat sich im Laufe der Zeit auf die empfohlenen Einstellungen des Speichersubsystems ausgewirkt. Es ist jedoch eine Weile her, dass ich klare Empfehlungen gesehen habe. Und ich weiß, dass die Standardeinstellungen des Betriebssystems nicht optimal sind. Beispielsweise scheint der Standard-Vorauslesepuffer von 128 KB für eine Bereitstellung auf Hardware der Serverklasse extrem klein zu sein.

In den folgenden Artikeln werden die Auswirkungen auf die Leistung beim Ändern der Werte für Read-Ahead- Cache und nr_requests in den Blockwarteschlangen erläutert .

http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with -linux-why-tuning-really-matters
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html

Dies sind beispielsweise Änderungsvorschläge für einen HP Smart Array RAID-Controller:

echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler 
blockdev --setra 65536 /dev/cciss/c0d0
echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests
echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb

Was kann noch zuverlässig optimiert werden, um die Speicherleistung zu verbessern?
Ich suche speziell nach Sysctl- und Sysfs-Optionen in Produktionsszenarien.

ewwhite
quelle

Antworten:

38

Ich habe festgestellt, dass ich nr_requests von der Standardeinstellung (auf nur 32) herabgestimmt habe, als ich auf geringere Latenz im Vergleich zum Durchsatz einstellen musste. Die Idee, kleinere Batches zu verwenden, ist gleichbedeutend mit einer geringeren Latenz.

Auch für read_ahead_kb habe ich festgestellt, dass das Erhöhen dieses Werts für sequenzielles Lesen / Schreiben einen besseren Durchsatz bietet, aber ich habe festgestellt, dass diese Option wirklich von Ihrer Arbeitslast und Ihrem E / A-Muster abhängt. Auf einem Datenbanksystem, das ich kürzlich optimiert habe, habe ich diesen Wert so geändert, dass er einer einzelnen DB-Seitengröße entspricht, was zur Reduzierung der Leselatenz beigetragen hat. Das Erhöhen oder Verringern über diesen Wert hinaus hat in meinem Fall die Leistung beeinträchtigt.

Weitere Optionen oder Einstellungen für das Blockieren von Gerätewarteschlangen:

max_sectors_kb = Ich habe diesen Wert so festgelegt, dass er mit der Hardware übereinstimmt, die für eine einzelne Übertragung zulässig ist. (Überprüfen Sie den Wert der Datei max_hw_sectors_kb (RO) in sysfs, um festzustellen, was zulässig ist.)

nomerges = Hiermit können Sie die Lookup-Logik zum Zusammenführen von Io-Anforderungen deaktivieren oder anpassen. (Durch Deaktivieren dieser Option können Sie einige CPU-Zyklen einsparen. Ich habe jedoch keine Vorteile festgestellt, wenn ich diese Option für meine Systeme ändere. Daher habe ich die Standardeinstellung beibehalten.)

rq_affinity = Ich habe das noch nicht ausprobiert, aber hier ist die Erklärung dahinter aus den Kernel-Dokumenten

Wenn diese Option auf "1" gesetzt ist, migriert der Block-Layer die Anforderungsvervollständigungen in die CPU-Gruppe, die die Anforderung ursprünglich gesendet hat. Für einige Workloads führt dies aufgrund von Caching-Effekten zu einer deutlichen Reduzierung der CPU-Zyklen.
Bei Speicherkonfigurationen, bei denen die Verteilung der Abschlussverarbeitung maximiert werden muss, erzwingt die Einstellung dieser Option auf "2", dass der Abschluss auf der anfordernden CPU ausgeführt wird (unter Umgehung der Aggregationslogik "group").

scheduler = du hast gesagt, dass du es mit deadline und noop versucht hast. Ich habe sowohl noop als auch deadline getestet, aber festgestellt, dass die Deadline für die Tests, die ich zuletzt für einen Datenbankserver durchgeführt habe, abgelaufen ist.

NOOP lief gut, aber für unseren Datenbankserver konnte ich immer noch eine bessere Leistung erzielen, indem ich den Terminplaner anpasste.

Optionen für den Terminplaner unter / sys / block / {sd, cciss, dm -} * / queue / iosched /:

fifo_batch = Ähnlich wie nr_requests, aber spezifisch für den Scheduler. Als Faustregel gilt: Verringern Sie die Latenz oder erhöhen Sie den Durchsatz. Steuert die Stapelgröße von Lese- und Schreibanforderungen.

write_expire = Legt die Ablaufzeit für Schreibstapel fest. Die Standardeinstellung ist 5000 ms. Erneut verringern Sie diesen Wert, um die Schreibverzögerung zu verringern, während der Wert den Durchsatz erhöht.

read_expire = Legt die Ablaufzeit für gelesene Stapel fest. Die Standardeinstellung ist 500 ms. Hier gelten die gleichen Regeln.

front_merges = Ich neige dazu, dies auszuschalten, und es ist standardmäßig aktiviert. Ich sehe keine Notwendigkeit für den Scheduler, CPU-Zyklen zu verschwenden, die versuchen, E / A-Anforderungen nach vorne zusammenzuführen.

writes_starved = Da die Frist auf Lesevorgänge ausgerichtet ist, werden hier standardmäßig 2 Lesestapel verarbeitet, bevor ein Schreibstapel verarbeitet wird. Ich fand die Standardeinstellung 2 gut für meine Arbeitsbelastung.

rtorti19
quelle
7
... und so posten Sie Ihre erste Antwort auf einer Website. Gut gemacht!
Jeff Ferland
1
Dies ist ein guter Anfang und wiederholte Tests unter kontrollierten Bedingungen haben mir geholfen, die Anwendungsleistung ein wenig zu optimieren. Es ist auch hilfreich zu sehen, wie ich den Speicher für allgemeine Workload-Trends optimieren kann.
Ewwhite
4

Vor allem hängt alles von Ihrer Arbeitsbelastung ab.

read_ahead_kbkann Ihnen helfen, wenn es wirklich hilfreich ist, viele Daten aus einer Datei vorab zu lesen, beispielsweise beim Streamen von Videos. Manchmal kann es dir sehr weh tun. Ja, die Standardeinstellung von 128 KB kann klein klingen, aber bei genügend Parallelität klingt es groß! Bei einem Server wie einem Videokodierungsserver, der nur die Videos von einem Format in ein anderes konvertiert, ist eine Optimierung möglicherweise sehr sinnvoll.

nr_requestsWird der RAID-Controller gestört, kann er leicht überflutet werden, was wiederum die Leistung beeinträchtigt.

In der realen Welt müssen Sie die Latenzen beobachten . Wenn Sie mit dem SAN verbunden sind, schauen Sie sich mit oder was auch immer Sie verwenden möchten, um zu sehen iostat, sarob die Zeiten für die E / A-Anforderungsservices steil sind. Dies hilft natürlich auch bei lokalen Datenträgern: Wenn die Latenzen sehr hoch sind, sollten Sie die Einstellungen Ihres E / A-Aufzugs verringern, indem Sie max_requests und andere Einstellungen herabstufen.

Janne Pikkarainen
quelle
Welche anderen Einstellungen?
Ewwhite
4

FYI read_ahead_kbund blockdev --setrasind nur verschiedene Möglichkeiten, um die gleiche Einstellung mit verschiedenen Einheiten (kB vs Sektoren) festzulegen:

foo:~# blockdev --setra 65536 /dev/cciss/c0d0
foo:~# blockdev --getra /dev/cciss/c0d0
65536
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
32768
foo:~# echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
2048
foo:~# blockdev --getra /dev/cciss/c0d0
4096

Also die

blockdev --setra 65536 /dev/cciss/c0d0

in Ihrem Beispiel hat keine Wirkung.

ntherning
quelle