La mémoire persistante des instances Elastic Compute Service (ECS) sert soit de mémoire vive, soit de disque local, selon le type d'instance. Cette rubrique explique comment configurer la mémoire persistante en tant que disque local. Elle décrit également la résolution du problème suivant : échec d'allocation d'un pool de mémoire via la bibliothèque Low-Level Persistence Library (LLPL) sur une instance optimisée pour la mémoire persistante (ecs.re6p ou ecs.i4p).
Prérequis
La mémoire persistante est compatible avec les types d'instance et versions d'image suivants :
-
Types d'instance
-
Familles d'instances utilisant la mémoire persistante comme mémoire vive : ecs.re6p-redis
ImportantLorsque vous utilisez la mémoire persistante comme mémoire vive sur une instance :
L'utilisation est immédiate après l'achat de l'instance, sans initialisation préalable.
La persistance des données n'est pas assurée. Les données stockées sont perdues en cas d'arrêt ou de redémarrage de l'instance.
-
Familles d'instances utilisant la mémoire persistante comme disques locaux : ecs.re6p et ecs.i4p
ImportantLorsque vous utilisez la mémoire persistante comme disques locaux sur une instance :
Vous devez initialiser la mémoire persistante après l'achat de l'instance. Pour plus d'informations, consultez la section Configurer la mémoire persistante en tant que disque local de cette rubrique.
La persistance des données est assurée, mais un risque de perte subsiste. Nous vous recommandons de sauvegarder vos données au préalable. Pour plus d'informations sur les disques locaux, consultez la rubrique Disques locaux.
-
-
Versions d'image
Alibaba Cloud Linux 2
CentOS 7.6 et versions ultérieures
Ubuntu 18.04 et 20,04
Contexte
La mémoire persistante offre une latence d'accès supérieure à celle de la mémoire classique, mais elle reste rentable pour le stockage local. Les données y sont conservées lors de l'arrêt ou du redémarrage des instances. La mémoire persistante peut servir de mémoire vive ou de disque local.
En tant que mémoire vive, elle permet de déplacer certaines données (comme les données peu consultées ne nécessitant pas un accès rapide) depuis la mémoire classique. Sa grande capacité et son coût réduit par GiB contribuent à diminuer le coût total de possession (TCO) de la mémoire.
En tant que disque local, elle prend en charge les opérations de lecture/écriture par blocs, offrant des performances d'E/S ultra-élevées et une latence pouvant atteindre 170 nanosecondes. Elle convient aux bases de données d'applications critiques exigeant un temps de réponse constant. Remplacer les SSD NVMe (Non-Volatile Memory Express) par des disques locaux en mémoire persistante permet d'augmenter les IOPS et la bande passante tout en réduisant la latence, résolvant ainsi les goulots d'étranglement de performance.
La fiabilité des données dépend de celle des périphériques de mémoire persistante et des serveurs physiques auxquels ils sont connectés. Des risques de point de défaillance unique existent. Pour garantir la fiabilité des données applicatives, nous vous recommandons de mettre en œuvre la redondance des données au niveau de l'application et d'utiliser des disques cloud pour le stockage à long terme.
Configurer la mémoire persistante en tant que disque local
Cet exemple utilise une instance avec les configurations suivantes :
Type d'instance : ecs.re6p.2xlarge
Image : Alibaba Cloud Linux 2.1903 LTS 64 bits
-
Connectez-vous à l'instance.
Pour plus d'informations, consultez la rubrique Se connecter à une instance Linux à l'aide de Workbench.
-
Installez les utilitaires de gestion de la mémoire persistante et supprimez tous les namespaces et libellés :
sudo yum install -y ndctl daxctl sudo ndctl disable-namespace all && sudo ndctl destroy-namespace all #Delete all namespaces. sudo ndctl disable-region all && sudo ndctl zero-labels all && sudo ndctl enable-region all #Delete all labels. -
Vérifiez la taille de la mémoire persistante.
ndctl list -RLa figure suivante présente un exemple de sortie. Le paramètre
sizeindique la taille de la mémoire persistante.
-
Définissez le mode d'utilisation sur
fsdax.sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --forceRemarqueRemplacez
{region-size}par la valeur obtenue à l'étape précédente.
-
Formatez et montez le périphérique de mémoire persistante (
/dev/pmem) :sudo mkfs -t ext4 /dev/pmem0 sudo mkdir /mnt/sdb sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb -
Vérifiez le montage du périphérique
/dev/pmem.df -h
Une fois le périphérique
/dev/pmemmonté, utilisez des outils de test de performance pour évaluer ses capacités.Pour tester les performances des disques locaux sur une instance i4p ou re6p, consultez la section Tester les performances des disques locaux sur une instance i4p de cette rubrique.
Tester les performances des disques locaux sur une instance i4p
Cet exemple utilise les configurations et l'outil de test suivants :
Type d'instance : ecs.i4p.2xlarge
Image : Alibaba Cloud Linux 2.1903 LTS 64 bits
Outil de test : flexible I/O tester (fio). fio est un outil open source puissant de benchmarking des performances d'E/S. Il permet de tester les métriques des périphériques de stockage par blocs, notamment les opérations de lecture et d'écriture séquentielles et aléatoires.
L'outil fio peut entraîner une perte de données. Avant de tester les performances des disques locaux, assurez-vous qu'ils ne contiennent aucune donnée.
Si vous devez tester des disques contenant des données, sauvegardez-les au préalable. Pour plus d'informations, consultez la rubrique Sauvegarder des fichiers sur un disque local.
-
Connectez-vous à l'instance ECS.
Pour plus d'informations, consultez la rubrique Se connecter à une instance Linux à l'aide de Workbench.
-
Installez l'outil fio :
sudo yum install -y ndctl daxctl ipmctl libpmem librpmem libpmemblk libpmemlog libpmemobj libpmempool pmempool fio -
Testez les performances des disques locaux.
-
Pour les exemples de commandes, consultez les sections Tester les IOPS, Tester le débit et Tester la latence de cette rubrique.
ImportantEn cas de tests consécutifs, exécutez la commande
sudo rm /mnt/sdb/* -rfaprès chaque test pour supprimer les résultats résiduels et préparer un environnement propre pour le test suivant. -
Le tableau suivant compare les performances des SSD NVMe locaux, des Enterprise SSDs (ESSD) et des disques locaux en mémoire persistante.
RemarqueLes données de performance ci-dessous sont fournies à titre indicatif. Seuls les résultats de vos tests font foi.
Métrique
Mémoire persistante de 128 GiB
SSD NVMe de 1 788 GiB
ESSD de 800 GiB au niveau de performance 1 (PL1)
Bande passante en lecture
8 Go/s à 10 Go/s
2 Go/s à 3 Go/s
0,2 Go/s à 0,3 Go/s
Bande passante en lecture/écriture
8 Go/s à 10 Go/s
1 Go/s à 2 Go/s
0,2 Go/s à 0,3 Go/s
Bande passante en écriture
2 Go/s à 3 Go/s
1 Go/s à 2 Go/s
0,2 Go/s à 0,3 Go/s
IOPS en lecture
1 000 000
500 000
20 000 à 30 000
IOPS en lecture/écriture
1 000 000
300 000
20 000 à 30 000
IOPS en écriture
1 000 000
300 000
20 000 à 30 000
Latence en lecture
300 à 400 nanosecondes
100 000 nanosecondes
250 000 nanosecondes
Latence en écriture
300 à 400 nanosecondes
20 000 nanosecondes
150 000 nanosecondes
-
Tester les IOPS
-
Testez les IOPS en lecture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez les IOPS en écriture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=write --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez les IOPS en lecture aléatoire des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randread --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez les IOPS en écriture aléatoire des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randwrite --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
Tester le débit
-
Testez le débit en lecture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=read --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez le débit en écriture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=8 --iodepth=1 --rw=write --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez le débit en lecture aléatoire des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randread --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez le débit en écriture aléatoire des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randwrite --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
Tester la latence
-
Testez la latence en lecture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split -
Testez la latence en écriture séquentielle des disques locaux
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=write --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
Résoudre l'échec d'allocation d'un pool de mémoire par LLPL sur une instance
Description du problème
L'allocation d'un pool de mémoire via LLPL échoue sur une instance ecs.re7p ou ecs.i4p configurée pour utiliser la mémoire persistante comme disques locaux. Le message d'erreur suivant s'affiche : Failed to create heap. Cannot read unsafe shutdown count**.
Cause
Par défaut, la détection d'arrêt non sécurisé (unsafe shutdown detection) est activée dans le code source de LLPL. Or, la mémoire non volatile (NVM) virtualisée ne prend pas en charge cette fonctionnalité. Pour plus d'informations, consultez la page llpl.
Solution
Désactivez la unsafe shutdown detection dans le code source de LLPL en suivant ces étapes :
-
Ajoutez le code suivant au fichier src/main/cpp/com_intel_pmem_llpl_AnyHeap.cpp du code source de LLPL :
int sds_write_value=0; pmemobj_ctl_set(NULL,"sds.at_create",&sds_write_value)La figure suivante illustre l'ajout du code au fichier.

-
Connectez-vous à l'instance.
Pour plus d'informations, consultez la rubrique Se connecter à une instance Linux à l'aide de Workbench.
-
Exécutez un cas de test via LLPL :
mvn clean && mvn test -Dtest.heap.path=/mnt/sdbSi le message d'erreur « Failed to create heap. Cannot read unsafe shutdown count** » n'apparaît pas, vous pouvez procéder à l'allocation du pool de mémoire.