mds的cpu占用问题分析以及解决办法
前言
mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分场景还是单acitve mds的
这就会出现一种情况,一旦一个目录里面有很多文件的时候,去查询这个目录里的文件就会在当前目录做一次遍历,这个需要一个比较长的时间,如果能比较好的缓存文件信息,也能避免一些过载情况,本篇讲述的是内核客户端正常,而export nfs后mds的负载长时间过高的情况
问题复现
准备测试数据,准备好监控环境
监控mds cpu占用
pidstat -u 1 -p 27076 > /tmp/mds.cpu.log
UserParameter=mds.cpu,cat /tmp/mds.cpu.log|tail -n 1|grep -v Average| awk '{print $8}'
整个测试避免屏幕的打印影响时间统计,把输出需要重定向
测试一:
内核客户端写入10000文件查看时间以及cpu占用
[root@nfsserver kc10000]# time seq 10000|xargs -i dd if=/dev/zero of=a{} bs=1K count=1 2>/dev/null
real 0m30.121s
user 0m1.901s
sys 0m10.420s
测试二:
内核客户端写入20000文件查看时间以及cpu占用
[root@nfsserver kc20000]# time seq 20000|xargs -i dd if=/dev/zero of=a{} bs=1K count=1 2>/dev/null
real 1m38.233s
user 0m3.761s
sys 0m21.510s
测试三:
内核客户端写入40000文件查看时间以及cpu占用
[root@nfsserver kc40000]# time seq 40000|xargs -i dd if=/dev/zero of=a{} bs=1K count=1 2>/dev/null
real 2m55.261s
user 0m7.699s
sys 0m42.410s
测试4:
内核客户端列目录10000文件,第一次写完有缓存情况
[root@nfsserver kc10000]# time ll 2>&1 > /dev/null
real 0m0.228s
user 0m0.063s
sys 0m0.048s
内核客户端列目录20000文件,第一次写完有缓存情况
[root@nfsserver kc20000]# time ll 2>&1 > /dev/null
real 0m0.737s
user 0m0.141s
sys 0m0.092s
内核客户端列目录40000文件,第一次写完有缓存情况
[root@nfsserver kc40000]# time ll 2>&1 > /dev/null
real 0m1.658s
user 0m0.286s
sys 0m0.196s
都是比较快的返回,CPU可以忽略不计
现在重启mds后再次列目录
客户端如果不umount,直接重启mds的话,还是会缓存在
新版本这个地方好像已经改了(重启了mds 显示inode还在,但是随着时间的增长inode会减少,说明还是有周期,会释放,这个还不知道哪个地方控制,用什么参数控制,这个不是本篇着重关注的地方,后续再看下,jewel版本已经比hammer版本的元数据时间快了很多了)
[root@nfsserver kc10000]# time ll 2>&1 > /dev/null
real 0m0.380s
user 0m0.065s
sys 0m0.041s
[root@nfsserver kc10000]# cd ../kc20000/
[root@nfsserver kc20000]# time ll 2>&1 > /dev/null
real 0m0.868s
user 0m0.154s
sys 0m0.074s
[root@nfsserver kc20000]# cd ../kc40000/
[root@nfsserver kc40000]# time ll 2>&1 > /dev/null
real 0m1.947s
user 0m0.300s
sys 0m0.166s
测试都是看到很快的返回,以上都是正常的,下面开始将这个目录exportnfs出去,看下是个什么情况
负载问题复现
从nfs客户端第一次列10000个小文件的目录
[root@nfsclient kc10000]# time ll 2>&1 > /dev/null
real 0m4.038s
user 0m0.095s
sys 0m0.069s
从nfs客户端第一次列20000个小文件的目录
[root@nfsclient kc20000]# time ll 2>&1 > /dev/null
real 0m17.446s
user 0m0.175s
sys 0m0.141s
从nfs客户端第二次列20000个小文件目录
[root@nfsclient kc20000]# time ll 2>&1 > /dev/null
real 0m21.215s
user 0m0.182s
sys 0m0.151s
从nfs客户端第三次列20000个小文件目录
[root@nfsclient kc20000]# time ll 2>&1 > /dev/null
real 0m16.222s
user 0m0.189s
sys 0m0.143s
可以看到在20000量级的时候列目录维持在20000左右,CPU维持一个高位
从nfs客户端列40000个小文件的目录
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 7m15.663s
user 0m0.319s
sys 0m0.581s
[root@nfsclient kc40000]#
第一次列完,马上第二次列看下情况
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 1m12.816s
user 0m0.163s
sys 0m0.142s
可以看到第二次列的时间已经缩短了,再来第三次
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 1m33.549s
user 0m0.162s
sys 0m0.183s
可以看到在后面列的时候时间确实缩短了,但是还是维持一个非常高CPU的占用,以及比较长的一个时间,这个很容易造成过载
这个地方目前看应该是内核客户端与内核NFS的结合的问题
解决办法:用ganesha的ceph用户态接口替代kernel nfs
我们看下另外一种方案用户态的NFS+ceph同样的环境下测试结果:
从nfs客户端第一次列40000个小文件的目录
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 0m3.289s
user 0m0.335s
sys 0m0.386s
从nfs客户端第二次列40000个小文件的目录
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 0m1.686s
user 0m0.351s
sys 0m0.389s
从nfs客户端第三次列40000个小文件的目录
[root@nfsclient kc40000]# time ll 2>&1 > /dev/null
real 0m1.675s
user 0m0.320s
sys 0m0.391s
基本mds无多余的负载,非常快的返回
可以从上面的测试看到差别是非常的大的,这个地方应该是内核模块与内核之间的问题,而采用用户态的以后解决了列目录慢以及卡顿的问题
如何配置ganesha支持ceph的nfs接口
git clone -b V2.3-stable https://github.com/nfs-ganesha/nfs-ganesha.git
cd nfs-ganesha/
git submodule update --init --recursive
cd ..
cd nfs-ganesha/
ll src/FSAL/FSAL_CEPH/
cd ..
mkdir mybuild
cd mybuild/
cmake -DUSE_FSAL_CEPH=ON ../nfs-ganesha/src/
ll FSAL/FSAL_CEPH/
make
make -j 12
make install
vim /etc/ganesha/ganesha.conf
修改配置文件
EXPORT
{
Export_ID=1;
Path = "/";
Pseudo = "/";
Access_Type = RW;
NFS_Protocols = 4;
Transport_Protocols = TCP;
FSAL {
Name = CEPH;
}
}
停止掉原生的nfs
systemctl stop nfs
启用ganesha nfs
systemctl start nfs-ganesha.service
然后在客户端进行nfs的挂载即可
总结
ganesha在需要用到cephfs又正好是要用到nfs接口的时候,可以考虑这个方案,至少在缓存文件,降低负载上面能够比kernel client有更好的效果,这个可以根据测试情况用数据来做比较
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2017-12-04 |
/assets/images/blogimg/mds-use-too-more-cpu/
mds的cpu占用问题分析以及解决办法的更多相关文章
- JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...
- php中session_start()相关问题分析与解决办法
介绍下,在php中使用session时遇到的一些问题,与相关解决方法.1.错误提示Warning: Cannot send session cookie - headers already sentW ...
- oracle执行update语句时卡住问题分析及解决办法
转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...
- Juniper SRX550防火墙web页面CPU达到100%的故障解决办法
Juniper SRX550防火墙web页面CPU达到100%的故障解决办法 利用telnet远程连接主机,对web页面注销重新登录即可,在配置中输入命令:run restart web-manage ...
- selenium元素定位不到问题分析及解决办法
最近正在学习写自动化测试脚本,遇到一个错误迟迟未解决,导致自信心大受挫败,甚至想放弃. 思考许久突然想到,我遇到的问题是否也有人会遇到,如果有的话问题就应该有解决办法了.没什么问题是百度解决不了的,如 ...
- 服务器CPU使用率高的原因分析与解决办法
我们的服务器在使用操作系统的时候,用着用着系统就变慢了,打开“ 任务管理器 ”一看,才发现CPU使用率达到80%以上.这是怎么回事情呢?遇到病毒了吗?硬件有问题?还是系统设置有问题呢?在本文中将从硬件 ...
- HashMap-死锁导致cpu占用100%分析(转)
最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 ...
- Nested Loops join时显示no join predicate原因分析以及解决办法
本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...
- 80端口未占用,apache无法启动解决办法
网上很多关于apache无法启动的原因,新手遇到最多的是80端口被占用. 今天为了解决apache和tomcat端口共存问题,修改了httpd.conf的配置,由于增加位置没有做明显标识,重启apac ...
随机推荐
- Django的安装和项目的启动
一.安装(安装最新LTS版): 1.命令行安装 pip install django==1.11.18 -i 源 2.pycharm 安装 二.创建项目 1.命令行创建 下面的命令创建了一个名为 ...
- C 语言因为疫情重登最流行编程语言榜第一名!其实它一直都在~
C 语言时隔五年后再次荣登最流行编程语言榜单第一名. 通过调查得出结论, C 语言再次受欢迎的原因竟然是因为病毒,这听起来愚蠢但确实是事实,嵌入式语言 C 和 C++ 被用于医疗设备中的幅度因为疫 ...
- docker-compose编写示例
docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...
- SOAP调用Web Service
SOAP调用Web Service (示例位置:光盘\code\ch07\ WebAppClient\ JsService4.htm) <html xmlns="http://www. ...
- 第二十五章 ansible基础
一.Ansible概述 1.什么是Ansible Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复 ...
- java反射原来是这么玩的(反射一开,谁都不爱)
反射的发展历史 1996年01月23日,jdk 1.0版本发布,代号为Oak(橡树). 这个代号为Oak(橡树)的版本,在发布后的第二年,1997年02月19日,发布jdk 1.1版本,这次版本发布中 ...
- 经典剪枝算法的例题——Sticks详细注释版
这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...
- APP打开(二)—标准流程
APP打开是一个老生常谈的话题,在互联网时代,在APP遍地的时代,APP打开是每一个APP的必经之路,今天我想通过以下几点来阐述APP打开的标准流程,给这个话题写一点自己的见解. APP打开现状 标准 ...
- [C#] (原创)一步一步教你自定义控件——03,SwitchButton(开关按钮)
一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:开关按钮(SwitchButton). 开关按钮非常简单,实现方式也多种多样,比如常见的:使用两张不同的按钮图片,代表开和关,然后 ...
- pip安装与使用
介绍 pip是python包管理工具,提供了对python包的查找,下载,安装,卸载功能. 安装 检查是否安装 pip --version 安装 curl https://bootstrap.pypa ...