すべてのプロダクト
Search
ドキュメントセンター

:NVMボリュームを使用して読み書きパフォーマンスを向上させる

最終更新日:Oct 21, 2024

Container Service for Kubernetes (ACK) を使用すると、アプリケーションを変更することなく、不揮発性メモリ (NVM) ボリュームをブロックストレージまたはファイルシステムとして使用できます。 これにより、NVMリソースの使用が容易になり、標準SSDと比較して読み書き性能が2〜10倍向上します。 このトピックでは、ACKクラスターでNVMボリュームを使用して、低レイテンシで高速な読み取りと一時ストレージへの書き込みを必要とするデータ集約型ワークロードおよびシナリオの要件を満たす方法について説明します。

シナリオ1: 低レイテンシで高速な一時ストレージ

次のシナリオでは、低レイテンシで高速な一時ストレージが必要です。

  • 継続的な統合と継続的な配信での一時保存 (CD/CD)

  • 小さなファイルのトラバーサル

  • 高スループットロギング

  • サーバーレスシナリオでの一時ファイルの読み取りと書き込み

FIOを使用した読み取りおよび書き込みパフォーマンスのテスト

このトピックでは、読み書きのパフォーマンスをテストするために、AEP PMEM-LVMとSSDに基づいて2つの永続ボリュームクレーム (PVC) を作成します。

  1. 次のYAMLファイルをデプロイして、PMEM-LVMとSSDに基づいて2つのPVCを作成します。

    YAMLテンプレートのPVC PMEM-LVM型

    allowVolumeExpansion: true
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-pmem-lvm
    mountOptions:
    - dax
    parameters:
      lvmType: striping
      nodeAffinity: "true"
      volumeType: PMEM
    provisioner: localplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pmem-lvm-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: csi-pmem-lvm
    	

    SSDタイプのPVCのYAMLテンプレート

    apiVersion: v1
    kind: PersistentVolumeClaim
    メタデータ:
      名前: ssd-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          ストレージ: 100Gi
      storageClassName: alicloud-disk-topology
    
  2. 次のYAMLファイルをデプロイして、ボリュームをポッドにマウントし、FIOテストを実行します。

    アプリケーションを作成し、PMEM-LVMタイプのPVCマウントと実行FIOテスト

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deployment-pmem-lvm
      labels:
        app: pmem-lvm
    spec:
      selector:
        matchLabels:
          app: pmem-lvm
      template:
        metadata:
          labels:
            app: pmem-lvm
        spec:
          containers:
          - name: fio-test
            image: registry.cn-hangzhou.aliyuncs.com/eric-dev/sysbench:fio
            command: ["sh", "-c"]
            args: ["sleep 10000"]
            volumeMounts:
              - name: pmem
                mountPath: "/data"
          volumes:
            - name: pmem
              persistentVolumeClaim:
                claimName: pmem-lvm-pvc
    	

    SSDタイプのPVCがマウントされたアプリケーションを作成し、FIOテストを実行

    apiVersion: apps/v1
    kind: 配置
    メタデータ:
      名前: deployment-ssd
      ラベル:
        アプリ: ssd
    spec:
      セレクタ:
        matchLabels:
          アプリ: ssd
      template:
        metadata:
          labels:
            アプリ: ssd
        仕様:
          containers:
          -名前: fio-test
            画像: registry.cn-hangzhou.aliyuncs.com/eric-dev/sysbench:fio
            コマンド: ["sh", "-c"]
            args: ["睡眠10000"]
            volumeMounts:
              -name: ssd
                mountPath: "/data"
          volumes:
            -name: ssd
              persistentVolumeClaim:
                claimName: ssd-pvc
    
    • kubectl execコマンドを使用してコンテナ内でFIOテストを実行し、PMEM-LVMボリュームの書き込みパフォーマンスをテストします。

      mount | grep csi
      cd /data
      fio -filename=./testfile -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k

      期待される出力:

      write: IOPS=92.0k, BW=363MiB/s (381MB/s)(8812MiB/24262msec)
      lat (nsec): min=2054, max=95278, avg=10544.00, stdev=1697.17
    • kubectl execコマンドを使用してコンテナ内でFIOテストを実行し、SSDボリュームの書き込みパフォーマンスをテストします。

      cd /data
      fio -filename=./testfile -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k

      期待される出力:

      lat (usec): min=20, max=7168, avg=24.76, stdev=13.97
      write: IOPS=37.3k, BW=146MiB/s (153MB/s)(8744MiB/60001msec)

    出力は、AEPデバイスの読み取りおよび書き込みパフォーマンスがSSDデバイスのパフォーマンスよりも2〜3倍高いことを示しています。

    ボリュームタイプ

    IOPS

    スループット

    PMEM-LVM

    92000

    381 MB/s

    SSD

    37000

    153 MB/s

シナリオ2: データ集中型ワークロード

このトピックでは、SSDボリュームがマウントされているMySQLインスタンスと、NVMボリュームがマウントされているMySQLインスタンスが作成されます。 次に、MySQLインスタンスの書き込みパフォーマンスがテストされます。

SSDボリュームがマウントされたMySQLインスタンスの作成

  1. SSDボリュームを作成します。

    1. 次のコマンドを実行して、Alibaba Cloudが提供するContainer Storage Interface (CSI) ドライバーを使用してSSDボリュームを作成します

      kubectl apply -f disk-mysql.yaml

      次のテンプレートに、disk-mysql.yamlファイルの例を示します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-mysql
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: alicloud-disk-topology
    2. 次のコマンドを実行してSSDボリュームを照会します。

      kubectl get pvc disk-mysql

      期待される出力:

      NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS             AGE
      disk-mysql   Bound    d-***       100Gi      RWO            alicloud-disk-topology   10h
  2. SSDボリュームがマウントされたMySQLインスタンスを作成します。

    1. 次のコマンドを実行して、MySQLインスタンスを作成します。

      kubectl apply -f mysql-normal-ssd.yaml

      次のテンプレートに、mysql-normal-ssd.yamlファイルの例を示します。

      apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
      kind: Deployment
      metadata:
        name: mysql-normal
        labels:
          app: wordpress
      spec:
        selector:
          matchLabels:
            app: wordpress
            tier: mysql
        strategy:
          type: Recreate
        template:
          metadata:
            labels:
              app: wordpress
              tier: mysql
          spec:
            hostNetwork: true
            containers:
            - image: mysql:5.6
              name: mysql
              env:
              - name: MYSQL_ROOT_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mysql-pass
                    key: password
              ports:
              - containerPort: 3306
                name: mysql
              volumeMounts:
              - name: mysql
                mountPath: /var/lib/mysql
            volumes:
              - name: mysql
                persistentVolumeClaim:
                  claimName: disk-mysql
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      data:
        username: YWRt****
        password: YWRt****
    2. 次のコマンドを実行して、MySQLインスタンスを実行するポッドを照会します。

      kubectl get pod | grep mysql-normal

      期待される出力:

      NAME                    READY    STATUS   RESTARTS    AGE
      mysql-normal-****       1/1      Running   0          10h

NVMボリュームがマウントされたMySQLインスタンスの作成

  1. PMEM-LVMボリュームを作成します。

    1. 次のコマンドを実行して、Alibaba Cloudが提供するCSIドライバーを使用してPMEM-LVMボリュームを作成します

      kubectl apply -f csi-pmem-lvm.yaml

      次のテンプレートに、csi-pmem-lvm.yamlファイルの例を示します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pmem-mysql
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: csi-pmem-lvm
    2. 次のコマンドを実行して、PMEM-LVMボリュームを照会します。

      kubectl get pvc pmem-mysql

      期待される出力:

      NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
      pmem-mysql   Bound    d-****        100Gi      RWO            csi-pmem-lvm          10h
  2. PMEM-LVMボリュームがマウントされたMySQLインスタンスを作成します。

    1. 次のコマンドを実行して、PMEM-LVMボリュームがマウントされたMySQLインスタンスを作成します。

      kubectl apply -f mysql-normal-pmem.yaml

      次のテンプレートに、mysql-normal-pmem.yamlファイルの例を示します。

      apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
      kind: Deployment
      metadata:
        name: mysql-normal
        labels:
          app: wordpress
      spec:
        selector:
          matchLabels:
            app: wordpress
            tier: mysql
        strategy:
          type: Recreate
        template:
          metadata:
            labels:
              app: wordpress
              tier: mysql
          spec:
            hostNetwork: true
            nodeName: <NODE name of worker node>
            containers:
            - image: mysql:5.6
              name: mysql
              env:
              - name: MYSQL_ROOT_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mysql-pass
                    key: password
              ports:
              - containerPort: 3306
                name: mysql
              volumeMounts:
              - name: mysql
                mountPath: /var/lib/mysql
            volumes:
              - name: mysql
                persistentVolumeClaim:
                  claimName: pmem-mysql
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      data:
        username: YWRt****
        password: YWRt****
    2. 次のコマンドを実行して、MySQLインスタンスを実行するポッドを照会します。

      kubectl get pod | grep mysql-normal

      期待される出力:

      NAME                    READY    STATUS   RESTARTS    AGE
      mysql-normal-****        1/1     Running   0          10h

MySQLインスタンスの書き込みパフォーマンスのテスト

ポッドで次のコマンドを実行して、MySQLインスタンスの書き込みパフォーマンスをテストします。

sysbench /root/sysbench/point_select.lua run --db-driver=mysql --report-interval=1
--mysql-table-engine=innodb --oltp-table-size=10000 --oltp-tables-count=32 --oltp-test-mode=complex 
--time=100 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=admin 
--mysql-db=sbtest --oltp-read-only=on --oltp-simple-ranges=0 --oltp-sum-ranges=0 
--oltp-order-ranges=0 --oltp-distinct-ranges=0  --oltp-dist-type=uniform --warmup-time=300 
--max-time=30 --max-requests=0 --percentile=99 --num-threads=150

テスト結果

ボリュームタイプ

IOPSの挿入

SSD

49812

PMEM-LVM

122156

結果は、NVMボリュームがマウントされたMySQLインスタンスの書き込みパフォーマンスが、SSDボリュームがマウントされたMySQLインスタンスの書き込みパフォーマンスの2.5倍であることを示しています。