问题:

使用vdbench进行单层100w目录,每个目录30个文件,共3000w文件读写时,在创建文件得时候IO会出现断断续续得情况。

分析过程:

1、  nfs抓包分析

使用vdbench创建一个文件得流程eg: vdb_f0398.file:

Lookup call -> lookup reply ->create call ->create reply ->write call ->write reply

2、  当vdbench IO归0时,观察存储端状态

1)  read IO特别大,write IO为0

看4标识

2)  zfs arc到了limit点为,arc_prune数值增加,意味着频繁得回收arc,但arc大小为变化

看上图1是设定的arc_meta_limit,2是已经使用的arc_meta空间,一般触发回收时会高出limit限制几百M,3是回收次数。其在arc_meta使用触发回收时短时间内多次回收调用,但是回收的arc空间很少,之后不再回收,导致arc一直是full的状态。

3)  arc相关参数变化

没有释放arc

看图5标识,此处为有写IO时,此时为readdir执行完了一次后,在对应的目录下创建了30个文件(vdbech配置的)。

4)  使用perf分析进程变化情况

发现进程lz4_decompress_zfs 进程变化比较明显

5)  通过dump_stack打印lz4的调用栈:

从打印情况看两个可疑点,出问题的时候zfs_readdir 和 reconnect_path被不停的调用

6)  从这两个地方分析是否存在问题

1》  zfs_readdir其dump_stack情况

分析内部代码,打印事件发现:

会发现while执行的次数和时间会随着目录数的增加线性增长,100w目录查询一次一般会超过10s(8s-180s,当时应该受到arc回收影响,没出现IO归零时不会调用到此函数)

2》  reconnect_path情况

出现问题时,exportfs参数没有收到期望的具体vdb.1_6795.dir目录名,而是根目录/(注意此处设置nfsd thread数为1,默认是32,会进行32次根目录的调用,其造成阻塞的概率增大,并耗时非常长)

由此触发了zfs_readdir

此处引出问题,为什么参数会是根目录????

7)  当arc缓存开始执行回收操作时,出现问题

而多次回收内存并未释放多少,前面图示可以看出。

8)  由上联合起来分析汇总:

当arc使用接近限制阈值的时候,触发回收操作,而回收操作只回收一点,但将原来的目录缓存破坏掉,使用新创建的文件元数据来填充arc,大量的arc缓存无法释放。导致当服务器端nfs执行 lookup确定要创建的文件是否合法时,触发了reconnect_path->zfs_readdir等操作,来进行所有目录的重新匹配,而此时arc已经满了无法缓存,导致接下来的每次lookup都要执行一遍readdir。

此处引出问题,为什么缓存释放不了???

3、  由上分析,猜测服务器vdbench缓存了inode,dentry等信息

通过在跑vdbench IO时,观察服务器内存使用情况发现,随着创建文件夹和文件,内存使用明显

尝试在存储端arc接近缓存阈值时,清除服务器的缓存,主要是dentry、inode信息。多次测试发现问题不再重现。Arc可以正常释放,并且释放速度较快。

4、  综上确定问题出现vdbenc IO,在创建文件夹和文件的时候会影响zfs ARC缓存释放,引出问题:

1)  vdbench 在没有创建完文件之前会维护这些link?

2)  Nfs客户端做的缓存?

3)  此现象对其他公司nas产品是否一样?

4)  需要存储端解决此问题?如何解决?

5、arc小于2G回收会出问题这个大概率是之前的因素影响,还在分析代码并测试中~~。测试了一次1.5G的在服务器端正常释放缓存后,没啥问题。

记一次NAS故障分析(ZFS NFS)的更多相关文章

  1. CentOS7搭建NAS,包括NFS、ISCSI

    第一步:安装 更新系统 yum update 安装iftop yum install epel-release yum install iftop 安装NFS yum install nfs-util ...

  2. 自己家里搭建NAS服务器有什么好方案?

    转自:https://www.zhihu.com/question/21359049 作者:陈二发链接:https://www.zhihu.com/question/21359049/answer/6 ...

  3. 【树莓派】【转载】Raspberry Pi (树莓派)折腾记

    在网上看到一篇对树莓派折腾记录比较详细的文章,时间比较早,但是有些东西没变. 对于新手而言,还是有点参考价值.文章参见:http://skypegnu1.blog.51cto.com/8991766/ ...

  4. NAS简介

    转自IBM资料库:https://community.emc.com/docs/DOC-15977 在20世纪80年代初,英国纽卡斯尔大学布赖恩.兰德尔教授 ( Brian Randell)和同事通过 ...

  5. 脑残手贱:被NFS祸害的调度系统

    建议:任何时候,都要三思而后行!!! 事请的缘由 系统中采用slurm调度系统来进行并行计算.但是在GPU节点上,无论如何都无法启动slurmd,报插件初始化错误的故障. 因此需要编译新的munge和 ...

  6. 9 云计算系列之Cinder的安装与NFS作为cinder后端存储

    preface 在前面我们知道了如何搭建Openstack的keystone,glance,nova,neutron,horizon这几个服务,然而在这几个服务中唯独缺少存储服务,那么下面我们就学习块 ...

  7. Linux系统中连接使用NAS

    在使用NAS时,需要先确定NAS上的NFS服务和SMB的服务都开启了: 然后需要用NAS上的用户去登录,这里用的是admin: # smbclient -L 192.168.1.40 -U admin ...

  8. MAC OS 中mount nfs 报错问题.

    记一下 MAC OS 中mount nfs 报错问题. 环境和配置文件 NFS 服务端 Ubuntu 安装 apt install nfs-kernel-server 服务端的配置文件 cat /et ...

  9. OpenStack之基础知识

    一.云计算 云计算(cloud computing)是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源.云是网络.互联网的一种比喻说法.过去在图中往往 ...

随机推荐

  1. CF1399F Yet Another Segments Subset

    首先注意一下题面要求,使得选出的线段两两要么包含要么不相交,也就是说一条线段可能会出现不相交的几条线段,而这些线段上面也可能继续这样包含线段.然后我们可以发现我们要做的实际上是在这条线段上选取几条线段 ...

  2. C 字符串奇数位小写字母转大写

    如题 C实现 #include<stdio.h> #include<string.h> #define COUNT 20 //最大接受字符串数,可以使用动态获取空间函数优化 v ...

  3. JS Map与Set

    笔记整理自:廖雪峰老师的JS教程 Map JavaScript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问题,最新的ES6规范引入了 ...

  4. JAVA变量初始化赋值问题

    感谢大佬:https://www.cnblogs.com/znsongshu/p/6282672.html 在Java中,null值表示引用不指向任何对象.运行过程中系统发现使用了这样一个引用时·可以 ...

  5. PHP中常见的数字掐头去尾操作方法

    四舍五入round round( float $val[, int $precision = 0[, int $mode = PHP_ROUND_HALF_UP]] ) : float 对浮点数进行四 ...

  6. java篇之JDBC原理和使用方法

    JDBC学过但又属于很容易忘记的那种,每次要用到,都要看下连接模式.每次找又很费时间,总之好麻烦呀呀呀,所以写篇博客,总结下原理和常用接口,要是又忘了可以直接来博客上看,嘿嘿. 一.什么是JDBC 1 ...

  7. yum本地源仓库安装报错 被锁定如何解决?

    yum安装报错被锁定如何解决 上图!!!!!如图的报错 解决方法: 是不是很简单 智商在地上摩擦~~~

  8. 014 Linux 线上高频使用以及面试高频问题——如何查找大文件并安全的清除?

    目录 1 案例描述? 2 命令一(目录统计排序最佳命令) 3 命令二(最实用,目录和文件一起统计排序) (1)命令详情和说明 (2)du.head.sort.awk 详细说明参考已有文章附录 (3)L ...

  9. Azure AD Domain Service(二)为域服务中的机器配置 Azure File Share 磁盘共享

    一,引言 Azure File Share 是支持两种认证方式的! 1)Active Directory 2)Storage account key 记得上次分析的 "Azure File ...

  10. GCC 使用库文件名进行链接

    使用 GCC 进行 C/C++ 代码编译时,如果代码中使用到了库函数,需要使用 -l 选项指定该库函数所在的库.如:-lm.-lrt.-lpthread等.这种方式使用的是库的缩写.一个库的文件名如果 ...