在ACK環境下,通過修改應用內存分配部分函數對PMEM(Persistent Memory)設備直接訪問,可以實現接近DRAM訪問的吞吐和時延。本文主要介紹如何在大容量內存場景下通過DRAM及PMEM方式部署內存數據庫Redis。
背景信息
在大容量內存場景下使用非易失性存儲卷的直接內存訪問(Direct Memory)方式部署內存數據庫Redis的優勢:
聲明化非易失性存儲卷內存訪問,降低非易失性存儲卷的使用復雜度。
同樣容量內存節省30%~50%的成本。
最小化應用修改。
Redis以直接內存訪問方式使用非易失性存儲設備調用MMAP對PMEM的連續地址空間進行映射。此場景下需要使用特定的Redis版本,可參考本文示例獲取Redis鏡像。
通過DRAM部署Redis內存數據庫
內存(DRAM)可以提供優異的訪問性能,但掉電時數據容易丟失且價格昂貴,不益于大容量內存使用。
部署Redis服務。
使用以下示例模板創建redis-normal.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: name: redis-normal labels: app: redis-normal spec: selector: matchLabels: app: redis-normal template: metadata: labels: app: redis-normal spec: containers: - name: redis image: registry.cn-hangzhou.aliyuncs.com/plugins/redis:v1-normal imagePullPolicy: Always resources: requests: memory: 30Gi limits: memory: 30Gi
執行以下命令部署Redis服務。
kubectl apply -f redis-normal.yaml
執行以下命令查看Redis服務。
kubectl get pod | grep redis-normal
預期輸出:
redis-normal-*** 1/1 Running 0 4d8h
執行以下命令測試Redis寫性能。
LD_PRELOAD=/usr/local/lib/libmemkind.so redis-benchmark -d 102400 -t set -n 1000000 -r 1000000
預期輸出:
1000000 requests completed in 13.03 seconds 76751.86 requests per second
從以上預期輸出可以得出:通過DRAM部署的Redis內存數據庫,每秒大約處理76751個請求。
通過PMEM部署Redis內存數據庫
持久化內存PMEM既兼顧非易失性存儲,又接近DRAM的使用方式和速度。
執行以下命令部署Redis內存數據庫。
kubectl apply -f redis-normal.yaml
redis-normal.yaml的示例模板如下所示:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pmem-pvc-direct spec: accessModes: - ReadWriteOnce resources: requests: storage: 60Gi storageClassName: csi-pmem-direct --- apiVersion: apps/v1 kind: Deployment metadata: name: redis-pmem-direct labels: app: redis-pmem-direct spec: selector: matchLabels: app: redis-pmem-direct template: metadata: labels: app: redis-pmem-direct spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/plugins/redis:v1-pmem imagePullPolicy: Always volumeMounts: - name: pmem-pvc mountPath: "/mnt/pmem" volumes: - name: pmem-pvc persistentVolumeClaim: claimName: pmem-pvc-direct
執行以下命令查看部署的Redis。
kubectl get pod | grep redis-pmem-direct
預期輸出:
redis-pmem-direct-5b469546db-5tk2j 1/1 Running 0 4d9h
執行以下命令測試Redis寫性能。
LD_PRELOAD=/usr/local/lib/libmemkind.so redis-benchmark -d 10240 -t set -n 1000000 -r 1000000
預期輸出:
1000000 requests completed in 19.89 seconds 50266.41 requests per second
從以上預期輸出可以得出:通過PMEM部署的Redis內存數據庫,每秒大約處理50266個請求。
相比DRAM部署Redis內存數據庫的寫性能,PMEM部署的Redis內存數據庫的寫性能降低僅約34%,讀性能不受影響,但成本下降50%。同時使用非易失性存儲卷對機型ecs.ebmre6p.26xlarge 1.5TB的PMEM內存空間,相比于普通內存數據庫容量提升了4倍。