Container Service for Kubernetes (ACK) では、永続メモリ (PMEM) デバイスへの直接アクセスにより、高スループットと低レイテンシが実現します。 このトピックでは、ダイナミックランダムアクセスメモリ (DRAM) とPMEMを使用して、大容量のメモリを必要とするインメモリRedisインスタンスをデプロイする方法について説明します。
背景情報
大容量のメモリを必要とするインメモリRedisインスタンスをデプロイする場合は、NVM (不揮発性メモリ) ボリュームをダイレクトメモリとしてマウントできます。 このソリューションは、次の利点を提供します。
NVMボリュームは、宣言的な方法でアクセスされる。 これは、NVMリソースの使用を単純化する。
同じメモリ容量で、コストを30% 50% 削減できます。
アプリケーションの変更は最小限に抑えられます。
Redisは、直接メモリとしてNVMデバイスを使用し、MMAP関数を呼び出してPMEMの連続アドレス空間をマッピングします。この場合、特定のRedisバージョンが必要です。 次の例は、Redisインスタンスのイメージをクエリする方法を示しています。
DRAMを使用したインメモリRedisインスタンスのデプロイ
DRAMは高速アクセス性能を提供するが、電源がオフになるとデータを失う。 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インスタンスが1秒あたり約76,751のリクエストを処理できることを示しています。
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インスタンスが1秒あたり約50,266のリクエストを処理できることを示しています。
DRAMでデプロイされたインメモリRedisインスタンスと比較して、PMEMでデプロイされたインメモリRedisインスタンスは、書き込みパフォーマンスを34% 削減しますが、同じ読み取りパフォーマンスを提供し、コストを50% 削減します。 ECS. ebmre6p.26xlargeなどのNVMデバイスを備えたecs (Elastic Compute Service) インスタンスタイプは、1.5テラバイトのMEMメモリを提供します。これは、一般的なインメモリデータベースの5倍の容量です。