作者:任坤

现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1、背景

上班时间收到一条磁盘空间报警

登录该机器查看,根分区只有不到16G,此刻已经使用超过了80%。

查看根分区下最大的10个文件并按照size降序排列

du ‐Sm / ‐‐exclude="/data" | sort ‐k1nr | head ‐10

这条命令在其他环境执行几秒钟就返回了,在这个机器上执行了将近1分钟,最后定位到是几个日志文件,直接删除即可。

刚准备退出登录,又收到一条内存报警,还是这台机器。

2、诊断

查看内存使用情况,确实已经被耗尽

top查看最耗内存的几个进程

消耗内存每多的mysqld只占用了43G,就算加上截图中的其他几个进程,顶多占用44G。
为避免漏算,统计一下所有进程占用的物理内存总和:

[root@centos6564‐220 ~]# more RSS.sh
#/bin/bash
for PROC in `ls /proc/|grep "^[0‐9]"`
do
if [ ‐f /proc/$PROC/statm ]; then
TEP=`cat /proc/$PROC/statm | awk '{print ($2)}'`
RSS=`expr $RSS + $TEP`
fi
done
RSS=`expr $RSS \* 4 / 1024 / 1024`
echo $RSS"GB"[root@centos6564‐220 ~]# sh RSS.sh
44GB

注:该脚本来自于褚霸多年前的一篇文章 http://blog.yufeng.info/archives/2456

问题来了,剩余的10多G内存被谁占用了?
top 和 ps 都给不出答案,只能查看/proc/meminfo文件

注意红框中的信息,slab 消耗了太多的缓存,且都是可回收的,看大小正好有16G左右。

联想到刚刚执行的巨慢的du -Sm命令,答案似乎很明显了。

执行slabtop

dentry 和 inode 占用了很多内存,但是输出结果不够直观。

查看超过100M的 slab 缓存组件

[root@centos6564‐220 ~]# cat /proc/slabinfo |awk '{if($3*$4/1024/1024 > 1
00){print $1,$3*$4/1024/1024 "MB"} }'
xfs_inode 113.586MB
proc_inode_cache 11989.1MB
dentry 3526.19MB

inode 占用了将近12G,dentry 占用了3.5G,一切都对上了。

既然是 slab 缓存导致的内存不足,可以直接用 echo 2 > /proc/sys/vm/drop_caches 命令回收。

至此,内存不足的问题已解决。

3、寻源

新的疑问产生,到底是哪个目录消耗了海量的 inode/dentry?

执行如下命令,统计根目录下每个目录拥有的文件和子目录总数。

for i in `ls / `; docount=`ls ‐lR /$i | wc ‐l`echo "$i has $count files and dirs"
done
...
proc has 32940780 files and dirs
root has 462 files and dirs
sbin has 287 files and dirs
tmp has 2 files and dirs
....

/proc是元凶,继续探查/proc下的子目录,这次统计细化分为文件和子目录

for i in `ls /proc `; dofiles=`ls ‐lR /proc/$i | grep "^‐" | wc ‐l`dirs=`ls ‐lR /proc/$i | grep "^d" | wc ‐l`echo "$i has $files files and $dirs dirs" >> /tmp/count_tmps
done
7
#15049进程占用了1600w个文件
[root@centos6564‐220 tmp]# more count_tmps | sort ‐k3nr | head ‐5
15049 has 16381888 files and 964 dirs17211 has 7653 files and 349 dirs6053 has 7511 files and 384 dirs18720 has 2289 files and 269 dirssys has 1166 files and 119 dirs[root@centos6564‐220 tmp]# ps ‐ef | grep 15049mysql 15049 13839 41 Jan07 ? 85‐09:04:44 /usr/sbin/mysqld ‐‐basedir=/usr
‐‐datadir=/data/var ‐‐plugin‐dir=/usr/lib64/mysql/plugin ‐‐user=mysql ‐‐
log‐error=/data/var/err.log ‐‐pid‐file=/data/var/mysql.pid ‐‐socket=/data/v
ar/mysql.sock ‐‐port=3306root 24912 25232 0 01:10 pts/3 00:00:00 grep 15049

多尴尬,查半天居然还是 mysql 的问题。

统计/proc/15049下的子目录信息

dest=/proc/15049
for i in `ls $dest `; dofiles=`ls ‐lR $dest/$i | grep "^‐" | wc ‐l`dirs=`ls ‐lR $dest/$i | grep "^d" | wc ‐l`echo "$i has $files files and $dirs dirs" >> /tmp/15049
done[root@centos6564‐220 task]# cat /tmp/15049 | sort ‐k3nr | head ‐5
task has 20428788 files and 955 dirsfdinfo has 106921 files and 0 dirsnet has 60 files and 3 dirsattr has 6 files and 0 dirsautogroup has 1 files and 0 dirs

/proc/15432/task目录,记录的是 mysqld 衍生的每个子线程的信息。

查看 mysqld 当前的子线程数量

[root@centos6564‐220 task]# cat /proc/15049/status | grep ‐i threads
Threads: 191

继续查看每个子线程具体信息

dest=/proc/15049/taskfor i in `ls $dest `; dofiles=`ls ‐lR $dest/$i | grep "^‐" | wc ‐l`dirs=`ls ‐lR $dest/$i | grep "^d" | wc ‐l`echo "$i has $files files and $dirs dirs" >> /tmp/15049_task
done[root@centos6564‐220 tmp]# more 15049_task | sort ‐k3nr | head ‐5
15049 has 106957 files and 4 dirs15058 has 106957 files and 4 dirs15117 has 106957 files and 4 dirs15118 has 106957 files and 4 dirs15119 has 106957 files and 4 dirs

每个子线程打开的文件数量是一样的,进入任意1个子线程的 fd 目录,

[root@centos6564‐220 fd]# pwd
/proc/15432/task/15120/fd
[root@centos6564‐220 fd]# ls | wc ‐l
85286#每一个fd都是1个mysql文件,看命名格式是分区表
[root@centos6564‐220 fd]# ll 39326
lrwx‐‐‐‐‐‐ 1 root root 64 Jul 31 01:34 39326 ‐> /data/tokudb/_*_sql_204d_
542_P_p20161105_188_status_3f14ef598_1_1d.tokudb

4、结论

登录数据库查看 information_schema.partitions ,发现了100多个分区表,每个表1000个分区起步。

这套实例是其他部门半路转交给我们的,该组同学使用 mysql 最大的特点就是喜欢创建分区表。

另外,诊断全程 free -g 显示空闲物理内存为0,但是 mysqld 并没有因此 OOM ,这是因为被额外消耗的那16G内存全属于可回收类型,可以被其他内存请求复用

故障分析 | 一条du命令引发的内存不足报警相关推荐

  1. 一条nginx命令引发的对于容器的思考

    去年的时候写了一篇原创<前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)>, 我自认为这篇生产实践是对大前端. 容器化.CI/CD的得意之作. 对于前后端分离的 ...

  2. 利用linux的df和du命令查看文件和目录的内存占用

    版权声明:本文为博主原创文章,转载请超链接注明出处.    https://blog.csdn.net/ljc1026774829/article/details/74935658 当磁盘大小超过标准 ...

  3. 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式

    单例模式引发的内存泄漏: 多年来, 使用Plumbr进行性能监控时,我遇到了数百个资源泄漏引起的性能问题. 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题. 首先,我以电影播放器​​应用 ...

  4. 命令df,命令du详解及内存单位转换

    一,内存单位转换 Byte 字节的意思 B是一个电脑存储的基本单位(字节); 1个英文字符是1个字节,也就是1B; 1个汉字为2个字符,也就是2B; 1024B=1KB 1024KB=1MB 1024 ...

  5. 3周第4次课 df、du命令 fdisk磁盘分区

    一.df命令 作用:查看文件系统磁盘空间使用情况.可以不加任何参数,默认按 k 为单位显示 . [root@centos701 ~]# df     (不带任何参数显示的单位为 KB) 文件系统中包含 ...

  6. 系统管理员应该知道的 20 条 Linux 命令

    微信上看到的一篇文章,觉得挺适合非专业人士的,转载过来 https://my.oschina.net/editorial-story/blog/1499026 摘要: 如果您的应用程序不工作,或者您希 ...

  7. 系统管理员应该知道的20条Linux命令

    如果您的应用程序不工作,或者您希望在寻找更多信息,这 20 个命令将派上用场. 在这个全新的工具和多样化的开发环境井喷的大环境下,任何开发者和工程师都有必要学习一些基本的系统管理命令.特定的命令和工具 ...

  8. df命令、du命令、磁盘分区(fdisk命令)

    df命令 用于查看已挂载磁盘的总容量.使用容量.属于容量:不加参数以kb为单位显示: 实验1: [root@shu-test ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/s ...

  9. 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区

    2019独角兽企业重金招聘Python工程师标准>>> df命令 命令df(disk filesystem)用于查看盘的信息 默认以K为单位: [root@linux-128 ~]# ...

最新文章

  1. IT大数据服务管理高级课程(IT服务,大数据,云计算,智能城市)
  2. 【✅windows奇怪的知识增加了✅】windows系统下快速删除海量小文件方法
  3. 中运量71路线路图_双语导乘对标“航空式服务”,71路中运量车队服务进博会出“新招”...
  4. ssh主机之间建立互信 --免密码
  5. html怎么在图片上加文字_怎么把图片文字转换成word文档
  6. Hyper-V + CentOS7 网络设置(视频教程)
  7. java文本域 图片_java swing中给面板或者文本域设置背景图片的方法!
  8. 【NeurIPS 2019】最大熵的蒙特卡洛规划算法
  9. deque和map java 效率_[],List,Set,Map,Table,Queue,Deque,Stack性能分析
  10. 如何将MID音乐转换成MP3
  11. 小米笔记本电脑键盘卡键维修
  12. 鸿蒙系统源码获取_Hi3861_HI3516DV编译环境搭建记录
  13. Java实现DFA算法敏感词过滤
  14. 龙果学院mysql分布式集群代码_MySQL分布式集群搭建
  15. 软件测试方法(单元测试、集成测试、系统测试、确认测试)
  16. java 掩码 iP与位数的转化
  17. Notepad++ 一键格式化php代码
  18. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(三):分类
  19. 四天工作制究竟香不香;复旦发布类ChatGPT模型Moss;苹果上新348元省电保护膜 | EA周报...
  20. 案例总结:京东图书信息爬取

热门文章

  1. https证书沒有生效,vpn访问证书生效
  2. QT:QChart设置
  3. 书中的阿甘和电影中的阿甘
  4. Linux系统下MongoDB安装教程
  5. touch bar的4个使用小技巧
  6. 关于如何使用动态拨号歪ps的图文教程
  7. 频繁跳槽涨工资?会影响征信的!| 畅言
  8. NoSQL数据库笔谈(1)
  9. 种群优化算法:细菌觅食优化
  10. 搭建情人节表白网站(超详细过程,包教包会)