故障排除¶
慢或卡住的操作¶
如果遇到了明显的卡顿操作,首先要定位问题源头:是客户端、 MDS 、抑或是连接二者的网络。从存在卡顿操作的地方下手(参考下面的 慢请求( MDS 端) ),进而缩小范围。
MDS 问题¶
如果某个操作卡在了 MDS 内部,类似 “slow requests are blocked”
的消息最终会出现在 ceph health
里,也可能指出是客户端的问题,如 “failing to respond” 或其它形式的异常行为。如果 MDS 认定某些客户端的行为异常,你应该弄明白起因。常见起因有:
系统过载(如果你还有空闲内存,增大
mds cache size
配置试试,默认才 100000 。活跃文件比较多,超过 MDS 缓存容量是此问题的首要起因!)客户端比较老(行为异常),或者
底层的 RADOS 问题。
除此之外,你也许遇到了新的软件缺陷,应该报告给开发者!
慢请求( MDS 端)¶
通过管理套接字,你可以罗列当前正在运行的操作:
ceph daemon mds.<name> dump_ops_in_flight
在 MDS 主机上执行。找出卡住的命令、并调查卡住的原因。通常最后一个“事件”( event )尝试过收集锁、或者把这个操作发往 MDS 日志。如果它是在等待 OSD ,修正即可;如果操作都卡在了某个索引节点上,原因可能是一个客户端一直占着能力,别人就没法拿到,也可能是这个客户端想刷回脏数据,还可能是你遇到了 CephFS 分布式文件锁的代码(文件能力子系统、 capabilities 、 caps )缺陷。
如果起因是能力代码的缺陷,重启 MDS 也许能解决此问题。
如果 MDS 上没发现慢请求,而且也没报告客户端行为异常,那问题就可能在客户端上、或者它的请求还没到 MDS 上。
ceph-fuse 的调试¶
ceph-fuse 也支持 dump_ops_in_flight 命令,可以查看是否卡住、卡在哪里了。
调试输出¶
要想看到 ceph-fuse 的更多调试信息,试试在前台运行,让日志输出到控制台( -d
)、打开客户端调试( --debug-client=20
)、打印发送过的所有消息( --debug-ms=1
)。
如果你怀疑是监视器的问题,也可以打开监视器调试开关(
--debug-monc=20
)。
内核挂载的调试¶
慢请求¶
遗憾的是内核客户端不支持管理套接字,可是如果你的内核启用了(如果限制过) debugfs ,那么它就有相似的接口了。
sys/kernel/debug/ceph/
路径下有一个文件夹(其名字形如
28f7427e-5558-4ffd-ae1a-51ec3042759a.client25386880
),而且其内包含很多文件,用 cat
命令查看它们的内容时会看到有趣的输出。这些文件描述如下,最有助于调试慢请求问题的文件可能是
mdsc
和 osdc
。
bdi: 关于 Ceph 系统的 BDI 信息(脏块、已写入的等等)
caps: 文件的 caps 数据结构计数,包括内存中的和用过的
client_options: 倒出挂载 CephFS 时所用的选项
dentry_lru: 倒出当前内存中的 CephFS dentry
mdsc: 倒出当前发给 MDS 的请求
mdsmap: 倒出当前的 MDSMap 时间结和所有 MDS
mds_sessions: 倒出当前与 MDS 建立的会话
monc: 倒出当前从监视器获取的各种映射图,以及其它“订阅”信息
monmap: 倒出当前的监视器图和所有监视器
osdc: 倒出当前发往 OSD 的操作(即文件数据的 IO )
osdmap: 倒出当前的 OSDMap 时间结、存储池、所有 OSD
如果没有卡住的请求,却有毫无进展的文件 IO ,问题也许是……
断线后又重新挂载的文件系统¶
因为 CephFS 有个“一致性缓存”,如果你的网络连接中断时间较长,客户端就会被系统强制断开,此时,内核客户端仍然傻站着( in a bind ):它不能安全地写回脏数据,另外很多应用程序在 close() 时不能正确处理 IO 错误。这个时候,内核客户端会重新挂载这个文件系统,但是先前的文件系统 IO 也许能完成、也许不能,这些情况下,你也许得重启客户端系统。
如果 dmesg 或者 kern.log 里出现了类似消息,说明你遇到的就是这种情况:
Jul 20 08:14:38 teuthology kernel: [3677601.123718] ceph: mds0 closed our session
Jul 20 08:14:38 teuthology kernel: [3677601.128019] ceph: mds0 reconnect start
Jul 20 08:14:39 teuthology kernel: [3677602.093378] ceph: mds0 reconnect denied
Jul 20 08:14:39 teuthology kernel: [3677602.098525] ceph: dropping dirty+flushing Fw state for ffff8802dc150518 1099935956631
Jul 20 08:14:39 teuthology kernel: [3677602.107145] ceph: dropping dirty+flushing Fw state for ffff8801008e8518 1099935946707
Jul 20 08:14:39 teuthology kernel: [3677602.196747] libceph: mds0 172.21.5.114:6812 socket closed (con state OPEN)
Jul 20 08:14:40 teuthology kernel: [3677603.126214] libceph: mds0 172.21.5.114:6812 connection reset
Jul 20 08:14:40 teuthology kernel: [3677603.132176] libceph: reset on mds0
这是正在改善的领域,内核将很快能够可靠地向正在进行的 IO 发送错误代码,即便你的应用程序不能良好地应对这些情况。长远来看,在不违背 POSIX 语义的情况下,我们希望可以重连和回收数据(通常是其它客户端尚未访问、或修改的数据)。