Benchmarking der Leistung von nichtflüchtigem Speicher auf einer Linux-VM

In diesem Dokument wird beschrieben, wie Sie die Leistung von nichtflüchtigen Speichern auf virtuellen Linux-Maschinen (VMs) vergleichen. Informationen zu Windows-VMs finden Sie unter Benchmarking der Leistung von nichtflüchtigen Speichern auf einer Windows-VM.

Verwenden Sie zum Benchmarking der Leistung von nichtflüchtigen Speichern auf Linux Flexible E/A-Tester (FIO) anstelle anderer Benchmarking-Tools wie dd. dd verwendet standardmäßig eine sehr geringe E/A-Warteschlangentiefe. Daher wird die Speicherleistung möglicherweise nicht genau genug getestet. Vermeiden Sie generell die Verwendung spezieller Geräte wie /dev/urandom, /dev/random und /dev/zero für Leistungs-Benchmarks von nichtflüchtigen Speichern.

Zum Messen von IOPS und Durchsatz eines Laufwerks, das auf einer laufenden Instanz verwendet wird, führen Sie ein Benchmarking des Dateisystems mit der gewünschten Konfiguration durch. Mit dieser Option können Sie eine realistische Arbeitslast testen, ohne den Inhalt des vorhandenen Laufwerks zu verlieren. Beachten Sie, dass beim Benchmarking des Dateisystems auf einem vorhandenen Laufwerk viele für Ihre Entwicklungsumgebung spezifische Faktoren die Benchmarking-Ergebnisse beeinflussen können und die Leistungsgrenzen des Laufwerks möglicherweise nicht erreicht werden.

Zum Messen der reinen Leistung von nichtflüchtigen Speichern führen Sie ein direktes Benchmarking des blockorientierten Geräts durch. Verwenden Sie diese Option, um die reine Leistung der Festplatte mit den Leistungsgrenzen der Festplatte zu vergleichen.

Die folgenden Befehle funktionieren auf Debian- oder Ubuntu-Betriebssystemen mit dem Paketmanager apt.

Benchmarking von IOPS und Durchsatz eines Laufwerks auf einer laufenden Instanz

Wenn Sie IOPS und Durchsatz für eine realistische Arbeitslast auf einem aktiven Laufwerk auf einer laufenden Instanz messen möchten, ohne den Inhalt des Laufwerks zu verlieren, führen Sie ein Benchmarking mit einem neuen Verzeichnis im vorhandenen Dateisystem durch. Jeder fio-Test wird fünf Minuten lang ausgeführt.

  1. Stellen Sie eine Verbindung zur Instanz her.

  2. Installieren Sie die Abhängigkeiten:

    sudo apt update
    sudo apt install -y fio
    
  3. Lassen Sie sich im Terminal die Laufwerke auflisten, die mit Ihrer VM verbunden sind, und suchen Sie das Laufwerk, das Sie testen möchten. Wenn der nichtflüchtige Speicher noch nicht formatiert ist, formatieren Sie den Speicher und stellen Sie ihn bereit.

    sudo lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:32   0  2.5T  0 disk /mnt/disks/mnt_dir
    

    In diesem Beispiel testen wir einen nichtflüchtigen SSD-Speicher mit 2.500 GB und der Geräte-ID sdb.

  4. Erstellen Sie auf dem Laufwerk das neue Verzeichnis fiotest. In diesem Beispiel wird das Laufwerk unter /mnt/disks/mnt_dir bereitgestellt:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Testen Sie den Schreibdurchsatz mithilfe sequenzieller Schreibvorgänge mit mehreren parallelen Streams (mindestens 16), einer E/A-Blockgröße von 1 MB und einer E/A-Tiefe von mindestens 64:

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1 --iodepth_batch_submit=64 \
    --iodepth_batch_complete_max=64
    
  6. Testen Sie die Schreib-IOPS mithilfe sequenzieller Schreibvorgänge mit einer E/A-Blockgröße von 4 KB und einer E/A-Tiefe von mindestens 256:

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1  \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  7. Testen Sie den Lesedurchsatz mithilfe sequenzieller Lesevorgänge mit mehreren parallelen Streams (mindestens 16), einer E/A-Blockgröße von 1 MB und einer E/A-Tiefe von mindestens 64:

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1 \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  8. Testen Sie die Lese-IOPS mithilfe zufälliger Lesevorgänge mit einer E/A-Blockgröße von 4 KB und einer E/A-Tiefe von mindestens 256:

    sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1 \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Bereinigen:

    sudo rm $TEST_DIR/write* $TEST_DIR/read*
    

Benchmarking der reinen Leistung nichtflüchtiger Speicher

Wenn Sie die Leistung nichtflüchtiger Speicher allein außerhalb Ihrer Entwicklungsumgebung messen möchten, testen Sie die Lese- und Schreibleistung für ein Blockgerät auf einem nichtflüchtigen Wegwerf-Speicher und einer Wegwerf-VM. Jeder fio-Test wird fünf Minuten lang ausgeführt. Bei den folgenden Befehlen wird davon ausgegangen, dass ein nichtflüchtiger SSD-Speicher mit 2.500 GB mit Ihrer VM verbunden ist. Wenn Ihr Gerät eine andere Kapazität hat, ändern Sie den Wert des Arguments --filesize. Diese Laufwerkgröße ist erforderlich, um die aktuellen Durchsatzlimits für eine VM mit 32 vCPUs zu erreichen. Weitere Informationen finden Sie unter Blockspeicherleistung.

  1. Erstellen und starten Sie eine VM-Instanz.

  2. Fügen Sie Ihrer VM-Instanz einen nichtflüchtigen Speicher hinzu.

  3. Stellen Sie eine Verbindung zur Instanz her.

  4. Installieren Sie die Abhängigkeiten:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. Füllen Sie den Speicher mit Daten ungleich null. Lesevorgänge aus leeren Blöcken von nichtflüchtigen Speichern haben ein anderes Latenzprofil als aus Blöcken, die Daten enthalten. Wir empfehlen daher, das Laufwerk mit Daten aufzufüllen, bevor Leselatenz-Benchmarks ausgeführt werden.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=fill_disk \
      --filename=/dev/sdb --filesize=2500G \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=128K --iodepth=64 --rw=randwrite \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  6. Testen Sie die Schreibbandbreite mithilfe sequenzieller Schreibvorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Größe von 1 MB und einer E/A-Tiefe von mindestens 64.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --rw=write --numjobs=16 --offset_increment=100G
    
  7. Testen Sie die Schreib-IOPS. Damit das IOPS-Limit des nichtflüchtigen Speichers erreicht werden kann, muss die E/A-Warteschlange eine entsprechende Tiefe haben. Wenn beispielsweise die Schreiblatenz 1 Millisekunde beträgt, können für die VM höchstens 1.000 IOPS für jeden aktiven E/A-Vorgang erreicht werden. Für 15.000 IOPS muss die VM mindestens 15 E/A-Vorgänge gleichzeitig ausführen. Damit Speicher und VM 30.000 IOPS erreichen können, sind mindestens 30 aktive E/A-Vorgänge erforderlich. Wenn die E/A-Größe 4 KB übersteigt, kann das Bandbreitenlimit für die VM vor dem IOPS-Limit erreicht werden.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  8. Testen Sie die Schreiblatenz. Beim Test der E/A-Latenz darf die VM nicht das Bandbreiten- oder IOPS-Limit erreichen. Andernfalls spiegelt die Latenz nicht die tatsächliche E/A-Latenz des nichtflüchtigen Speichers wider. Wenn beispielsweise das IOPS-Limit bei einer E/A-Tiefe von 30 erreicht wird und der Befehl fio doppelt so groß ist, ändern sich die IOPS-Gesamtwerte nicht, während sich die gemeldete E/A-Latenz verdoppelt.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4 \
      --iodepth_batch_complete_max=4
    
  9. Testen Sie die Lesebandbreite mithilfe sequenzieller Lesevorgänge mit mehreren parallelen Streams (mindestens 16) mit einer E/A-Größe von 1 MB und einer E/A-Tiefe von mindestens 64.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  10. Testen Sie die Lese-IOPS. Damit das IOPS-Limit des nichtflüchtigen Speichers erreicht werden kann, muss die E/A-Warteschlange eine entsprechende Tiefe haben. Wenn die E/A-Größe beispielsweise 4 KB übersteigt, kann das Bandbreitenlimit für die VM vor dem IOPS-Limit erreicht werden. Geben Sie --iodepth=256 für diesen Test ein, um das Maximum von 100.000 Lese-IOPS zu erreichen.

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  11. Testen Sie die Leselatenz. Es ist wichtig, den Speicher mit Daten zu füllen, um eine realistische Latenzmessung zu erhalten. Es ist wichtig, dass die VM während dieses Tests nicht das IOPS- oder Durchsatzlimit erreicht, da das nichtflüchtige Laufwerk, nachdem es seine Sättigungsgrenze erreicht hat, eingehende E/A-Vorgänge verzögert, was sich als künstliche Erhöhung der E/A-Latenz widerspiegelt.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4 --iodepth_batch_complete_max=4
    
  12. Testen Sie die sequenzielle Lesebandbreite.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  13. Testen Sie die sequenzielle Schreibbandbreite.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  14. Bereinigen Sie den nichtflüchtigen Wegwerf-Speicher und die Wegwerf-VM:

    1. Löschen Sie den Speicher, der für die Leistungs-Benchmark verwendet wurde.
    2. Löschen Sie die VM, die für die Leistungs-Benchmark erstellt wurde.

Nächste Schritte