最近公司的生產(chǎn)環(huán)境已經(jīng)開(kāi)始使用 CephFS 作為文件系統(tǒng)存儲(chǔ)攘乒,記錄一下使用過(guò)程中遇到的問(wèn)題啄清,已經(jīng)一些常用的命令拄轻。
1. 常用命令
1.1 ceph daemon mds.xxx help
ceph daemon 是一個(gè)很常用的命令遗嗽,可以用來(lái)查看 Ceph 的各個(gè)守護(hù)進(jìn)程的狀態(tài)宪祥,這個(gè) help 命令可以看到 MDS daemon 都支持哪些子命令:
$ sudo ceph daemon mds.cephfs-master1 help
{
"cache status": "show cache status",
"config diff": "dump diff of current config and default config",
"config diff get": "dump diff get <field>: dump diff of current and default config setting <field>",
"config get": "config get <field>: get the config value",
"config help": "get config setting schema and descriptions",
"config set": "config set <field> <val> [<val> ...]: set a config variable",
"config show": "dump current config settings",
"dirfrag ls": "List fragments in directory",
"dirfrag merge": "De-fragment directory by path",
"dirfrag split": "Fragment directory by path",
"dump cache": "dump metadata cache (optionally to a file)",
"dump loads": "dump metadata loads",
"dump tree": "dump metadata cache for subtree",
"dump_blocked_ops": "show the blocked ops currently in flight",
"dump_historic_ops": "show slowest recent ops",
"dump_historic_ops_by_duration": "show slowest recent ops, sorted by op duration",
"dump_mempools": "get mempool stats",
"dump_ops_in_flight": "show the ops currently in flight",
"export dir": "migrate a subtree to named MDS",
"flush journal": "Flush the journal to the backing store",
"flush_path": "flush an inode (and its dirfrags)",
"force_readonly": "Force MDS to read-only mode",
"get subtrees": "Return the subtree map",
"get_command_descriptions": "list available commands",
"git_version": "get git sha1",
"help": "list available commands",
"log dump": "dump recent log entries to log file",
"log flush": "flush log entries to log file",
"log reopen": "reopen log file",
"objecter_requests": "show in-progress osd requests",
"ops": "show the ops currently in flight",
"osdmap barrier": "Wait until the MDS has this OSD map epoch",
"perf dump": "dump perfcounters value",
"perf histogram dump": "dump perf histogram values",
"perf histogram schema": "dump perf histogram schema",
"perf reset": "perf reset <name>: perf reset all or one perfcounter name",
"perf schema": "dump perfcounters schema",
"scrub_path": "scrub an inode and output results",
"session evict": "Evict a CephFS client",
"session ls": "Enumerate connected CephFS clients",
"status": "high-level status of MDS",
"tag path": "Apply scrub tag recursively",
"version": "get ceph version"
}
1.2 ceph daemon mds.xxx cache status
這個(gè)命令是用來(lái)查看 Ceph MDS 緩存的使用情況志鞍,默認(rèn)的配置是使用 1G 內(nèi)存作為緩存瞭亮,不過(guò)這不是一個(gè)固定的上限,實(shí)際用量可能突破配置固棚。
$ sudo ceph daemon mds.cephfs-master1 cache status
{
"pool": {
"items": 321121429,
"bytes": 25797208658
}
}
1.3 ceph mds stat
查看 MDS 組件狀態(tài)统翩,下面的例子輸出的結(jié)果表示只有一個(gè) MDS,而且 MDS 已經(jīng)處于正常工作狀態(tài)此洲。
$ ceph mds stat
cephfs-1/1/1 up {0=cephfs-master1=up:active}
1.4 ceph daemon mds.xxx perf dump mds
查看 MDS 的性能指標(biāo)厂汗。
$ sudo ceph daemon mds.cephfs-master1 perf dump mds
{
"mds": {
"request": 4812776,
"reply": 4812772,
"reply_latency": {
"avgcount": 4812772,
"sum": 4018.941028931,
"avgtime": 0.000835057
},
"forward": 0,
"dir_fetch": 170753,
"dir_commit": 3253,
"dir_split": 9,
"dir_merge": 6,
"inode_max": 2147483647,
"inodes": 9305913,
"inodes_top": 1617338,
"inodes_bottom": 7688575,
"inodes_pin_tail": 0,
"inodes_pinned": 6995430,
"inodes_expired": 13937,
"inodes_with_caps": 6995443,
"caps": 7002958,
"subtrees": 2,
"traverse": 5076658,
"traverse_hit": 4835068,
"traverse_forward": 0,
"traverse_discover": 0,
"traverse_dir_fetch": 91030,
"traverse_remote_ino": 0,
"traverse_lock": 109,
"load_cent": 5356538,
"q": 1,
"exported": 0,
"exported_inodes": 0,
"imported": 0,
"imported_inodes": 0
}
}
1.5 ceph daemon mds.xxx dirfrag ls /
這個(gè)命令是用來(lái)查看文件系統(tǒng)某個(gè)目錄下是否有臟數(shù)據(jù)。
$ sudo ceph daemon mds.cephfs-master1 dirfrag ls /
[
{
"value": 0,
"bits": 0,
"str": "0/0"
}
]
1.6
該命令是用來(lái)查看 CephFS 的 session 連接呜师。
$ sudo ceph daemon mds.cephfs-master1 session ls
[
{
"id": 9872,
"num_leases": 0,
"num_caps": 1,
"state": "open",
"replay_requests": 0,
"completed_requests": 0,
"reconnecting": false,
"inst": "client.9872 192.168.250.1:0/1887245819",
"client_metadata": {
"entity_id": "k8s.training.cephfs-teamvolume-aaaaaa-pvc",
"hostname": "GPU-P100",
"kernel_version": "4.9.107-0409107-generic",
"root": "/prod/training/cephfs-teamvolume-aaaaaa-pvc"
}
},
......
]
2. 問(wèn)題分析
2.1 Client cephfs-master1 failing to respond to cache pressure client_id: 9807
正巧是我修改了 MDS cache 之后出現(xiàn)了這個(gè)告警娶桦,所以一開(kāi)始懷疑是是不是因?yàn)楦拇罅?cache 造成了這個(gè)問(wèn)題,但當(dāng)我恢復(fù)了 cache 的默認(rèn)值之后,問(wèn)題依然存在衷畦。于是在 Ceph 的郵件列表中搜索類(lèi)似問(wèn)題栗涂,發(fā)現(xiàn)該問(wèn)題一般都是 inode_max 這個(gè)數(shù)值設(shè)置的不夠大造成的,于是查看了一下當(dāng)前的 inode 和 inode_max 信息:
$ sudo ceph daemon mds.cephfs-master1 perf dump mds
{
"mds": {
"request": 404611246,
"reply": 404611201,
"reply_latency": {
"avgcount": 404611201,
"sum": 9613563.153437701,
"avgtime": 0.023760002
},
......
"inode_max": 2147483647,
"inodes": 3907095,
......
}
inodes 遠(yuǎn)小于 inode_max祈争,所以這里的配置也沒(méi)有問(wèn)題斤程。繼續(xù)搜索發(fā)現(xiàn)不只是 inodes 的數(shù)量會(huì)造成這個(gè)問(wèn)題,已經(jīng)過(guò)期的 inodes 也是有影響的菩混。
$ sudo ceph daemon mds.cephfs-master1 perf dump mds
{
......
"inodes_expired": 21999096501,
......
}
果然忿墅,inodes_expired 的數(shù)值已經(jīng)非常大了。進(jìn)一步搜索發(fā)現(xiàn)沮峡,造成這個(gè)問(wèn)題的主因是 cephfs 不會(huì)自動(dòng)清理過(guò)期的 inodes疚脐,所以積累時(shí)間久了,就容易出現(xiàn)不夠用的現(xiàn)象帖烘。解決方法如下:
$ sudo vim /etc/ceph/ceph.conf
……
[client]
client_try_dentry_invalidate = false
……
$ sudo systemctl restart ceph-mds@cephfs-master1.service
2.2 MDS cache 配置
MDS 目前官方推薦的配置還是單活的亮曹,也就是說(shuō)一個(gè)集群內(nèi)只有一個(gè)提供服務(wù)的 MDS,雖然 Ceph MDS 性能很高秘症,但畢竟是單點(diǎn)照卦,再加上 MDS 運(yùn)行的物理機(jī)上內(nèi)存資源還是比較富裕的,自然想到通過(guò)使用內(nèi)存作為緩存來(lái)提高 MDS 的性能乡摹。但是 MDS 的緩存配置項(xiàng)很多役耕,一時(shí)還真不確定應(yīng)該用哪個(gè)選項(xiàng),而且配置成多大合適也拿不準(zhǔn)聪廉。
經(jīng)過(guò)進(jìn)一步的整理后瞬痘,把緩存配置進(jìn)一步分解為以下四個(gè)小問(wèn)題。
- 到底使用哪個(gè)選項(xiàng)配置緩存的大小
- 為什么大部分時(shí)間用不到配置的內(nèi)存量
- 為什么有時(shí) MDS 占用的內(nèi)存遠(yuǎn)大于緩存的配置
- 應(yīng)該將緩存配置成多大
2.2.1 到底使用哪個(gè)選項(xiàng)配置緩存的大小
相關(guān)的配置項(xiàng)主要有兩個(gè):
mds_cache_size 和 mds_cache_memory_limit板熊,mds_cache_size 是老版本的配置參數(shù)框全,單位是 inode,目前的默認(rèn)值是 0干签,表示沒(méi)有限制津辩;mds_cache_memory_limit 是建議使用的值,單位是 byte容劳,默認(rèn)值為 1G喘沿。所以要調(diào)整 cache 大小,當(dāng)然是要改 mds_cache_memory_limit 竭贩。
2.2.2 為什么大部分時(shí)間用不到配置的內(nèi)存量
例如將 mds_cache_memory_limit 配置為 30G(mds_cache_memory_limit = 32212254726)蚜印,而實(shí)際運(yùn)行時(shí),看到的緩存用量卻是這樣的:
$ sudo ceph daemon mds.cephfs-master1 cache status
{
"pool": {
"items": 321121429,
"bytes": 31197237046
}
}
雖然差距不大留量,但為什么總是用不到配置的內(nèi)存量呢窄赋?
原因在于這個(gè)參數(shù):mds_cache_reservation哟冬,這個(gè)參數(shù)表示 MDS 預(yù)留一部分內(nèi)存,沒(méi)有具體的作用寝凌,就是為了留有余地柒傻。當(dāng) MDS 開(kāi)始侵占這部分內(nèi)存時(shí),系統(tǒng)會(huì)自動(dòng)釋放掉超過(guò)配額的那部分较木。
mds_cache_reservation 的默認(rèn)值是 5%,所以造成了我們看到的現(xiàn)象青柄。
2.2.3 為什么有時(shí) MDS 占用的內(nèi)存遠(yuǎn)大于緩存的配置
但有時(shí) MDS 占用的內(nèi)存又遠(yuǎn)遠(yuǎn)大于配置的緩存伐债,這個(gè)原因是 mds_cache_memory_limit 并非一個(gè)固定死不能突破的上限,程序運(yùn)行時(shí)可能會(huì)在特定情況下突破配置的上限致开,所以建議不要把這個(gè)值配置的和系統(tǒng)內(nèi)存總量太接近峰锁。不然有可能會(huì)占滿(mǎn)整個(gè)服務(wù)器的內(nèi)存資源。
2.2.4 應(yīng)該將緩存配置成多大
官方文檔有明確的說(shuō)明双戳,不推薦大于 64G虹蒋,這里面的原因主要是 Ceph 的 bug,有很多使用者發(fā)現(xiàn)當(dāng)高于 64g 時(shí)飒货,MDS 有較高的概率占用遠(yuǎn)高于實(shí)際配置的內(nèi)存魄衅,目前該 bug 還沒(méi)有解決。