Sequentielles und zufälliges Schreiben auf Linux-Festplatten

Sequentielles und zufälliges Schreiben auf Linux-Festplatten

1. Einleitung

● Zufälliges Schreiben führt dazu, dass der Kopf ständig die Spur wechselt, was zu einer erheblichen Verringerung der Effizienz führt. Beim sequentiellen Schreiben muss der Kopf die Spur fast nicht wechseln oder die Wechselzeit ist sehr kurz. ● In diesem Artikel werden die spezifischen Unterschiede zwischen den beiden und die entsprechenden Kernelaufrufe erläutert.

2. Umweltvorbereitung

Komponenten Version
Betriebssystem Ubuntu 16.04.4 LTS
fio 2.2.10

3. Einführung in fio

Der FIO-Test kann den Status des Lesens und Schreibens widerspiegeln. Wir müssen uns auf mehrere Schlüsselindikatoren im FIO-Ausgabebericht konzentrieren:
slat: bezieht sich auf die Zeit von der I/O-Übermittlung bis zur tatsächlichen I/O-Ausführung (Übermittlungslatenz)
clat: bezieht sich auf die Zeit von der I/O-Übermittlung bis zum I/O-Abschluss (Abschlusslatenz)
lat: bezieht sich auf die Gesamtzeit von der Erstellung eines I/O durch FIO bis zu dessen Abschluss
bw: Durchsatz
iops: Die Anzahl der I/O-Operationen pro Sekunde

4. Synchroner Schreibtest

(1) Synchrones wahlfreies Schreiben

fio wird hauptsächlich als Testtool verwendet. Um die Systemaufrufe anzuzeigen, wird das Tool strace verwendet. Der Befehl sieht folgendermaßen aus:

Lassen Sie uns zuerst einen zufälligen Schreibvorgang testen

strace -f -tt -o /tmp/randwrite.log -D fio -name=randwrite -rw=randwrite \
-direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db

Wichtige Informationen extrahieren

root@wilson-ubuntu:~# strace -f -tt -o /tmp/randwrite.log -D fio -name=randwrite -rw=randwrite \
> -direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
Randschreiben: (g=0): rw=Randschreiben, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.2.10
1 Prozess wird gestartet
...
randwrite: (Gruppen-ID = 0, Jobs = 1): Fehler = 0: pid = 26882: Mittwoch, 14. August 2019, 10:39:02
 Schreiben: io=1024,0 MB, bw=52526 KB/s, iops=13131, runt= 19963 ms
 clat (µs): min=42, max=18620, Durchschnitt=56,15, Standardabweichung=164,79
  Breite (µs): min.=42, max.=18620, Durchschnitt=56,39, Standardabweichung=164,79
...
 Bandbreite (KB/s): min. = 50648, max. = 55208, pro = 99,96 %, Durchschnitt = 52506,03, Standardabweichung = 1055,83
...

Ausführen der Statusgruppe 0 (alle Jobs):
 SCHREIBEN: io=1024,0 MB, aggrb=52525 KB/s, minb=52525 KB/s, maxb=52525 KB/s, mint=19963 ms, maxt=19963 ms

Festplattenstatistiken (Lesen/Schreiben):
...
 sda: ios=0/262177, Zusammenführung=0/25, Ticks=0/7500, in_queue=7476, Auslastung=36,05 %

Aufgelistet sind die Informationen, auf die wir uns konzentrieren müssen:

(1) Clat, durchschnittliche Dauer ca. 56 ms

(2) lat, durchschnittliche Dauer beträgt ca. 56ms

(3) Bandbreite, Durchsatz, ca. 52M

Schauen wir uns die Kernel-Aufrufinformationen an:

root@wilson-ubuntu:~# mehr /tmp/randwrite.log
...
26882 10:38:41.919904 lseek(3, 665198592, SEEK_SET) = 665198592
26882 10:38:41.919920 schreiben(3, "\220\240@\6\371\341\277>\0\200\36\31\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.919969 lseek(3, 4313088, SEEK_SET) = 4313088
26882 10:38:41.919985 schreiben(3, "\220\240@\6\371\341\277>\0\200\36\31\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920032 lseek(3, 455880704, SEEK_SET) = 455880704
26882 10:38:41.920048 schreiben(3, "\220\240@\6\371\341\277>\0\200\36\31\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920096 lseek(3, 338862080, SEEK_SET) = 338862080
26882 10:38:41.920112 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920161 lseek(3, 739086336, SEEK_SET) = 739086336
26882 10:38:41.920177 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920229 lseek(3, 848175104, SEEK_SET) = 848175104
26882 10:38:41.920245 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920296 lseek(3, 1060147200, SEEK_SET) = 1060147200
26882 10:38:41.920312 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920362 lseek(3, 863690752, SEEK_SET) = 863690752
26882 10:38:41.920377 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920428 lseek(3, 279457792, SEEK_SET) = 279457792
26882 10:38:41.920444 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920492 lseek(3, 271794176, SEEK_SET) = 271794176
26882 10:38:41.920508 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
26882 10:38:41.920558 lseek(3, 1067864064, SEEK_SET) = 1067864064
26882 10:38:41.920573 schreiben(3, "\220\240@\6\371\341\277>\0\2402\24\0\0\0\0\202\2\7\320\343\6H\26P\340\277\370\330\30e\30"..., 4096) = 4096
...

Vor jedem zufälligen Lesevorgang wird lseek verwendet, um den aktuellen Dateioffset zu lokalisieren.

Synchrones sequentielles Schreiben

Verwenden Sie die Methode jetzt, um die Schreibreihenfolge zu testen

root@wilson-ubuntu:~# strace -f -tt -o /tmp/write.log -D fio -name=schreiben -rw=schreiben \
-direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
schreiben: (g=0): rw=schreiben, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.2.10
1 Prozess wird gestartet
Jobs: 1 (f=1): [W(1)] [100.0% erledigt] [0KB/70432KB/0KB /s] [0/17.7K/0 iops] [eta 00m:00s]
schreiben: (Gruppen-ID=0, Jobs=1): Fehler= 0: PID=27005: Mittwoch, 14. August 2019, 10:53:02
 Schreiben: io=1024,0 MB, bw=70238 KB/s, iops=17559, runt= 14929 ms
 clat (µs): min=43, max=7464, Durchschnitt=55,95, Standardabweichung=56,24
  Breite (µs): min=43, max=7465, Durchschnitt=56,15, Standardabweichung=56,25
...
 Bandbreite (KB/s): min. = 67304, max. = 72008, pro = 99,98 %, Durchschnitt = 70225,38, Standardabweichung = 1266,88
...

Ausführen der Statusgruppe 0 (alle Jobs):
 SCHREIBEN: io=1024,0 MB, aggrb=70237 KB/s, minb=70237 KB/s, maxb=70237 KB/s, mint=14929 ms, maxt=14929 ms

Festplattenstatistiken (Lesen/Schreiben):
...
 sda: ios=0/262162, Zusammenführung=0/10, Ticks=0/6948, in_Warteschlange=6932, Auslastung=46,49 %

Sie können sehen:

Durchsatz auf ca. 70M erhöht

Schauen wir uns den Kernel-Aufruf noch einmal an:

root@wilson-ubuntu:~# mehr /tmp/write.log
...
27046 10:54:28.194508 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\360\t\0\0\0\0\0\0\320\17\0\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194568 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194627 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194687 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194747 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194807 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194868 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194928 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.194988 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195049 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195110 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195197 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195262 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195330 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195426 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195497 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195567 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195637 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195704 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195757 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195807 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195859 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195910 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.195961 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196012 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196062 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0\220\24\0\0\0\0\0\0\320\17\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196112 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196162 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196213 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196265 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196314 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196363 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196414 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196472 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196524 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
27046 10:54:28.196573 schreiben(3, "\0\0\23\0\0\0\0\0\0\300\16\0\0\0\0\0\0 \26\0\0\0\0\0\0\0\320\17\0\0\0\0\0"..., 4096) = 4096
...

Durch das sequentielle Lesen ist es nicht erforderlich, den Dateioffset wiederholt zu lokalisieren, sodass Sie sich auf Schreibvorgänge konzentrieren können

5. Lamellenanzeige

Beim obigen Test haben wir im Fio-Testbericht kein Slat gefunden. Das liegt daran, dass es sich bei den oben genannten Vorgängen um synchrone Vorgänge handelt. Bei synchronem I/O ist Slat tatsächlich der Zeitpunkt, zu dem I/O abgeschlossen ist, da I/O-Übermittlung und I/O-Abschluss eine Aktion sind.

Für asynchrones sequentielles Schreiben fügen Sie dem Befehl für synchrones sequentielles Schreiben -ioengine=libaio hinzu:

root@wilson-ubuntu:~# fio -name=schreiben -rw=schreiben -ioengine=libaio -direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
schreiben: (g=0): rw=schreiben, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
fio-2.2.10
1 Prozess wird gestartet
Jobs: 1 (f=1): [W(1)] [100,0% erledigt] [0KB/119,3MB/0KB /s] [0/30,6K/0 iops] [eta 00m:00s]
schreiben: (Gruppen-ID = 0, Jobs = 1): Fehler = 0: PID = 27258: Mittwoch, 14. August 2019, 11:14:36 ​​Uhr
 Schreiben: io=1024,0 MB, bw=120443 KB/s, iops=30110, runt= 8706 ms
 Latte (µs): min=3, max=70, Durchschnitt=4,31, Standardabweichung=1,56
 clat (µs): min=0, max=8967, Durchschnitt=28,13, Standardabweichung=55,68
  Breite (µs): min=22, max=8976, Durchschnitt=32,53, Standardabweichung=55,72
...
 Bandbreite (KB/s): min. = 118480, max. = 122880, pro = 100,00 %, Durchschnitt = 120467,29, Standardabweichung = 1525,68
...

Ausführen der Statusgruppe 0 (alle Jobs):
 SCHREIBEN: io=1024,0 MB, aggrb=120442 KB/s, minb=120442 KB/s, maxb=120442 KB/s, mint=8706 ms, maxt=8706 ms

Festplattenstatistiken (Lesen/Schreiben):
...
 sda: ios=0/262147, Zusammenführung=0/1, Ticks=0/6576, in_queue=6568, Auslastung=74,32 %

Es ist ersichtlich, dass der Lamellenindikator angezeigt wird und Lat ungefähr der Summe aus Lamellen + Clat (durchschnittlicher Durchschnittswert) entspricht. Nach dem Umschalten auf asynchrones E/A wurde der Durchsatz erheblich verbessert und liegt nun bei etwa 120 M.

VI. Fazit

● Fio sollte als Basistool für Festplatten verwendet werden. Wenn Sie eine Maschine (physisch oder in der Cloud) erhalten, sollten Sie so bald wie möglich einen Basistest auf der Festplatte der Maschine durchführen, um sich ein klares Bild von der Situation zu machen. ● Alle Tests in diesem Artikel haben den Cache umgangen. In tatsächlichen Anwendungen muss die Auswirkung des Caches berücksichtigt werden.

Oben habe ich Ihnen das sequentielle und zufällige Schreiben auf Linux-Festplatten vorgestellt. Ich hoffe, es wird Ihnen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • So erweitern Sie den Speicherplatz des Stammverzeichnisses im Linux-System
  • Problem der LVM-Festplattenerweiterung in Centos7 unter Linux
  • Analyse und Weitergabe von Implementierungsprinzipien und -methoden der Linux-Festplattenverwaltungssoftware RAID
  • So übertragen Sie Speicherplatz unter Linux
  • Detaillierte Erläuterung der Linux-Befehle zur Festplattenformatierung
  • Detaillierte Erläuterung des Speicherplatzes für die Root-Partitionsfestplattenerweiterung der virtuellen Linux-Maschine
  • Lösung für den Fall, dass der Linux-Festplattenspeicher durch unbekannte Ressourcen erschöpft ist
  • Linux-Befehl zur Anzeige der Speicherplatzgröße
  • So erweitern Sie die Festplattenkapazität eines Linux-Servers (Bild)
  • So verwenden Sie die GPT-Partitionierung auf Linux-Festplatten größer als 2T

<<:  Tutorial zum Deaktivieren und Aktivieren von Triggern in MySQL [Empfohlen]

>>:  Beispiel für die Verwendung einer Keep-Alive-Komponente in Vue

Artikel empfehlen

So überwachen Sie Array-Änderungen in JavaScript

Vorwort Als ich zuvor „defineProperty“ vorgestell...

Wichtige Punkte zum Schreiben von Inhalten für META-Tags in HTML-Webseiten

Das META-Tag ist ein Hilfstag im Kopfbereich der ...

JavaScript Canvas implementiert Tic-Tac-Toe-Spiel

In diesem Artikel wird der spezifische Code von J...

So erstellen Sie LVM für das XFS-Dateisystem in Ubuntu

Vorwort Die logische Datenträgerverwaltung von lv...

Interpretation von syslogd- und syslog.conf-Dateien unter Linux

1: Einführung in syslog.conf Für verschiedene Uni...

Zusammenfassung der MySQL-Injection-Bypass-Filtertechniken

Schauen wir uns zunächst den GIF-Vorgang an: Fall...

Praktische Lösung für die Bereitstellung von Prometheus-Containern

Umfeld Hostname IP-Adresse Aufschlag Prometheus 1...

JavaScript verwendet Promise zur Verarbeitung mehrerer wiederholter Anfragen

1. Warum diesen Artikel schreiben? Sie haben sich...