Container Service for Kubernetes (ACK) では、アプリケーションを変更することなく、不揮発性メモリをブロックストレージまたはファイルシステムとして使用できます。これにより、NVM ボリュームの使用が簡素化され、SSD と比較して読み書き性能が 2〜10 倍向上します。このトピックでは、低レイテンシーの一時ストレージやデータ集約型ワークロードに NVM ボリュームを使用する方法について説明します。
ユースケース 1:低レイテンシーの一時的な読み書き
このユースケースには、次のシナリオが含まれます:
-
継続的インテグレーション (CI) のための一時ストレージ。
-
小規模ファイルの探索と検索。
-
高スループットのロギング。
-
サーバーレスシナリオにおける一時ファイルの読み書き。
FIO 読み書き性能ベンチマーク
このセクションでは、PMEM-LVM と SSD の 2 つのボリュームタイプそれぞれに個別のアプリケーションを作成し、そのパフォーマンスをベンチマークします。
-
YAML ファイルをデプロイして、PMEM-LVM の PersistentVolumeClaim (PVC) と SSD の PVC を宣言します。
PMEM-LVM PVC の YAML
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-lvmSSD PVC の YAML
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: alicloud-disk-topology -
YAML ファイルをデプロイしてボリュームをマウントし、
fioテストを実行します。PMEM-LVM ボリュームのマウントと 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-pvcSSD ボリュームのマウントと FIO テストの実行
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-ssd labels: app: ssd spec: selector: matchLabels: app: ssd template: metadata: labels: app: ssd spec: containers: - name: fio-test image: registry.cn-hangzhou.aliyuncs.com/eric-dev/sysbench:fio command: ["sh", "-c"] args: ["sleep 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)
結果分析
ボリュームタイプ
IOPS
スループット
PMEM-LVM
92,000
381 MB/s
SSD
37,000
153 MB/s
この結果から、不揮発性メモリを使用する PMEM-LVM ボリュームは、SSD クラウドディスクの 2〜3 倍のパフォーマンスを発揮することがわかります。
-
ユースケース 2:データ集約型ワークロード
このセクションでは、SSD クラウドディスク上のデプロイメントと NVM ボリューム上のデプロイメントを比較し、MySQL データベースの書き込み性能をベンチマークします。
SSD クラウドディスクへの MySQL のデプロイ
-
SSD クラウドディスクボリュームを作成します。
-
次のコマンドを実行して、Alibaba Cloud CSI で SSD クラウドディスクボリュームを作成します。
kubectl apply -f disk-mysql.yamldisk-mysql.yamlテンプレートの例は次のとおりです。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: alicloud-disk-topology -
次のコマンドを実行して、作成された SSD ボリュームを表示します。
kubectl get pvc disk-mysql期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-mysql Bound d-bp12pcfhp3n931s8**** 100Gi RWO alicloud-disk-topology 8s
-
-
SSD ボリュームを使用する MySQL データベースインスタンスを作成します。
-
次のコマンドを実行して、MySQL データベースインスタンスを作成します。
kubectl apply -f mysql-normal-ssd.yamlmysql-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**** -
次のコマンドを実行して、作成された MySQL データベースインスタンスを確認します。
kubectl get pod | grep mysql-normal期待される出力:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
-
NVM ボリュームを使用した MySQL データベースの作成
-
PMEM-LVM ボリュームを作成します。
-
次のコマンドを実行して、Alibaba Cloud CSI を使用して PMEM-LVM ボリュームを作成します。
kubectl apply -f csi-pmem-lvm.yamlcsi-pmem-lvm.yaml テンプレートの例は次のとおりです。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pmem-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: csi-pmem-lvm -
次のコマンドを実行して、作成された 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
-
-
マウントされた PMEM ボリューム上に MySQL データベースを作成します。
-
次のコマンドを実行して、マウントされた PMEM ボリューム上に MySQL データベースを作成します。
kubectl apply -f mysql-normal-pmem.yamlmysql-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**** -
次のコマンドを実行して、作成された MySQL データベースインスタンスを表示します。
kubectl get pod | grep mysql-normal期待される出力:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
-
データベース書き込み性能テスト
Pod 内で次のコマンドを実行して、データベースパフォーマンスの負荷テストを行います。
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
テスト結果
|
ボリュームタイプ |
挿入スループット (挿入/秒) |
|
SSD |
49812 |
|
PMEM-LVM |
122156 |
不揮発性メモリを使用するデータベースの書き込み性能は、SSD を使用する場合の約 2.5 倍です。