托管提供商的目标之一是最大限度地利用现有设备,以便为最终用户提供高质量的服务。 终端服务器的资源始终是有限的,但托管客户端服务的数量(在我们的例子中我们讨论的是 VPS)可能会有很大差异。 了解如何爬上树并在切口下吃汉堡。
以客户根本感觉不到的方式压缩节点上的 VPS 极大有助于提高任何托管提供商的经济绩效。 当然,如果一个节点塞满了容器,那么它不应该在接缝处爆裂,并且所有客户端都会立即感受到负载的任何激增。
一个节点上可以托管多少个 VPS 取决于许多因素,例如:
1、节点本身硬件特点
2.VPS大小
3. VPS 负载的性质
4. 有助于优化密度的软件技术
在此,我们将分享我们在 Virtuozzo 中使用 Pfcache 技术的经验。
我们使用第 6 个分支,但上述所有内容也适用于第 7 个分支。
事实上它包括:
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 – 缓存尝试之间的超时时间