使用 PFCACHE 技术增加节点上的容器密度

使用 PFCACHE 技术增加节点上的容器密度

托管提供商的目标之一是最大限度地利用现有设备,以便为最终用户提供高质量的服务。 终端服务器的资源始终是有限的,但托管客户端服务的数量(在我们的例子中我们讨论的是 VPS)可能会有很大差异。 了解如何爬上树并在切口下吃汉堡。

以客户根本感觉不到的方式压缩节点上的 VPS 极大有助于提高任何托管提供商的经济绩效。 当然,如果一个节点塞满了容器,那么它不应该在接缝处爆裂,并且所有客户端都会立即感受到负载的任何激增。

一个节点上可以托管多少个 VPS 取决于许多因素,例如:

1、节点本身硬件特点
2.VPS大小
3. VPS 负载的性质
4. 有助于优化密度的软件技术

在此,我们将分享我们在 Virtuozzo 中使用 Pfcache 技术的经验。
我们使用第 6 个分支,但上述所有内容也适用于第 7 个分支。

高速缓存 – Virtuozzo 机制,有助于消除容器中重复的 IOPS 和 RAM,将容器中的相同文件分配到单独的公共区域。

事实上它包括:
1. 内核代码
2. 用户空间恶魔
3. 用户空间实用程序

在节点端,我们分配一个完整的部分,其中将创建文件,这些文件将直接由节点上的所有 VPS 使用。 该部分安装了块 ploop 装置。 然后,当容器启动时,它会收到此部分的引用:

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

以下是我们节点之一上文件数量的近似统计数据:

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

pfcache的原理如下:
• 用户空间守护程序Pfcached 将文件的sha-1 哈希写入该文件的xattr 属性。 并非所有文件都被处理,但仅处理 /usr、/bin、/usr/sbin、/sbin、/lib、/lib64 目录中的文件

• 这些目录中的文件很可能会被“共享”并被多个容器使用;

• Pfcached 定期收集从内核读取文件的统计信息并进行分析,如果文件经常使用,则将其添加到缓存中;

• 这些目录可能不同,并且在配置文件中进行配置。

• 读取文件时,检查其xattr 扩展属性中是否包含指定的散列。 如果包含,则打开“常规”文件而不是容器文件。 这种替换不会被容器代码注意到,并且隐藏在内核中;

• 写入文件时,哈希值将失效。 因此,下次打开它时,将打开容器文件本身,而不是其缓存。

通过将 /vz/pfcache 中的共享文件保留在页面缓存中,我们可以节省该缓存本身,并节省 IOPS。我们不是从磁盘读取 XNUMX 个文件,而是读取一个文件,该文件会立即进入页面缓存。

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

文件的 VMA 列表保持单个(我们删除重复内存)并且从磁盘读取的频率较低(节省 iops)。 我们的共同基金位于 SSD 上 - 速度得到了额外的提升。

缓存 /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

我们计算使用效率 现成的脚本.

该脚本会遍历节点上的所有容器,计算每个容器的缓存文件。

[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

因此,我们在容器中保存了大约 40 GB 的内存文件;它们将从缓存中加载。

为了使该机制更好地发挥作用,需要在节点上放置最“相同”的 VPS。 例如,用户没有 root 访问权限并且配置了部署映像中的环境的用户。

您可以通过配置文件调整pfcache
/etc/vz/pfcache.conf

MINSIZE、MAXSIZE – 缓存的最小/最大文件大小
TIMEOUT – 缓存尝试之间的超时时间

您可以查看完整的参数列表 链接.

来源: habr.com

添加评论