LINUX-df和du的统计结果不同

14 篇文章 0 订阅

一、起因

1.node_exporter日志过大

有一套TiDB集群,其中tikv的机器出现了磁盘报警,查看之后发现除了数据过多之外,还有node_exporter的日志过大的问题,日志内容如下

time="2023-03-06T06:00:18Z" level=info msg=" - netdev" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - netstat" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - nfs" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - nfsd" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - sockstat" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - stat" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - systemd" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - tcpstat" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - textfile" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - time" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - timex" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - uname" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - vmstat" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - xfs" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg=" - zfs" source="node_exporter.go:97"
time="2023-03-06T06:00:18Z" level=info msg="Listening on :9100" source="node_exporter.go:111"
time="2023-03-06T06:00:18Z" level=fatal msg="listen tcp :9100: bind: address already in use" source="node_exporter.go:114"

可以看到,这是因为tidb会无限重启node_exporter,但是9100的端口被占用,所以一直启动不起来

2.原因及解决

# 查看exporter进程
ps -ef|grep node_exporter
# 发现systemctl机器启动了exporter,停止进程
systemctl stop node_exporter
# 重命名就文件,删除文件并创建新文件(问题出现在这里,稍后解释)
mv node_exporter.log node_exporter_bak.log
# 等了一段时间后没有自动创建
touch node_exporter.log
rm node_exporter_bak.log

二、磁盘问题

1.结论

删除node_exporter_bak.log后我们发现磁盘占用并没有较小,du -sh的结果要少于df -h,那么是为什么造成这种结果呢,我们先来说下结论,关键问题在于我们上面的操作步骤

# 发现systemctl机器启动了exporter,停止进程,这一步的时候我们把systemctl启动的node_exporter给停了,也就是说9100端口不被占用了,那么tidb的node_exporter就能够正常启动
systemctl stop node_exporter
# tidb的node_exporter会跑几个进程,其中一个进程如下面所示
tee -i -a /data/tidb/tidb-deploy/monitor-9100/log/node_exporter.log
# 可以看到这个进程持有node_exporter.log的文件句柄,然后我们进行重命名文件,但是tidb的node_exporter的程序已经启动了,不会再次进行重启,所以重命名后这里的文件句柄并没有变,
mv node_exporter.log node_exporter_bak.log
#重命名之后变成了如下的情况
# tee -i -a /data/tidb/tidb-deploy/monitor-9100/log/node_exporter_bak.log
# 因为node_exporter_bak.log文件被进程持有,所以我们无法真正的删除它,即使ls看不到文件,文件实际还存在,

***正常的操作步骤
# 如果操作步骤是在systemctl stop node_exporter之前重命名文件,这时候就是因为tidb的node_exporter会无限重启,tee这个进程就回持有新生成的node_exporter.log文件,而不会继续持有node_exporter_bak.log,就会正常删除

2.排查和解决

2.1 排查

# 查看已经删除的但还被进程占用的文件句柄
lsof | grep deleted
# 可以看到文件句柄被如下进程占用
tee -i -a /data/tidb/tidb-deploy/monitor-9100/log/node_exporter_bak.log

2.2 解决
直接kill掉node_exporter的进程,这时候文件就会释放,然后tidb会自动重新拉起node_exporter,至此,问题已经成功解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值