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


Verwenden Sie zum Benchmarking der Leistung nichtflüchtiger Speicher Flexibler E/A-Tester (FIO) anstelle anderer Benchmarking-Tools wie dd. Standardmäßig verwendet dd eine sehr niedrige E/A-Warteschlangentiefe. Daher ist es schwierig sicherzustellen, dass die Benchmark eine ausreichende Anzahl von E/A und Byte generiert, um die Laufwerksleistung genau zu testen.

Außerdem sind spezielle Geräte, die mit dd verwendet werden, oft sehr langsam und spiegeln die Leistung nichtflüchtiger Speicher nicht genau wider. Vermeiden Sie im Allgemeinen die Verwendung spezieller Geräte wie /dev/urandom, /dev/random und /dev/zero in Leistungs-Benchmarks für nichtflüchtige Speicher.

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 eines nichtflüchtigen Speichers führen Sie ein direktes Benchmarking des Blockgerä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.

  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) mit 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=60s --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 zufälliger 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=60s --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) mit 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=60s --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=60s --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.

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. Stellen Sie eine Verbindung zur Instanz her.

  2. Installieren Sie die Abhängigkeiten:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Füllen Sie den Speicher mit Daten ungleich null. Lesevorgänge aus leeren Blöcken von nichtflüchtigem Speicher 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
    
  4. 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=1m \
      --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
    
  5. 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  6. 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4  \
      --iodepth_batch_complete_max=4
    
  7. 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=1m \
      --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
    
  8. 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=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Testen Sie die Leselatenz. Es ist wichtig, den Speicher mit Daten zu füllen, um eine realistische Latenzmessung zu erhalten. Die VM darf während dieses Tests nicht das IOPS- oder Durchsatzlimit erreichen. Ist dies der Fall, werden eingehende E/A-Vorgänge verzögert, was zu einer künstlichen Erhöhung der E/A-Latenz führt.

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

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --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
    
  11. Testen Sie die sequenzielle Schreibbandbreite.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --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
    

Nächste Schritte