锁定服务器:每次获取写锁时,都会锁定所有 64 个保护分片并扫描整个保护表,因此拥有剩余保护的节点会陷入一个无法离开的锁定队列。
作者: stevapple创建于 2026年9月17日更新于 2026年9月17日
标签S-confirming
描述错误
在追踪 #7962 (一个节点的锁端点响应慢于 3 秒的锁 RPC 截止时间数小时) 过程中,我们在服务器端找到了原因。这不是磁盘,也不是一个删除集:/mnt/rustfs11 是每个节点锁端点的名称。init_lock_clients 通过 host_port() 使用简单的 insert 来去重端点,因此每个主机保留了其最后一个端点,该 URL 将主机的单个 RemoteClient 进行命名,每个节点都从一个 LocalClient 提供所有内容 — 每个节点有一个守护表。#7962 中的"慢端点"(以及之前的 #7363) 是 node3 的整个锁服务器。原因是该服务器的获取路径。每个 LocalClient::acquire_lock 首先调用 reclaim_expired_guards_for_resource,而 extract_expired_guards 通过依次获取 所有 64 个守护分片的写锁 并扫描每个条目来实现这一点(守护被 整个锁 ID 分片,跨 64 个分片,因此一个资源的守护可以位于任何位置)。争用获取重试路径 再次扫描。因此,在节点上每次获取都在 64 个排他异步锁后进行序列化,其成本与守护表的大小成正比。
内容来源: rustfs/rustfs