A memória persistente em instâncias do Elastic Compute Service (ECS) pode ser utilizada como memória ou discos locais, dependendo do tipo de instância. Este tópico descreve como configurar a memória persistente como discos locais e como resolver o seguinte problema: falha na alocação de um pool de memória por meio da Low-Level Persistence Library (LLPL) em uma instância otimizada para memória persistente ecs.re6p ou ecs.i4p que utiliza memória persistente como discos locais.
Pré-requisitos
A memória persistente é compatível com os seguintes tipos de instância e versões de imagem:
-
Tipos de instância
-
Família de instâncias em que a memória persistente pode ser usada como memória: ecs.re6p-redis
ImportanteAo utilizar a memória persistente como memória em uma instância, observe as seguintes condições:
É possível usar a memória persistente imediatamente após a compra da instância, sem necessidade de inicialização.
A memória persistente configurada como memória não oferece persistência de dados; portanto, as informações armazenadas serão perdidas quando a instância for parada ou reiniciada.
-
Famílias de instâncias em que a memória persistente pode ser usada como discos locais: ecs.re6p e ecs.i4p
ImportanteAo utilizar a memória persistente como discos locais em uma instância, considere os pontos abaixo:
A inicialização da memória persistente deve ser feita após a compra da instância. Para mais detalhes, consulte a seção Configure persistent memory as a local disk neste tópico.
Embora a memória persistente usada como discos locais garanta a persistência dos dados, ainda existe risco de perda de informações. Recomendamos fazer backup dos dados antecipadamente. Para mais informações sobre discos locais, consulte Local disks.
-
-
Versões de imagem
Alibaba Cloud Linux 2
CentOS 7.6 ou superior
Ubuntu 18.04 e 20.04
Informações gerais
Comparada à memória convencional, a memória persistente apresenta maior latência de acesso, mas oferece melhor custo-benefício, sendo ideal para uso como armazenamento local. Os dados armazenados nesse tipo de memória permanecem intactos mesmo após parar ou reiniciar as instâncias. A memória persistente pode funcionar como memória principal ou como discos locais.
Quando utilizada como memória, permite migrar parte dos dados da memória convencional para a memória persistente, como dados frios que não exigem acesso de alta velocidade. Com grande capacidade e menor preço por GiB, essa abordagem ajuda a reduzir o custo total de propriedade (TCO) por GiB de memória.
Quando configurada como discos locais, suporta operações de leitura e gravação no nível de bloco, entregando desempenho de I/O extremamente alto e latência de apenas 170 nanossegundos. Essa configuração é indicada para bancos de dados de aplicações críticas que demandam tempos de resposta consistentes. Além disso, substituir SSDs NVMe (Non-Volatile Memory Express) por discos locais baseados em memória persistente proporciona maior IOPS, maior largura de banda e menor latência, eliminando gargalos de desempenho.
A confiabilidade dos dados na memória persistente depende diretamente da confiabilidade dos dispositivos físicos e dos servidores aos quais estão conectados, havendo riscos de ponto único de falha. Para garantir a integridade dos dados da aplicação, recomendamos implementar redundância na camada de aplicação e utilizar discos cloud para armazenamento de longo prazo.
Configurar memória persistente como disco local
Este exemplo utiliza uma instância com as seguintes configurações:
Tipo de instância: ecs.re6p.2xlarge
Imagem: Alibaba Cloud Linux 2.1903 LTS 64 bits
-
Faça login em uma instância existente.
Para mais informações, consulte Connect to Linux.
-
Execute os comandos abaixo para instalar os utilitários de gerenciamento de memória persistente e remover todos os namespaces e rótulos:
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. -
Verifique o tamanho da memória persistente.
ndctl list -RA figura a seguir mostra um exemplo de saída do comando, onde o parâmetro size indica o tamanho da memória persistente.

-
Defina o modo de uso como fsdax.
sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --forceNotaSubstitua a variável {region-size} pelo valor de tamanho obtido na etapa anterior.

-
Execute os comandos a seguir para formatar e montar o dispositivo de memória persistente (/dev/pmem):
sudo mkfs -t ext4 /dev/pmem0 sudo mkdir /mnt/sdb sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb -
Visualize o dispositivo /dev/pmem montado.
df -h
Após montar o dispositivo /dev/pmem, utilize ferramentas de teste de desempenho de disco para avaliar o dispositivo.
Para saber como testar o desempenho de discos locais em instâncias i4p ou re6p, consulte a seção Test the performance of local disks on an i4p instance deste tópico.
Testar o desempenho de discos locais em uma instância i4p
Neste exemplo, utilizam-se as seguintes configurações e ferramenta de teste:
Tipo de instância: ecs.i4p.2xlarge
Imagem: Alibaba Cloud Linux 2.1903 LTS 64 bits
Ferramenta de teste: flexible I/O tester (fio). O fio é uma ferramenta open source robusta para benchmarking de desempenho de I/O, capaz de medir métricas de dispositivos de armazenamento em bloco, incluindo operações de leitura e gravação sequenciais e aleatórias.
O uso da ferramenta fio pode causar perda de dados. Antes de iniciar os testes, certifique-se de que os discos locais alvo não contenham informações importantes.
Caso seja necessário testar discos com dados existentes, faça um backup prévio. Para mais detalhes, consulte Back up files on a local disk.
-
Conecte-se a uma instância ECS.
Para mais informações, consulte Connect to Linux.
-
Execute o comando abaixo para instalar a ferramenta fio:
sudo yum install -y ndctl daxctl ipmctl libpmem librpmem libpmemblk libpmemlog libpmemobj libpmempool pmempool fio -
Execute os comandos para testar o desempenho dos discos locais.
-
Para exemplos de comandos, consulte as seções Test IOPS, Test throughput e Test latency deste tópico.
ImportanteAo executar testes consecutivos, rode o comando
sudo rm /mnt/sdb/* -rfapós cada execução para limpar os resultados residuais nos discos locais e preparar um ambiente limpo para o próximo teste. -
A tabela a seguir compara o desempenho entre discos locais NVMe (Non-Volatile Memory Express), ESSDs (Enterprise SSDs) e discos locais baseados em memória persistente.
NotaOs dados de desempenho apresentados servem apenas como referência. Prevalecem os valores obtidos em seus próprios testes.
Métrica
Memória persistente de 128 GiB
SSD NVMe de 1.788 GiB
ESSD de 800 GiB no nível de desempenho 1 (PL1)
Largura de banda de leitura
8 GB/s a 10 GB/s
2 GB/s a 3 GB/s
0,2 GB/s a 0,3 GB/s
Largura de banda de leitura/gravação
8 GB/s a 10 GB/s
1 GB/s a 2 GB/s
0,2 GB/s a 0,3 GB/s
Largura de banda de gravação
2 GB/s a 3 GB/s
1 GB/s a 2 GB/s
0,2 GB/s a 0,3 GB/s
IOPS de leitura
1.000.000
500.000
20.000 a 30.000
IOPS de leitura/gravação
1.000.000
300.000
20.000 a 30.000
IOPS de gravação
1.000.000
300.000
20.000 a 30.000
Latência de leitura
300 a 400 nanossegundos
100.000 nanossegundos
250.000 nanossegundos
Latência de gravação
300 a 400 nanossegundos
20.000 nanossegundos
150.000 nanossegundos
-
Testar IOPS
-
Testar IOPS de leitura sequencial dos discos locais
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 -
Testar IOPS de gravação sequencial dos discos locais
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 -
Testar IOPS de leitura aleatória dos discos locais
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 -
Testar IOPS de gravação aleatória dos discos locais
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
Testar throughput
-
Testar throughput de leitura sequencial dos discos locais
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 -
Testar throughput de gravação sequencial dos discos locais
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 -
Testar throughput de leitura aleatória dos discos locais
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 -
Testar throughput de gravação aleatória dos discos locais
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
Testar latência
-
Testar latência de leitura sequencial dos discos locais
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 -
Testar latência de gravação sequencial dos discos locais
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
Resolver falha na alocação de pool de memória via LLPL
Descrição do problema
Uma instância ecs.re7p ou ecs.i4p, configurada para usar memória persistente como discos locais, apresenta falha ao tentar alocar um pool de memória usando LLPL. O sistema retorna a mensagem de erro Failed to create heap. Cannot read unsafe shutdown count**.
Causa
Por padrão, o recurso unsafe shutdown detection vem habilitado no código-fonte da LLPL. No entanto, memórias não voláteis (NVM) virtualizadas não suportam unsafe shutdown detection. Para mais detalhes, consulte llpl.
Solução
Siga as etapas abaixo para desativar o unsafe shutdown detection no código-fonte da LLPL:
-
Adicione o seguinte trecho ao arquivo src/main/cpp/com_intel_pmem_llpl_AnyHeap.cpp do código-fonte da LLPL:
int sds_write_value=0; pmemobj_ctl_set(NULL,"sds.at_create",&sds_write_value)A imagem a seguir ilustra o código adicionado ao arquivo.

-
Faça login na instância.
Para mais informações, consulte Connect to Linux.
-
Execute o comando abaixo para rodar um caso de teste com a LLPL:
mvn clean && mvn test -Dtest.heap.path=/mnt/sdbSe a mensagem de erro "Failed to create heap. Cannot read unsafe shutdown count**" não aparecer, você poderá prosseguir com a alocação do pool de memória.