1. 问题背景
1.1 客户端缓存问题
$ ceph -s
health HEALTH_WARN
mds0: Client xxx-online00.gz01 failing to respond to cache pressure
官方解释
消息: “Client name failing to respond to cache pressure”
代码: MDS_HEALTH_CLIENT_RECALL, MDS_HEALTH_CLIENT_RECALL_MANY
描述:
客户端有各自的元数据缓存,客户端缓存中的条目(比如索引节点)也会存在于 MDS 缓存中,所以当 MDS 需要削减其缓存时(保持在 mds_cache_size 以下),它也会发消息给客户端让它们削减自己的缓存。如果有客户端没响应或者有缺陷,就会妨碍 MDS 将缓存保持在 mds_cache_size 以下, MDS 就有可能耗尽内存而后崩溃。如果某个客户端的响应时间超过了 mds_recall_state_timeout (默认为 60s ),这条消息就会出现。
1.2 服务端内存不释放
同上参考1.1 客户端缓存问题
1.3 mds session的inode过多
客户端session的inode太多,导致内存很高,从而也导致主从mds切换加载inode慢,严重影响服务的可用性。
1.4 mds夯住问题或慢查询
- 客户端搜索遍历查找文件(不可控)
- session的 inode太大导致mds负载过高
- 日志级别开的太大,从而导致mds负载高
2. 分析思路
上面的几个问题都是有一定的联系,互相影响的。所以,我们先从已知的方向逐步深入分析问题,从而优化解决问题。
2.1 组件通信流程图
- Client <–> MDS
元数据操作和capalities - Client <–> OSD
数据IO - Client <–> Monitor
认证,集群map信息等 - MDS <–> Monitor
心跳,集群map信息等 - MDS <–> OSD
元数据IO - Monitor <–> OSD
心跳,集群map信息等
2.2 查看客户端session
$ ceph --admin-daemon /var/run/ceph/ceph-mds.ceph-xxxx-osd02.py.asok session ls
[
{
"id": 5122511,
"num_leases": 0,
"num_caps": 655,
"state": "open",
"replay_requests": 0,
"completed_requests": 1,
"reconnecting": false,
"inst": "client.5122511 192.168.1.2:0\/2026289820",
"client_metadata": {
"ceph_sha1": "b1e0532418e4631af01acbc0cedd426f1905f4af",
"ceph_version": "ceph version 0.94.10 (b1e0532418e4631af01acbc0cedd426f1905f4af)",
"entity_id": "log_xxx_cephfs",
"hostname": "ceph-test-osd02",
"mount_point": "\/mnt\/log"
}
}
]
说明:
- id:client唯一id
- num_caps:client获取的caps
- inst:client端的ip和端口链接信息
- ceph_version:client端的ceph-fuse版本,若使用kernel client,则为kernel_version
- hostname:client端的主机名
- mount_point:client在主机上对应的mount point
- pid:client端ceph-fuse进程的pid
2.3 查看客户端的inode数量
跟踪代码发现session里面的num_caps就是统计的客户端的inode数量, 大概统计了下已经打开的inode数量在400w左右。
总结:
可以查看客户端的session信息,包含host、mount、inode等信息