Todos los productos
Search
Centro de documentos

:Mejora del rendimiento de lectura y escritura con memoria no volátil

Última actualización: Sep 04, 2026

En ACK, puede utilizar memoria no volátil como block storage o como sistema de archivos sin necesidad de modificar sus aplicaciones. Esto simplifica el uso de volúmenes NVM y mejora el rendimiento de lectura y escritura entre 2 y 10 veces en comparación con los discos SSD. Este tema explica cómo usar volúmenes NVM para almacenamiento temporal de baja latencia y cargas de trabajo intensivas en datos.

Caso de uso 1: lecturas y escrituras temporales de baja latencia

Este caso de uso incluye los siguientes escenarios:

  • Almacenamiento temporal para integración continua (CI).

  • Recorrido y búsqueda de archivos pequeños.

  • Registro de logs con alto throughput.

  • Lectura y escritura de archivos temporales en escenarios serverless.

Prueba de rendimiento de lectura y escritura con FIO

Esta sección compara el rendimiento de dos tipos de volumen, PMEM-LVM y SSD, mediante la creación de una aplicación independiente para cada uno.

  1. Despliegue un archivo YAML para declarar un PVC de PMEM-LVM y un PVC de SSD.

    YAML para el PVC de 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
    	

    YAML para el PVC de SSD

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ssd-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: alicloud-disk-topology
    	
  2. Despliegue un archivo YAML para montar los volúmenes y ejecutar una prueba de fio.Análisis de resultados

    Montar el volumen PMEM-LVM y ejecutar la prueba de 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
    	

    Montar el volumen SSD y ejecutar la prueba de 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
    • Utilice kubectl exec para ingresar al contenedor de prueba y ejecute una prueba de fio con el fin de medir el rendimiento de escritura del volumen 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

      Salida esperada:

      write: IOPS=92.0k, BW=363MiB/s (381MB/s)(8812MiB/24262msec)
      lat (nsec): min=2054, max=95278, avg=10544.00, stdev=1697.17
    • Utilice kubectl exec para ingresar al contenedor de prueba y ejecute una prueba de fio con el fin de medir el rendimiento de escritura del volumen 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

      Salida esperada:

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

    Tipo de volumen

    IOPS

    Throughput

    PMEM-LVM

    92,000

    381 MB/s

    SSD

    37,000

    153 MB/s

    Los resultados muestran que el volumen PMEM-LVM, que utiliza memoria no volátil, ofrece un rendimiento entre 2 y 3 veces superior al del disco en la nube SSD.

Caso de uso 2: cargas de trabajo intensivas en datos

Esta sección evalúa el rendimiento de escritura de una base de datos MySQL y compara un despliegue en un disco en la nube SSD con uno en un volumen NVM.

Desplegar MySQL en un disco en la nube SSD

  1. Cree un volumen de disco en la nube SSD.

    1. Ejecute el siguiente comando para crear un volumen de disco en la nube SSD con Alibaba Cloud CSI.

      kubectl apply -f disk-mysql.yaml

      A continuación se muestra un ejemplo de la plantilla disk-mysql.yaml:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-mysql
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: alicloud-disk-topology
    2. Ejecute el siguiente comando para consultar el volumen SSD creado.

      kubectl get pvc disk-mysql

      Salida esperada:

      NAME         STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS               AGE
      disk-mysql   Bound    d-bp12pcfhp3n931s8****   100Gi      RWO            alicloud-disk-topology   8s
  2. Cree una instancia de base de datos MySQL que utilice un volumen SSD.

    1. Ejecute el siguiente comando para crear una instancia de base de datos MySQL.

      kubectl apply -f mysql-normal-ssd.yaml

      La plantilla mysql-normal-ssd.yaml es la siguiente:

      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. Ejecute el siguiente comando para comprobar la instancia de base de datos MySQL creada.

      kubectl get pod | grep mysql-normal

      Salida esperada:

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

Crear una base de datos MySQL con un volumen NVM

  1. Cree un volumen PMEM-LVM.

    1. Ejecute el siguiente comando para crear un volumen PMEM-LVM mediante Alibaba Cloud CSI.

      kubectl apply -f csi-pmem-lvm.yaml

      A continuación se muestra un ejemplo de la plantilla csi-pmem-lvm.yaml:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pmem-mysql
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: csi-pmem-lvm
    2. Ejecute el siguiente comando para consultar el volumen PMEM-LVM creado.

      kubectl get pvc pmem-mysql

      Salida esperada:

      NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS          AGE
      pmem-mysql   Bound    d-****        100Gi      RWO            csi-pmem-lvm          10h
  2. Cree una base de datos MySQL en el volumen PMEM montado.

    1. Ejecute el siguiente comando para crear una base de datos MySQL en el volumen PMEM montado.

      kubectl apply -f mysql-normal-pmem.yaml

      A continuación se muestra un ejemplo de la plantilla 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. Ejecute el siguiente comando para consultar la instancia de base de datos MySQL creada.

      kubectl get pod | grep mysql-normal

      Salida esperada:

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

Prueba de rendimiento de escritura de la base de datos

Ejecute el siguiente comando en el pod para someter a prueba de estrés el rendimiento de la base de datos.

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

Resultados de la prueba

Tipo de volumen

Throughput de inserción (inserciones/segundo)

SSD

49812

PMEM-LVM

122156

El rendimiento de escritura de una base de datos que utiliza memoria no volátil es aproximadamente 2.5 veces superior al de una que usa SSD.