故障分析一条du命令引发的内存不足报警
作者:任坤
现居珠海,先后担任专职 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 / `; do count=`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 `; do files=`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 dirs 17211 has 7653 files and 349 dirs 6053 has 7511 files and 384 dirs 18720 has 2289 files and 269 dirs sys has 1166 files and 119 dirs [root@centos6564‐220 tmp]# ps ‐ef | grep 15049 mysql 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=3306 root 24912 25232 0 01:10 pts/3 00:00:00 grep 15049
多尴尬,查半天居然还是 mysql 的问题。
统计/proc/15049下的子目录信息 dest=/proc/15049 for i in `ls $dest `; do files=`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 dirs fdinfo has 106921 files and 0 dirs net has 60 files and 3 dirs attr has 6 files and 0 dirs autogroup 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/task for i in `ls $dest `; do files=`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 dirs 15058 has 106957 files and 4 dirs 15117 has 106957 files and 4 dirs 15118 has 106957 files and 4 dirs 15119 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内存全属于可回收类型,可以被其他内存请求复用
中国知网知识的传播者变为垄断者?文大象知道编辑大象知道图互联网今天,又有一条新闻上了热搜,中科院将从20号起停用中国知网。根据网传消息,中国知网的续订费用近千万,导致很多高校不堪重负。对此,中科院图书馆相关负责人
饿了么修订非餐商户入驻及经营规则鞭牛士4月18日消息,日前,饿了么发布通知,拟对非餐商户的相关规则进行修订,将于2022年4月23日生效。本次调整范围为修订电商类商户的入驻资质要求,电商类型商户仅开放平台主动发起
财报点评比特数字2021财年转亏为盈,净利润490万美元4月18日,资本邦了解到,比特数字(BTBT。US)发布2021财年财报。2021财年,比特数字转亏为盈,净利润为490万美元,上一年同期为净亏损190万美元比特币挖矿营收为961
阿里副总裁双面人中文平台道歉,海外英文平台阴阳怪气读书时,与一位在外留学多年的老哥私交甚好。此人见识颇多,常语出惊人。再一次争论留学生是否应该归国的问题时,他的一段话令我至今记忆犹新。他说如果老娘有缺点,正常人只会私下吐槽或当面和
Linux权限管理1。修改文件访问权限Linux文件类型普通文件d目录文件b块特殊文件c字符特殊文件l符号链接,类似于windows里的快捷方式f命令管道s套接字文件字符权限的表示方法r代表可读w代
小米MIX4真的卖不动?12GB512GB跌至新低,终于等到了想要有优质的用机体验,自然需要选择高端机,因为高端机的颜值配置更加出色,但这类手机的售价普遍偏高。虽然选择高端机的用户预算比较多,但是谁也不想吃亏。高端机最大的特点就是售价高,难道
NFT投资需谨慎来源中工网工人日报经济观察原标题NFT投资需谨慎工人日报中工网记者杨召奎近日,中国互联网金融协会中国银行业协会中国证券业协会联合发布关于防范NFT相关金融风险的倡议(以下简称倡议)
百度副总裁吴甜文心大模型已应用于百度搜索等产品,开发者超6万人记者崔鹏近日,百度集团副总裁吴甜与界面新闻等多家媒体分享了百度文心大模型的最新进展。吴甜表示,2022年是文心大模型产业落地关键年,目前文心大模型已大规模应用于百度内部的各类产品,
阿联酋力促数字经济发展近日,阿联酋内阁批准一项包含30多项举措和计划的数字经济战略,并成立数字经济委员会,负责协调和帮助相关部门落实战略,以促进数字经济发展。我们的目标是在未来10年内,将数字经济对国内
新世界驾控旗舰智己L7正式上市,官宣售价36。88万元40。88万元4月17日,智己汽车公布新世界驾控旗舰智己L7以连续漂移43。646公里的成绩,成功摘冠电动汽车漂移距离最长吉尼斯世界纪录TM荣誉,为快速变革的电动化技术彻底颠覆传统豪华车游戏规则
英伟达威胁中国自动驾驶?专家国内真正愿意行动的没几个中国新能源汽车到处开花,个个都喊着自己有自动驾驶技术,但真正愿意行动的企业却没有几个。这句话出现在中国2022年电动汽车百人论坛大会上,而作为此次的演讲人专家和前工信部部长,谈及中