Aumento de la densidad de contenedores en un nodo utilizando la tecnología PFCACHE

Aumento de la densidad de contenedores en un nodo utilizando la tecnología PFCACHE

Uno de los objetivos del proveedor de hosting es maximizar la utilización del equipo existente para brindar un servicio de alta calidad a los usuarios finales. Los recursos de los servidores finales siempre son limitados, pero la cantidad de servicios de cliente alojados, y en nuestro caso estamos hablando de VPS, puede variar significativamente. Lea sobre cómo trepar a un árbol y comerse una hamburguesa debajo del corte.

Compactar VPS en un nodo de tal manera que los clientes no lo sientan en absoluto ayuda en gran medida a aumentar el rendimiento económico de cualquier proveedor de hosting. Por supuesto, un nodo no debe reventar por las costuras si está repleto de contenedores, y todos los clientes sienten inmediatamente cualquier aumento en la carga.

La cantidad de VPS que se pueden alojar en un nodo depende de muchos factores, tan obvios como:

1. Características del hardware del propio nodo
2. Tamaño del VPS
3. Naturaleza de la carga en el VPS
4. Tecnologías de software que ayudan a optimizar la densidad

En este caso, compartiremos nuestra experiencia en el uso de la tecnología Pfcache para Virtuozzo.
Usamos la sexta rama, pero todo lo dicho también es válido para la séptima.

pfcache – un mecanismo Virtuozzo que ayuda a deduplicar IOPS y RAM en contenedores, asignando archivos idénticos en contenedores a un área común separada.

De hecho consta de:
1. código núcleo
2. Demonio del espacio de usuario
3. Utilidades del espacio de usuario

Del lado del nodo, asignamos una sección completa en la que se crearán archivos que serán utilizados directamente por todos los VPS del nodo. En esta sección se monta un dispositivo blockploop. Luego, cuando se inicia el contenedor, recibe una referencia para esta sección:

[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
...

Aquí hay estadísticas aproximadas sobre la cantidad de archivos en uno de nuestros nodos:

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

El principio de pfcache es el siguiente:
• El demonio de espacio de usuario Pfcached escribe el hash sha-1 del archivo en el atributo xattr de este archivo. No se procesan todos los archivos, solo los de los directorios /usr, /bin, /usr/sbin, /sbin, /lib, /lib64

• Lo más probable es que los archivos de estos directorios sean “compartidos” y utilizados por varios contenedores;

• Pfcached recopila periódicamente estadísticas sobre la lectura de archivos del kernel, los analiza y agrega archivos al caché si se usan con frecuencia;

• Estos directorios pueden ser diferentes y están configurados en archivos de configuración.

• Al leer un archivo, se comprueba si contiene el hash especificado en los atributos extendidos de xattr. Si lo contiene, se abre el archivo “general” en lugar del archivo contenedor. Esta sustitución pasa desapercibida para el código contenedor y está oculta en el núcleo;

• Al escribir en un archivo, el hash se invalida. Por lo tanto, la próxima vez que lo abra, se abrirá el archivo contenedor y no su caché.

Al mantener los archivos compartidos de /vz/pfcache en el caché de la página, logramos ahorros en este caché en sí, así como ahorros en IOPS: en lugar de leer diez archivos del disco, leemos uno, que inmediatamente va al caché de la página.

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

La lista de VMA para el archivo permanece única (deduplicamos la memoria) y se lee del disco con menos frecuencia (ahorrando iops). Nuestro fondo común está ubicado en un SSD: una ganancia adicional de velocidad.

Ejemplo para almacenar en caché el archivo /bin/bash:

[root@pcs13 ~]# ls -li /vz/root/2388/bin/bash
524650 -rwxr-xr-x 1 root root 1021112 Oct  7  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
# file: vz/root/2388/bin/bash
trusted.pfcache="8e3aa19fdc42e87659746f6dc8ea3af74ab30362"
[root@pcs13 ~]# sha1sum /vz/pfcache/8e/3aa19fdc42e87659746f6dc8ea3af74ab30362
8e3aa19fdc42e87659746f6dc8ea3af74ab30362  /vz/pfcache/8e/3aa19fdc42e87659746f6dc8ea3af74ab30362

Calculamos la eficiencia de uso. guión listo.

Este script revisa todos los contenedores del nodo y calcula los archivos almacenados en caché de cada contenedor.

[root@pcs16 ~]# /pcs/distr/pfcache-examine.pl
...
Pfcache cache uses 831 MB of memory
Total use of pfcached files in containers is 39837 MB of memory
Pfcache effectiveness: 39006 MB

Así, de la memoria guardamos unos 40 gigabytes de archivos en contenedores, que se cargarán desde la memoria caché.

Para que este mecanismo funcione aún mejor, es necesario colocar el VPS más “idéntico” en el nodo. Por ejemplo, aquellos a los que el usuario no tiene acceso root y en los que está configurado el entorno a partir de la imagen implementada.

Puede ajustar pfcache a través del archivo de configuración
/etc/vz/pfcache.conf

MINSIZE, MAXSIZE: tamaño de archivo mínimo/máximo para almacenamiento en caché
TIEMPO DE ESPERA: tiempo de espera entre intentos de almacenamiento en caché

Puede ver la lista completa de parámetros. enlace.

Fuente: habr.com

Añadir un comentario