全部产品
Search
文档中心

:Gunakan volume NVM untuk meningkatkan kinerja baca dan tulis

更新时间:Jun 27, 2025

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.

  1. 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-lvm
    	

    Template YAML untuk PVC tipe SSD

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ssd-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: alicloud-disk-topology
    	
  2. Terapkan 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-pvc
    	

    Buat 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-pvc
    	
    • Gunakan perintah kubectl exec untuk 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_4k

      Output yang Diharapkan:

      write: IOPS=92.0k, BW=363MiB/s (381MB/s)(8812MiB/24262msec)
      lat (nsec): min=2054, max=95278, avg=10544.00, stdev=1697.17
    • Gunakan perintah kubectl exec untuk 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_4k

      Output 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

  1. Buat volume SSD.

    1. Jalankan perintah berikut untuk membuat volume SSD menggunakan driver Container Storage Interface (CSI) yang disediakan oleh Alibaba Cloud:

      kubectl apply -f disk-mysql.yaml

      Template 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-topology
    2. Jalankan perintah berikut untuk menanyakan volume SSD:

      kubectl get pvc disk-mysql

      Output yang Diharapkan:

      NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS             AGE
      disk-mysql   Bound    d-***       100Gi      RWO            alicloud-disk-topology   10h
  2. Buat instance MySQL yang memiliki volume SSD dipasang.

    1. Jalankan perintah berikut untuk membuat instance MySQL:

      kubectl apply -f mysql-normal-ssd.yaml

      Template 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****
    2. Jalankan perintah berikut untuk menanyakan pod yang menjalankan instance MySQL:

      kubectl get pod | grep mysql-normal

      Output yang Diharapkan:

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

Create a MySQL instance that has an NVM volume mounted

  1. Buat volume PMEM-LVM.

    1. Jalankan perintah berikut untuk membuat volume PMEM-LVM menggunakan driver CSI yang disediakan oleh Alibaba Cloud:

      kubectl apply -f csi-pmem-lvm.yaml

      Template 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-lvm
    2. Jalankan perintah berikut untuk menanyakan volume PMEM-LVM:

      kubectl get pvc pmem-mysql

      Output yang Diharapkan:

      NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
      pmem-mysql   Bound    d-****        100Gi      RWO            csi-pmem-lvm          10h
  2. Buat instance MySQL yang memiliki volume PMEM-LVM dipasang.

    1. Jalankan perintah berikut untuk membuat instance MySQL yang memiliki volume PMEM-LVM dipasang:

      kubectl apply -f mysql-normal-pmem.yaml

      Template 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****
    2. Jalankan perintah berikut untuk menanyakan pod yang menjalankan instance MySQL:

      kubectl get pod | grep mysql-normal

      Output 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=150

Test 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.