本页将指导您配置 Parallelstore 环境,以获得最佳性能。
一般建议
从
ls
中移除了所有别名,以提高默认性能。 在许多系统上,它会别名为ls -color=auto
,在默认的 Parallelstore 配置下,速度会慢得多。如果列表操作的性能较慢,请考虑为 dfuse 挂载启用缓存。
拦截库
libioil
库可用于提高使用 libc 的应用对 DFuse 执行读写操作的性能。该库通过拦截应用中的 POSIX 读取和写入调用来绕过内核,以便直接在用户空间中处理这些调用。如需了解详情,请参阅拦截库。
在大多数情况下,我们建议按进程或按应用调用使用拦截库。
您可能不想或不需要使用拦截库的情况包括:
- 只有使用 libc 构建的应用才能使用拦截库。
- 如果您的工作负载可以从缓存中受益(例如重复访问相同的文件),我们建议您不要使用拦截库。
- 如果您的工作负载需要大量元数据(例如处理许多小文件或非常大的目录列表),拦截库可能无法提升性能。
您可以在 shell 环境中将 LD_PRELOAD
调用设置为环境变量,但这样做有时可能会导致问题。我们建议您改为在每个命令中指定该参数。
或者,您也可以在编译时使用 -lioil
标志将拦截库链接到应用中。
dfuse
缓存
dfuse
中默认启用缓存。
dfuse
在挂载 Parallelstore 实例时使用两个与缓存相关的标志:
--disable-wb-cache
使用写穿而不是回写缓存。--disable-caching
会停用所有缓存。
以下建议适用于缓存和性能:
- 如果您使用的是拦截库,系统会绕过回写缓存。我们建议您在使用拦截库时指定
--disable-wb-cache
。 - 如果您的工作负载涉及一次读取多个文件,您应停用缓存。
- 对于涉及许多客户端修改文件且更新需要立即提供给其他客户端的工作负载,您必须停用缓存。
- 如果您的工作负载会反复读取相同的文件,缓存可以提高性能。如果文件可以放入客户端的内存中,这种情况尤其如此。
dfuse
使用 Linux 页面缓存进行缓存。 对于由对大型文件进行的小型 I/O 组成的工作负载,除了启用缓存之外,增加延迟读取可能也有益。如需增加延迟读取,请在
dfuse
挂载后运行以下命令:echo 4096 > /sys/class/bdi/\$(mountpoint -d /mnt)/read_ahead_kb echo 100 > /sys/class/bdi/\$(mountpoint -d /mnt)/max_ratio
如果您的工作负载涉及上述场景的混合,您可以将同一 Parallelstore 实例挂载到具有不同缓存设置的多个挂载点。
线程数和事件队列数
挂载 Parallelstore 实例时,我们建议为 --thread-count
和 --eq-count
使用以下值:
- 线程数值不得超过 vCPU 核心数。
- 建议的线程数上限介于 16 到 20 之间。超过此数量后,无论可用核心数量如何,性能优势都很小或没有。
- 事件队列值应为线程数值的一半。
如果您的工作负载涉及大量小文件操作和大量元数据访问,您可以尝试将这些值增加到高于这些建议的水平。
文件条带设置
文件条带化是一种数据存储技术,它会将文件划分为多个块(或条带),并分布在多个存储目标上。文件分块可以允许对实例背后的多个存储目标进行并行读写,从而提高性能。
创建 Parallelstore 实例时,您可以指定以下三种文件剥离设置之一:
- 下限
- 平衡
- 最大值
这些设置可能会对 Parallelstore 性能产生重大影响。对于大多数工作负载,我们建议采用平衡设置,这对于大多数工作负载来说应该是一个合理的折衷方案。如果平衡设置的性能不符合要求,请执行以下操作:
最小设置可能会提高包含大量小文件的工作负载的性能,尤其是当平均文件大小小于 256KB 时。
最大设置可能会提高包含非常大文件(通常大于 8GB)的工作负载的性能,尤其是当许多客户端共享对同一文件的访问权限时。
对于高级调整,daos
工具提供按文件或按目录的设置。尝试进行高级调整会带来与性能相关的风险,通常不建议这样做。如需了解详情,请参阅了解 DAOS 中的数据冗余和分片。
目录剥离设置
创建 Parallelstore 实例时,您可以指定以下三种目录剥离设置之一:
- 下限
- 平衡
- 最大值
对于大多数工作负载,我们建议使用最大设置。
对于涉及大量大型目录列表的工作负载,平衡或最低设置可以带来更好的列表性能。不过,其他操作(尤其是文件创建)的性能可能会受到影响。
多用户
使用 dfuse
工具挂载 Parallelstore 实例时,我们建议您指定 --multi-user
标志。此标志会告知内核将文件系统提供给客户端上的所有用户,而不是仅提供给运行 DFuse 进程的用户。然后,DFuse 看起来就像一个通用的多用户文件系统,并且启用了标准的 chown
和 chgrp
调用。与 POSIX 文件系统中的常规情况一样,所有文件系统条目均归创建它们的用户所有,
指定 --multi-user
标志时,您还必须添加以下代码行,以便以 root 身份更新 /etc/fuse.conf
:
user_allow_other
将实例挂载为多用户似乎不会影响性能。
擦除编码设置
擦除编码设置为 2+1。此设置无法更改。系统会拒绝不使用 EC2+1 的任何 I/O。
Google Kubernetes Engine 边车容器资源分配
在大多数情况下,Google Kubernetes Engine 和 Parallelstore 的性能不佳是由于为 Parallelstore 边车容器分配的 CPU 或内存不足所致。如需正确分配资源,请考虑以下建议:
阅读为 Sidecar 容器配置资源中突出显示的注意事项。您将了解为何可能需要增加资源分配,以及如何使用 Pod 注解配置边车容器资源分配。
您可以使用值
0
关闭 Standard 集群上的任何资源限制或请求。例如,通过设置gke-parallelstore/cpu-limit: 0
和gke-parallelstore/memory-limit: 0
,边车容器的 CPU 和内存限制将为空,并使用默认请求。如果您不知道 dfuse 为支持您的工作负载而需要多少资源,并且希望它使用节点上的所有可用资源,此设置会非常有用。根据工作负载指标确定 dfuse 需要多少资源后,您可以设置适当的限制。在 Autopilot 集群上,您无法使用值
0
取消设置边车容器资源限制和请求。您必须为 Autopilot 集群上的边车容器显式设置更大的资源限制,并依赖于指标来确定是否需要增加资源限制。 Google Cloud