Aumento da densidade de contêineres em um nó utilizando a tecnologia PFCACHE

Aumento da densidade de contêineres em um nó utilizando a tecnologia PFCACHE

Um dos objetivos do provedor de hospedagem é maximizar a utilização do hardware disponível para oferecer um serviço de qualidade aos usuários finais. Os recursos dos servidores finais são sempre limitados, no entanto, a quantidade de serviços de clientes, e neste caso específico sobre VPS, pode variar significativamente. Sobre como subir na árvore de Natal e comer um hambúrguer, leia mais abaixo.

Compactar VPS no nó de forma que os clientes não sintam isso ajuda muito a melhorar os indicadores econômicos de qualquer provedor de hospedagem. Sem dúvida, o nó não deve estar sobrecarregado se estiver cheio de contêineres, e qualquer pico de carga será imediatamente sentido por todos os clientes.

Quantos VPS podem ser hospedados em um único nó depende de muitos fatores, alguns tão evidentes quanto:

1. Características do hardware do próprio nó
2. Tamanho do VPS
3. Tipo de carga no VPS
4. Tecnologias de software que ajudam a otimizar a densidade

Neste caso, vamos compartilhar a experiência de usar a tecnologia Pfcache para Virtuozzo.
Estamos usando a versão 6, mas tudo o que foi dito também se aplica à versão 7.

Pfcache é um mecanismo do Virtuozzo que ajuda a deduplicar IOPS e RAM em contêineres, alocando arquivos iguais em contêineres em uma área comum separada.

Na prática, ele consiste em:
1. Código do núcleo
2. Demônio do espaço do usuário
3. Utilitário do espaço do usuário

No lado do nó, alocamos uma partição inteira onde os arquivos que serão diretamente utilizados por todos os VPS no nó serão criados. Essa partição monta o dispositivo de bloco ploop. Assim, ao iniciar o contêiner, ele recebe uma referência a essa partição:

[root@pcs13 ~]# cat /proc/mounts
...
/dev/ploop62124p1 /vz/pfcache ext4 rw,relatime,barrier=1,data=ordered,balloon_ino=12 0 0
...
/dev/ploop22927p1 /vz/root/418 ext4 rw,relatime,barrier=1,data=ordered,balloon_ino=12,pfcache_csum,pfcache=/vz/pfcache 0 0
/dev/ploop29642p1 /vz/root/264 ext4 rw,relatime,barrier=1,data=ordered,balloon_ino=12,pfcache_csum,pfcache=/vz/pfcache 0 0
...

Aqui está uma estatística aproximada do número de arquivos em um de nossos nós:

[root@pcs13 ~]# find /vz/pfcache -type f | wc -l
45851
[root@pcs13 ~]# du -sck -h /vz/pfcache
2.4G /vz/pfcache
2.4G total

O princípio de funcionamento do pfcache é o seguinte:
• O demônio do espaço do usuário Pfcached grava o hash sha-1 do arquivo no atributo xattr desse arquivo. Os arquivos não são todos processados, mas apenas nas diretórios /usr, /bin, /usr/sbin, /sbin, /lib, /lib64

• É mais provável que os arquivos nesses diretórios sejam "comuns" e usados por vários contêineres;

• O Pfcached periodicamente coleta estatísticas de leitura de arquivos do núcleo, analisa essas informações e adiciona arquivos ao cache, caso seu uso seja frequente;

• Os dados do diretório podem ser diferentes e são configurados nos arquivos de configuração.

• Ao ler um arquivo, verifica-se se ele contém o hash especificado nos atributos estendidos xattr. Se contiver, um arquivo "compartilhado" é aberto, em vez do arquivo do container. Essa substituição ocorre de forma invisível para o código do container, sendo oculta no núcleo;

• Ao gravar no arquivo, o hash é invalidado. Assim, ao abrir novamente, o arquivo que será aberto será o do container diretamente, e não seu cache.

Mantendo os arquivos compartilhados no cache de página de /vz/pfcache, conseguimos economizar esse próprio cache, assim como IOPS. Em vez de ler dez arquivos do disco, lemos um que já vai diretamente para o cache de página.

struct inode {
...
 struct file             *i_peer_file;
...
};
struct address_space {
...
 struct list_head        i_peer_list;
...
}

A lista VMA para o arquivo permanece única (desduplicamos a memória) e lemos do disco com menos frequência (economizamos iops). Nosso "comum" está armazenado em SSD – um ganho adicional em velocidade.

Exemplo de cache de arquivo /bin/bash:

[root@pcs13 ~]# ls -li /vz/root/2388/bin/bash
524650 -rwxr-xr-x 1 root root 1021112 7 Out  2018 /vz/root/2388/bin/bash
[root@pcs13 ~]# pfcache dump /vz/root/2388 | grep 524650
8e3aa19fdc42e87659746f6dc8ea3af74ab30362 i:524650      g:1357611108  f:CP
[root@pcs13 ~]# sha1sum /vz/root/2388/bin/bash
8e3aa19fdc42e87659746f6dc8ea3af74ab30362  /vz/root/2388/bin/bash
[root@pcs13 \/]# getfattr -ntrusted.pfcache /vz/root/2388/bin/bash
# arquivo: vz/root/2388/bin/bash
trusted.pfcache="8e3aa19fdc42e87659746f6dc8ea3af74ab30362"
[root@pcs13 ~]# sha1sum /vz/pfcache/8e/3aa19fdc42e87659746f6dc8ea3af74ab30362
8e3aa19fdc42e87659746f6dc8ea3af74ab30362  /vz/pfcache/8e/3aa19fdc42e87659746f6dc8ea3af74ab30362

A eficiência do uso é calculada com um script pronto.

Este script percorre todos os containers no nó, calculando os arquivos em cache de cada container.

[root@pcs16 ~]# /pcs/distr/pfcache-examine.pl
...
O cache do Pfcache utiliza 831 MB de memória
O uso total de arquivos do pfcached nos containers é de 39837 MB de memória
Eficiência do Pfcache: 39006 MB

Dessa forma, economizamos cerca de 40 gigabytes de arquivos na memória dos containers, que serão carregados do cache.

Para que esse mecanismo funcione ainda melhor, é necessário ter VPSs "mais semelhantes" no nó. Por exemplo, aquelas para as quais o usuário não tem acesso root e onde um ambiente de uma imagem implantada está configurado.

Ajustes na operação do pfcache podem ser feitos através do arquivo de configuração
/etc/vz/pfcache.conf

MINSIZE, MAXSIZE – o tamanho mínimo/máximo de arquivo para cache
TIMEOUT – o tempo limite entre as tentativas de cache

Você pode consultar a lista completa de parâmetros no link.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster