本页面介绍在使用 Filestore 时遇到问题的情况下可能会有帮助的问题排查步骤。
性能下降
- 确保您的客户端虚拟机使用的是推荐的机器类型。
如果您的客户端虚拟机运行的是 Linux,请确认您使用的是默认装载选项。
确保客户端虚拟机与 Filestore 实例位于同一地区。跨地区装载不仅会降低性能,还会导致产生网络费用。
请确保您的 Filestore 实例没有达到或接近容量上限。当容量接近上限时,任何剩余的空间都会被高度碎片化,导致读取和写入操作的速度变慢。避免此状况所需要的可用空间量取决于实际情况。我们建议您设置“磁盘空间不足”提醒。
使用
fio
工具测试 Filestore 实例的性能。如果测试结果显示异常的性能下降,请联系您的客户代表。如果测试结果显示性能等于或高于预期,请继续查看下一部分。
导致性能下降的用例
以下是一些导致性能不佳的用例和场景:
涉及大量小文件的工作负载
Filestore 文件共享使用 sync
导出选项来确保数据安全和 NFS 协议合规性。对于大多数数据修改操作,Filestore 实例会等待数据提交到存储,然后再回复来自客户端虚拟机的请求。如果操作中涉及许多文件,客户端会执行一长串同步操作,从而导致累计延迟时间增加。
此场景的一个示例是,解压缩文件共享上的归档文件(如 tar 文件)。在解压缩包含多个文件的归档文件时,TAR 会连续执行多个同步操作。因此,性能会降低。
如果您要将许多小文件复制到一个文件共享,请尝试使用 gsutil
等工具并行创建文件:
mkdir -p /mnt/nfs/many_files_rsync/
time gsutil -m -q rsync -rp many_files /mnt/nfs/many_files_rsync/
在 Cloud Storage 和 Filestore 之间复制数据
- 我们知道使用
gsutil
将数据从 Cloud Storage 复制到 Filestore 实例的速度很慢。如需详细了解如何提升性能,请参阅提升 Google Cloud 资源的性能。
装载和卸载文件共享的延迟时间
使用默认装载选项装载文件共享时,装载命令会尝试发现 Filestore 实例支持的传输方法,从而造成三秒的延迟。
mountd
守护程序会首先尝试使用 Filestore 不支持的 UDP。一旦初始尝试超时,就会回退到 TCP。要绕过此发现过程并消除增加的延迟时间,您可以指定 tcp
装载选项,例如:
sudo mount -o tcp 10.0.0.2:/vol1 /mnt/nfs
如果您使用 autofs
自动装载,则此装载选项尤为重要。
Filestore 无响应
Filestore 实例不响应 ping
或 traceroute
请求
Filestore 实例不响应 ping
或 traceroute
请求,因为 Filestore 不允许使用 ICMP。
如需测试与 Filestore 实例的连接,您可以通过客户端运行 showmount
:
sudo showmount -e filestore-ip
Filestore 实例使用其导出的文件系统进行响应,例如:
Export list for 10.139.19.98:
/vol1 192.168.0.0/16,172.16.0.0/12,10.0.0.0/8
您还可以通过运行以下命令来检查客户端是否可以访问 Filestore 的 RPC 信息:
sudo rpcinfo -p <filestore-ip>
响应如下所示:
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 2046 status
100024 1 tcp 2046 status
100003 3 tcp 2049 nfs
100227 3 tcp 2049
100021 1 udp 4045 nlockmgr
100021 3 udp 4045 nlockmgr
100021 4 udp 4045 nlockmgr
100021 1 tcp 4045 nlockmgr
100021 3 tcp 4045 nlockmgr
100021 4 tcp 4045 nlockmgr
100005 3 udp 2050 mountd
100005 3 tcp 2050 mountd
计划性维护
一段时间后,Filestore 会在几分钟内无响应,然后由于计划性维护事件而再次做出响应。如需了解 Filestore 的服务等级协议 (SLA),请参阅服务等级协议 (SLA) 页面。
Filestore 不支持客户定义的维护期。客户也无法使用 Filestore 的维护期安排功能。
实例在仍装载到客户端的情况下被删除
如果文件操作或 unix 命令(如 df
、ls
或任何读/写操作)停止响应,则 Filestore 实例可能在仍装载到客户端的情况下被删除。
检查实例是否仍然存在:
gcloud filestore instances list
如果该实例不再列出,您可以使用与被删除实例相同的 IP 地址和文件共享名称创建新实例,从而恢复控制。创建实例后,无响应的操作会退出并报错。如果您不需要 Filestore 实例,则可以卸载文件共享并将其删除。
为防止将来再发生类似情况,在删除 Filestore 实例之前,请务必先将其卸载。
实例显示 REPAIRING
状态
Filestore 实例因用户无法控制的内部原因而处于运行状况不佳的状态,并且正在自动修复自身。在此期间,实例不可用,您无需执行任何进一步操作。
容量问题
“设备上已没有剩余空间”
通过在客户端虚拟机上运行以下命令来检查 Filestore 实例是否有足够的 inode:
df -i
该命令会返回类似于以下的内容:
Filesystem Inodes IUsed IFree IUse% Mounted on
10.0.0.2:/vol1 134217728 13 134217715 1% /mnt/test
存储在文件共享上的每个文件都消耗一个 inode。如果 IUse%
达到 100%,则即使您尚未达到最大分配容量,也无法在文件共享上存储更多文件。inode 的数量会随容量扩缩。如果您想添加更多 inode,则必须增加更多容量。
企业级和大规模 SSD 层级实例的最大容量用量约为预配容量的 89%。剩余容量已预留供内部操作和资源使用。如需了解详情,请参阅已知问题。
“df”和“du”命令报告的不同可用磁盘空间量
当由正在运行的进程打开的文件被删除时,关闭该文件之后,它占用的磁盘空间才会释放。df
命令会计入已删除的打开文件占用的空间,而 du
命令则不会。计算上的差异是 du
命令所显示的可用空间通常多于 df
的原因。
如需显示由仍在运行进程打开的已删除文件,请运行以下命令:
lsof | grep deleted
无法创建实例
创建 Filestore 实例时提示 PERMISSION DENIED
检查 Filestore API 是否已启用:
gcloud services enable file.googleapis.com
每个 Filestore 实例都必须具有与之关联的 IP 地址范围,并且该范围不得与使用中的另一个范围重叠。如需查看详细的限制列表,请参阅配置预留的 IP 地址范围。
检查您是否具有
roles/file.editor
角色。如需了解详情,请参阅 IAM 角色和权限。如果仍然遇到该错误,则可能是 Filestore 服务帐号移除了
file.serviceAgent
角色。要检查是否存在这种情况,请运行以下命令:gcloud projects get-iam-policy project-id-or-number \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:service-project-number@cloud-filer.iam.gserviceaccount.com"
其中:
- project-id-or-number 是您的 Google Cloud 项目的 ID 或编号。
- project-number 是您的 Google Cloud 项目的编号。
该命令应返回如下所示的内容:
ROLE roles/file.serviceAgent
如果未列出
roles/file.serviceAgent
,您可以通过运行以下命令将其恢复:gcloud projects add-iam-policy-binding project-id-or-number \ --member serviceAccount:service-project-number@cloud-filer.iam.gserviceaccount.com \ --role roles/file.serviceAgent
创建实例时的 System limit for internal resources has been reached
错误
此错误是 Filestore 达到内部网络配额引起的。对于您在其中创建 Filestore 实例的每个 VPC 网络,Filestore 必须创建一个与该网络建立对等互连的内部网络。即使 Filestore 实例和与其关联的 VPC 网络被删除,这些内部网络也会保留。
当一个项目的内部网络数量达到 49 后,Filestore 将无法再创建新的内部网络,从而导致无法在新 VPC 网络中创建 Filestore 实例。如果您尝试创建,则会导致以下错误之一:
System limit for internal resources has been reached. Please request to adjust limit here: https://forms.gle/PFPJ2QD4KnCHzYEx9
您可以通过停用然后重新启用 Filestore API 来清除内部网络:
gcloud services disable file.googleapis.com
gcloud services enable file.googleapis.com
如果由于无法删除 Filestore 实例或者您不希望丢失通过配额增加请求授予的配额,而无法停用 API,则可以填写以下表格,调整网络限制:
https://forms.gle/PFPJ2QD4KnCHzYEx9
如果您需要定期删除和创建 VPC 网络和 Filestore 实例,您可以通过以下两种方式避免用尽网络配额:
创建 VPC 网络时,使用与您之前创建 Filestore 实例所用网络相同的名称。
在一个不超过 49 个 VPC 网络的池中进行循环切换,而不是删除然后重新创建 VPC 网络。
无法装载文件共享
我的虚拟机或 GKE pod 无法访问 Filestore
运行以下命令,确认 Filestore 实例是否可访问(不支持 ping
和 traceroute
):
sudo showmount -e <filestore-ip>
该命令应该会以含有已导出文件系统的列表响应。然后通过运行以下命令来检查客户端是否可以访问 Filestore 的 RPC 信息:
sudo rpcinfo -p <filestore-ip>
如果无法访问 Filestore 实例,则常见原因包括未正确配置的网络设置或 ACL 设置,或者您正在尝试装载错误的实例。
- 检查是否启用了基于 IP 的访问权限控制,并检查客户端的 IP 地址是否受到限制。如需了解详情,请点击此处。
- 检查您的防火墙设置以确保所需的端口已打开。如需了解详情,请参阅配置防火墙规则。
- 如果您尝试通过 GKE 集群访问 Filestore,并且收到错误
mount.nfs: access denied by server while mounting ...
,请参阅无法从 GKE 集群访问文件共享。
尝试装载文件共享时权限遭拒
确认是否列出了该实例的任何 NFS 导出选项:
gcloud filestore instances describe instance-id \
--zone=zone
其中:
- instance-id 是 Filestore 的实例 ID。
- zone 是 Filestore 实例所在的区域。
该命令会返回类似如下的内容:
createTime: '2019-10-11T17:28:23.340943077Z' fileShares: - capacityGb: '1024' name: vol1 nfsExportOptions: - accessMode: READ_WRITE ipRanges: - 128.0.0.0/29 squashMode: NO_ROOT_SQUASH name: projects/yourproject/locations/us-central1-c/instances/nfs-server networks: - ipAddresses: - 10.0.0.2 modes: - MODE_IPV4 network: default reservedIpRange: 10.0.0.0/29 state: READY tier: BASIC_HDD
如果您发现列出了 nfsExportOptions
,请检查客户端的 IP 地址是否在预期的 accessMode
的 ipRanges
下列出的范围内。如果不是,您必须修改 NFS 导出选项。
无法将文件共享装载到 App Engine
Filestore 不支持 App Engine。
无法从 GKE 集群装载文件共享
您无法直接将 Filestore 文件共享装载到 GKE 集群。您必须配置 PV 和 PVC。
无法从 GKE 集群访问文件共享
如需详细了解与 Kubernetes 或 Google Kubernetes Engine 相关的问题排查信息,您还可以参阅官方的 Kubernetes 问题排查指南和 GKE 问题排查指南。
错误:输出:mount.nfs:装载 x.x.x.x:/file-share-name 时服务器拒绝访问
确保 PV spec.nfs.path
和 spec.nfs.server
的值分别与文件共享的名称和 Filestore 实例的 IP 地址匹配。
示例:
如果您的文件共享名为 vol1
且 Filestore 实例的 IP 地址为 10.0.0.2
,则 PV spec.nfs.path
和 spec.nfs.server
必须与这些值匹配:
apiVersion: v1
kind: PersistentVolume
metadata:
name: fileserver
spec:
capacity:
storage: 2T
accessModes:
- ReadWriteMany
nfs:
path: /vol1
server: 10.0.0.2
无法停用 Filestore API
删除所有 Filestore 相关资源,例如 Filestore 实例和备份。在部署 Filestore 实例时,不能停用 Filestore API。
错误:Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges.
如果给定的专用连接用尽了您分配的 IP 地址空间,则 Google Cloud 会返回以下错误:Failed to create subnetwork.
Couldn't find free blocks in allocated IP ranges.
如需详细了解如何解决此问题,请参阅 IP 地址范围用尽。