CephFS: No space left on device

前言

这是一篇旧闻,由于用cephfs的人还不是很多,所以比较少发关于cephfs相关的东西,最近看到有人开始使用,并且遇到了问题,这个就是其中一个比较容易出的问题,需要进行参数的调整

CephFS: No space left on device

After upgrading to 10.2.3 we frequently see messages like ‘rm: cannot remove ‘…’: No space left on device The folders we are trying to delete contain approx. 50K files 193 KB each. The cluster state and storage available are both OK: cluster 98d72518-6619-4b5c-b148-9a781ef13bcb health HEALTH_WARN mds0: Client XXX.XXX.XXX.XXX failing to respond to cache pressure mds0: Client XXX.XXX.XXX.XXX failing to respond to cache pressure mds0: Client XXX.XXX.XXX.XXX failing to respond to cache pressure mds0: Client XXX.XXX.XXX.XXX failing to respond to cache pressure mds0: Client XXX.XXX.XXX.XXX failing to respond to cache pressure monmap e1: 1 mons at {000-s-ragnarok=XXX.XXX.XXX.XXX:6789/0} election epoch 11, quorum 0 000-s-ragnarok fsmap e62643: 1/1/1 up {0=000-s-ragnarok=up:active} osdmap e20203: 16 osds: 16 up, 16 in flags sortbitwise pgmap v15284654: 1088 pgs, 2 pools, 11263 GB data, 40801 kobjects 23048 GB used, 6745 GB / 29793 GB avail 1085 active+clean 2 active+clean+scrubbing 1 active+clean+scrubbing+deep

Has anybody experienced this issue so far?

这个问题是作者在升级了一个集群以后(jewel 10.2.3),做删除的时候,发现提示了 No space left on device,按正常的理解做删除不会出现提示空间不足

这个地方的原因是,有一个参数会对目录的entry做一个最大值的控制mds_bal_fragment_size_max,而这个参数实际上在做删除操作的时候,当文件被unlink的时候,被放入待删除区的时候,这个也是被限制住的,所以需要调整这个参数,如果有上百万的文件被等待删除的时候,可能就会出现这个情况,并且出现 failing to respond to cache pressure 我们根据自己的需要去设置这个值

默认的 mds_bal_fragment_size_max=100000,也就是单个文件10万文件,如果不调整,单目录写入10万文件就能出现上面的问题

这个地方可以用命令来监控mds的当前状态

[root@lab8106 mnt]# ceph daemonperf mds.lab8106-----mds------ --mds_server-- ---objecter--- -----mds_cache----- ---mds_log---- 
rlat inos caps|hsr  hcs  hcr |writ read actv|recd recy stry purg|segs evts subm|  0  163k   5 |  0    0    0 |  0    0   36 |  0    0  145k   0 | 33   29k   0 
  0  163k   5 |  0    0    0 |  6    0   34 |  0    0  145k   6 | 33   29k   6 
  0  163k   5 |  0    0    0 | 24    0   32 |  0    0  145k  24 | 32   29k  24 
  0  163k   5 |  0    0    0 | 42    0   32 |  0    0  145k  42 | 32   29k  42 
  0  159k   5 |  0    0    0 |972    0   32 |  0    0  144k 970 | 33   27k 971 
  0  159k   5 |  0    0    0 |905    0   32 |  0    0  143k 905 | 31   28k 906 
  0  159k   5 |  0    0    0 |969    0   32 |  0    0  142k 969 | 32   29k 970 
  0  159k   5 |  0    0    0 |601    0   31 |  0    0  141k 601 | 33   29k 602

这个地方还有一个硬链接删除以后没有释放stry的问题,最新版的master里面已经合进去了代码(scan_link

修复过程如下 执行flush MDS journal

ceph daemon mds.xxx flush journal

停止掉所有mds

stop all mds

执行

cephfs-data-scan scan_links

重启mds

restart mds

执行命令

ceph daemon mds.x scrub_path / recursive repair

执行完了以后去对目录进行一次ll,可以看到mds_cache的stry的就会被清理干净了

这个问题就可以解决了,实际测试中在换了新版本以后,重启后然后进行目录的ll,也能清空stry

原文发布于微信公众号 - 磨磨谈(momotan1987)

原文发表时间:2017-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏杂谈

Node.js文件编码格式的转换

项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。

2064
来自专栏封碎

Java多线程参考手册 博客分类: 经典文章转载

http://blog.csdn.net/ring0hx/article/details/6858582

742
来自专栏Golang语言社区

GO语言并发编程之互斥锁、读写锁详解

在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都...

2865
来自专栏C/C++基础

Linux命令(36)——awk命令

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输...

1692
来自专栏Golang语言社区

GO语言并发编程之互斥锁、读写锁详解

在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都...

39015
来自专栏Golang语言社区

GO语言并发编程之互斥锁、读写锁详解

在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都...

5064
来自专栏Golang语言社区

GO语言并发编程之互斥锁、读写锁详解

在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都...

3917
来自专栏蓝天

awk给外部变量赋值

假设将值存在文件t中,文件t内容如下,只有一行:a b c 需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下: eval $(awk '{ pr...

923
来自专栏noteless

ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

实际为   HttpServletRequest  或者  ServletRequest,   两者都为接口

2145
来自专栏Google Dart

Dart 服务端开发 shelf_bind 包

shelf_bind倾向于约定优于配置,因此您可以编写必要的最小代码,但仍然可以根据需要覆盖默认值。

972

扫码关注云+社区

领取腾讯云代金券