问题排查

本页面介绍在使用 Filestore 时遇到问题的情况下可能会有帮助的问题排查步骤。

性能下降

  1. 确保您的客户端虚拟机使用的是推荐的机器类型
  2. 如果您的客户端虚拟机运行的是 Linux,请确认您使用的是默认装载选项

  3. 确保客户端虚拟机与 Filestore 实例位于同一地区。跨地区装载不仅会降低性能,还会导致产生网络费用

  4. 请确保您的 Filestore 实例没有达到或接近容量上限。当容量接近上限时,任何剩余的空间都会被高度碎片化,导致读取和写入操作的速度变慢。避免此状况所需要的可用空间量取决于实际情况。我们建议您设置“磁盘空间不足”提醒

  5. 使用 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 实例的速度较为缓慢。没有已知的缓解措施。

装载和卸载文件共享的延迟时间

使用默认装载选项装载文件共享时,装载命令会尝试发现 Filestore 实例支持的传输方法,这会造成 3 秒的延迟。

mountd 守护程序会首先尝试使用 Filestore 不支持的 UDP。一旦初始尝试超时,就会回退到 TCP。要绕过此发现过程并消除增加的延迟时间,您可以指定 tcp 装载选项,例如:

sudo mount -o tcp 10.0.0.2:/vol1 /mnt/nfs

如果您使用 autofs 自动装载,则此装载选项尤为重要。

Filestore 无响应

Filestore 实例不响应 pingtraceroute 请求

Filestore 实例不响应 pingtraceroute 请求,因为 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 命令(如 dfls 或任何读/写操作)停止响应,则 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,则必须增加更多容量。

“df”和“du”命令报告的不同可用磁盘空间量

当由正在运行的进程打开的文件被删除时,关闭该文件之后,它占用的磁盘空间才会释放。df 命令会计入已删除的打开文件占用的空间,而 du 命令则不会。计算上的差异是 du 命令所显示的可用空间通常多于 df 的原因。

如需显示由仍在运行进程打开的已删除文件,请运行以下命令:

lsof | grep deleted

无法创建实例

创建 Filestore 实例时提示 PERMISSION DENIED

  1. 检查 Filestore API 是否已启用:

    gcloud services enable file.googleapis.com
    
  2. 检查您是否具有 roles/file.editor 角色。如需了解详情,请参阅 IAM 角色和权限

  3. 如果仍然遇到该错误,则可能是 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
    

创建实例时收到错误代码 13

有多个原因可能导致实例创建期间出现错误代码 13 错误,但最常见的原因是 Filestore 已用尽内部网络配额。

对于您在其中创建 Filestore 实例的每个 VPC 网络,Filestore 必须创建一个与该网络建立对等互连的内部网络。即使 Filestore 实例和与其关联的 VPC 网络被删除,这些内部网络也会保留。

当一个项目的内部网络数量达到 49 后,Filestore 将无法再创建新的内部网络,从而导致无法在新 VPC 网络中创建 Filestore 实例。如果您尝试创建,则会导致错误:

Error code 13, message: an internal error has occurred

清除内部网络的唯一方法是停用然后重新启用 Filestore API。您必须先删除所有 Filestore 相关资源(例如 Filestore 实例和备份),然后才能停用 API。

gcloud services disable file.googleapis.com

gcloud services enable file.googleapis.com

如果由于需要且无法删除 Filestore 实例而无法停用 API,则必须与客户代表联系,以手动清除对等互连网络。

如果您需要定期删除和创建 VPC 网络和 Filestore 实例,您可以通过以下两种方式避免用尽网络配额:

  • 创建 VPC 网络时,使用与您之前创建 Filestore 实例所用网络相同的名称。

  • 在一个不超过 49 个 VPC 网络的池中进行循环切换,而不是删除然后重新创建 VPC 网络。

无法装载文件共享

我的虚拟机或 GKE pod 无法访问 Filestore

运行以下命令,确认 Filestore 实例是否可访问(不支持 pingtraceroute):

sudo showmount -e <filestore-ip>

该命令应该会以含有已导出文件系统的列表响应。然后通过运行以下命令来检查客户端是否可以访问 Filestore 的 RPC 信息:

sudo rpcinfo -p <filestore-ip>

如果无法访问 Filestore 实例,则常见原因包括未正确配置的网络设置或 ACL 设置,或者您正在尝试装载错误的实例。

  1. 检查是否启用了基于 IP 的访问权限控制,并检查客户端的 IP 地址是否受到限制。如需了解详情,请点击此处
  2. 检查您的防火墙设置以确保所需的端口已打开。如需了解详情,请参阅配置防火墙规则
  3. 如果您尝试通过 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 地址是否在预期的 accessModeipRanges 下列出的范围内。如果不是,您必须修改 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.pathspec.nfs.server 的值分别与文件共享的名称和 Filestore 实例的 IP 地址匹配。

示例

如果您的文件共享名为 vol1 且 Filestore 实例的 IP 地址为 10.0.0.2,则 PV spec.nfs.pathspec.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 地址范围用尽