Container Service for Kubernetes (ACK) memungkinkan Anda menggunakan volume memori non-volatile (NVM) sebagai penyimpanan blok atau sistem file tanpa modifikasi pada aplikasi Anda. Hal ini memudahkan pemanfaatan sumber daya NVM serta meningkatkan kinerja baca dan tulis sebesar 2 hingga 10 kali dibandingkan SSD standar. Topik ini menjelaskan cara menggunakan volume NVM dalam kluster ACK untuk memenuhi kebutuhan beban kerja intensif data dan skenario yang memerlukan latensi rendah serta pembacaan dan penulisan ke penyimpanan sementara dengan kecepatan tinggi.
Skenario 1: Penyimpanan sementara berlatensi rendah dan kecepatan tinggi
Berikut adalah skenario yang memerlukan penyimpanan sementara berlatensi rendah dan kecepatan tinggi:
Penyimpanan sementara dalam integrasi dan pengiriman berkelanjutan (CI/CD)
Penjelajahan file kecil
Pencatatan dengan throughput tinggi
Pembacaan dan penulisan file sementara dalam skenario serverless
Use FIO to test read and write performance
Dalam topik ini, dua persistent volume claims (PVC) dibuat berdasarkan AEP PMEM-LVM dan SSD untuk menguji kinerja baca dan tulis.
Terapkan file YAML berikut untuk membuat dua PVC berdasarkan PMEM-LVM dan SSD:
Template YAML untuk PVC tipe 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-lvmTemplate YAML untuk PVC tipe SSD
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ssd-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: alicloud-disk-topologyTerapkan file YAML berikut untuk memasang volume ke pod dan menjalankan tes FIO:
Buat aplikasi yang memiliki PVC tipe PMEM-LVM dipasang dan jalankan tes 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-pvcBuat aplikasi yang memiliki PVC tipe SSD dipasang dan jalankan tes 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-pvcGunakan perintah
kubectl execuntuk menjalankan tes FIO di dalam kontainer guna menguji kinerja tulis volume 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_4kOutput yang Diharapkan:
write: IOPS=92.0k, BW=363MiB/s (381MB/s)(8812MiB/24262msec) lat (nsec): min=2054, max=95278, avg=10544.00, stdev=1697.17Gunakan perintah
kubectl execuntuk menjalankan tes FIO di dalam kontainer guna menguji kinerja tulis volume 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_4kOutput yang Diharapkan:
lat (usec): min=20, max=7168, avg=24.76, stdev=13.97 write: IOPS=37.3k, BW=146MiB/s (153MB/s)(8744MiB/60001msec)
Output menunjukkan bahwa kinerja baca dan tulis perangkat AEP dua hingga tiga kali lebih tinggi daripada perangkat SSD.
Tipe Volume
IOPS
Throughput
PMEM-LVM
92000
381 MB/s
SSD
37000
153 MB/s
Skenario 2: Beban kerja intensif data
Dalam topik ini, sebuah instance MySQL yang memiliki volume SSD dipasang dan sebuah instance MySQL yang memiliki volume NVM dipasang dibuat. Kemudian, kinerja tulis instance MySQL diuji.
Create a MySQL instance that has an SSD volume mounted
Buat volume SSD.
Jalankan perintah berikut untuk membuat volume SSD menggunakan driver Container Storage Interface (CSI) yang disediakan oleh Alibaba Cloud:
kubectl apply -f disk-mysql.yamlTemplate berikut memberikan contoh file disk-mysql.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: alicloud-disk-topologyJalankan perintah berikut untuk menanyakan volume SSD:
kubectl get pvc disk-mysqlOutput yang Diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-mysql Bound d-*** 100Gi RWO alicloud-disk-topology 10h
Buat instance MySQL yang memiliki volume SSD dipasang.
Jalankan perintah berikut untuk membuat instance MySQL:
kubectl apply -f mysql-normal-ssd.yamlTemplate berikut memberikan contoh file 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****Jalankan perintah berikut untuk menanyakan pod yang menjalankan instance MySQL:
kubectl get pod | grep mysql-normalOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
Create a MySQL instance that has an NVM volume mounted
Buat volume PMEM-LVM.
Jalankan perintah berikut untuk membuat volume PMEM-LVM menggunakan driver CSI yang disediakan oleh Alibaba Cloud:
kubectl apply -f csi-pmem-lvm.yamlTemplate berikut memberikan contoh file csi-pmem-lvm.yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pmem-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: csi-pmem-lvmJalankan perintah berikut untuk menanyakan volume PMEM-LVM:
kubectl get pvc pmem-mysqlOutput yang Diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-mysql Bound d-**** 100Gi RWO csi-pmem-lvm 10h
Buat instance MySQL yang memiliki volume PMEM-LVM dipasang.
Jalankan perintah berikut untuk membuat instance MySQL yang memiliki volume PMEM-LVM dipasang:
kubectl apply -f mysql-normal-pmem.yamlTemplate berikut memberikan contoh file 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****Jalankan perintah berikut untuk menanyakan pod yang menjalankan instance MySQL:
kubectl get pod | grep mysql-normalOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
Test the write performance of the MySQL instance
Jalankan perintah berikut pada pod untuk menguji kinerja tulis instance 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=150Test results
Tipe Volume | Insert IOPS |
SSD | 49812 |
PMEM-LVM | 122156 |
Hasilnya menunjukkan bahwa kinerja tulis instance MySQL yang memiliki volume NVM dipasang adalah 2,5 kali kinerja tulis instance MySQL yang memiliki volume SSD dipasang.