[实践OK]因删除的文件被系统进程打开,那么文件实际上并没有被删除,因此空间没有被释放,出现Linux下文件已删空间还是不足,经常遇到文件已经删除,但是空间因进程还在并没有释放的原因,一个队列进程把磁盘写满后,即使杀死PHP队列进程和对应的大文件后df -h的/ 100%占满,经lsof |grep "Remote.log"发现是Filebeat,一文件多进程读取导致。
大多原因是删除的文件被系统进程打开,那么文件实际上并没有被删除,因此空间没有被释放。
三次发现类似文件:
lsof -n /sec_syslog/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1228 root 11w REG 253,17 701955294 9437186 /sec_syslog/2024-05-05/10.71.59.14.log (deleted)
rsyslogd 1228 root 26w REG 253,17 21333 9437187 /sec_syslog/2024-05-05/127.0.0.1.log (deleted)
rsyslogd 1228 root 27w REG 253,17 40433209822 6553602 /sec_syslog/2024-05-06/10.71.59.14.log (deleted)
猜测是因为sec_syslog导致的,以下得到验证:
lsof -nPp 1228|grep sec_syslog
rsyslogd 1228 root 11w REG 253,17 701955294 9437186 /sec_syslog/2024-05-05/10.71.59.14.log (deleted)
rsyslogd 1228 root 26w REG 253,17 21333 9437187 /sec_syslog/2024-05-05/127.0.0.1.log (deleted)
rsyslogd 1228 root 27w REG 253,17 40433209822 6553602 /sec_syslog/2024-05-06/10.71.59.14.log (deleted)
rsyslogd 1228 root 28w REG 253,17 4649024 6553603 /sec_syslog/2024-05-06/127.0.0.1.log (deleted)
rsyslogd 1228 root 29w REG 253,17 3681387 2883586 /sec_syslog/2024-05-07/127.0.0.1.log (deleted)
rsyslogd 1228 root 30w REG 253,17 119666961091 2883587 /sec_syslog/2024-05-07/10.71.59.14.log (deleted)
rsyslogd 1228 root 31w REG 253,17 5869568 6946818 /sec_syslog/2024-05-08/127.0.0.1.log (deleted)
rsyslogd 1228 root 32w REG 253,17 50329927680 6946819 /sec_syslog/2024-05-08/10.71.59.14.log (deleted)
重启后,也就好了:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vdb1 197G 78M 187G 1% /sec_syslog
二次发现类似问题:还得靠lsof -n / |grep deleted ,操作如下:
删了大文件,但是这个文件没有释放,ls -n / |grep deleted 反查到
lsof -n / |grep deleted
baserepor 3827 root 2w REG 253,1 0 2492090 /tmp/xuoasefasd.err (deleted)
tshark 47796 root 5r REG 253,1 14106508896 2492042 /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm (deleted)
dumpcap 47802 root 4u REG 253,1 14106508896 2492042 /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm (deleted)
查命令历史:
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1056 [2020-10-15 11:52:14] cd wireshark_pcapng_eth0_20201015103006_KWTDIm
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1057 [2020-10-15 11:52:17] tail -f wireshark_pcapng_eth0_20201015103006_KWTDIm
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1058 [2020-10-15 11:52:21] ls
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1059 [2020-10-15 11:52:24] rm -rf wireshark_pcapng_eth0_20201015103006_KWTDIm
再次确认删了,但是磁盘空间还在:
ls -lart /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm
ls: cannot access /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm: No such file or directory
由于是tahshrk,估计tcpdump是它调用起来的,应该也是,查看进程名:
cat /proc/47796/status |grep Name
Name: tshark
ps -eo"pid,ppid,gid,sid,tty,cmd" --forest|less
1238 1 0 1238 ? /usr/sbin/sshd -D
42045 1238 0 42045 ? \_ sshd: xiangdong [priv]
42047 42045 1040 42045 ? | \_ sshd: xiangdong@pts/0,pts/1,pts/2,pts/3
47537 42047 1040 47537 pts/1 | \_ -bash
47585 47537 1040 47537 pts/1 | | \_ sudo su -
47586 47585 0 47537 pts/1 | | \_ su -
47587 47586 0 47537 pts/1 | | \_ -bash
47628 47587 0 47537 pts/1 | | \_ sudo su -
47629 47628 0 47537 pts/1 | | \_ su -
47630 47629 0 47537 pts/1 | | \_ -bash
47796 47630 0 47537 pts/1 | | \_ tshark -n -t a -R http.request -T fields -e frame.time -e ip.src -e http.host -e http.request.method -e http.request.uri
47802 47796 0 47537 pts/1 | | \_ /sbin/dumpcap -n -i eth0 -Z none
果然:
root 47796 47630 2 10:30 pts/1 00:04:51 | | \_ tshark -n -t a -R http.request -T fields -e frame.time -e ip.src -e http.host -e http.request.method -e http.request.uri
root 47802 47796 0 10:30 pts/1 00:00:36 | | \_ /sbin/dumpcap -n -i eth0 -Z none
杀了它就好了,磁盘就释放了:
df -h
/dev/vda1 40G 37G 583M 99% /
变为:
pkill tshark
df -h
/dev/vda1 40G 24G 14G 64% /
告诉我们要记得退出tshark,别让它后台运行,删文件前用 lsof wireshark_pcapng_eth0_20201015103006_KWTDIm 看这个tshak进程还在不在。
来自:https://www.cnblogs.com/zhangrongfei/p/12463466.html
经过lsof直接看文件谁打开了:#lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1994 root 6w REG 253,0 39892 101327940 /var/log/messages
背景:机器长时间运行往往磁盘空间满了,但是删除了还是占用很大空间和没删除几乎一样,怎么办?
运维监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实满了,这里先说一下服务器的一些删除策略,由于 linux 没有回收站功能,所以线上服务器上所有要删除的文件都会先移到系统 / tmp 目录下,然后定期清除 / tmp 目录下的数据。这个策略本身没有什么问题,但是通过检查发现这台服务器的系统分区中并没有单独划分 / tmp 分区,这样 / tmp 下的数据其实占用根分区的空间,既然找到了问题,那么删除 / tmp 目录下一些占用空间较大的数据文件即可。
发现真出现了,一个队列进程把磁盘写满后,即使杀死PHP队列进程和对应的大文件后df -h的/ 100%占满,经lsof |grep "Remote.log"发现是Filebeat:
实践解决如下,确定杀光了:
ps aux |grep Daemon |awk '{print $2}' |xargs kill -9
kill 10379: No such process
空间还是占用100%,用 lsof查看,这个命令还可以用来看端口对应的程序,如:
/usr/sbin/lsof -i tcp:5902
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 24560 root 9u IPv4 763173 0t0 TCP *:5902 (LISTEN)
Xvnc 24560 root 10u IPv6 763174 0t0 TCP *:5902 (LISTEN)
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 41167 root 18u IPv4 249906712 0t0 TCP *:http (LISTEN)
lsof |grep "Remote.log" 发现是filebeat :
重启一下Filebeat下吧:
/etc/init.d/filebeat restart
Stopping filebeat:
Config OK
Stopping filebeat: [ OK ]
2018/03/22 08:29:07.965771 config.go:86: INFO Additional configs loaded from: /etc/filebeat/conf.d/sec.yml
Config OK [ OK ]
再看这个文件还在,是新生成的,但是空间就变正常了。AddTime:2018-03-22
=============================================================================
# du -sh /tmp/* | sort -nr |head -3
通过命令发现在 / tmp 目录下有个 66G 大小的文件 access_log,这个文件应该是 apache 产生的访问日志文件,从日志大小来看,应该是很久没有清理的 apache 日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除命令,
# rm /tmp/access_Iog
# df -h
从输出来看,根分区空间仍然没有释放,这是怎么回事
一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据,要理解这个问题,就需要知道 linux 下文件的存储机制和存储结构。
一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的 meta-data 中,在将数据删除后,这个指针就从 meta-data 中清除了,而数据部分存储在磁盘中。在将数据对应的指针从 meta-data 中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除 access_log 文件后,空间还没有释放,就是因为 httpd 进程还在一直向这个文件写入内容,导致虽然删除了 access_Ilog 文件,但是由于进程锁定,文件对应的指针部分并未从 meta-data 中清除,而由于指针并未删除,系统内核就认为文件并未被删除,因此通过 df 命令查询空间并未释放。
问题排查:
既然有了解决思路,那么接下来看看是否有进程一直在向 access_log 文件中写入数据,这里需要用到 linux 下的 losf 命令,通过这个命令可以获取一个仍然被应用程序占用的已删除文件列表
# lsof | grep delete
从输出可以看出,/tmp/access_log 文件被进程 httpd 锁定,而 httpd 进程还一直向这个文件写入日志数据,最后一列的‘deleted’状态说明这个日志文件已经被删除,但是由于进程还在一直向此文件写入数据,因此空间并未释放。
解决问题:
到这里问题就基本排查清楚了,解决这一类问题的方法有很多,最简单的方法就是关闭或者重启 httpd 进程,当然重启操作系统也可以。不过这些并不是最好的办法,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:
# echo “”>/tmp/access_log
通过这种方法,磁盘空间不但可以马上释放,也可以保障进城继续向文件写入日志,这种方法经常用于在线清理 apache /tomcat/nginx 等 web 服务产生的日志文件。
摘自:http://mp.weixin.qq.com/s/AJtnz_CE3pmhoaMHm6HNXA
三次发现类似文件:
lsof -n /sec_syslog/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1228 root 11w REG 253,17 701955294 9437186 /sec_syslog/2024-05-05/10.71.59.14.log (deleted)
rsyslogd 1228 root 26w REG 253,17 21333 9437187 /sec_syslog/2024-05-05/127.0.0.1.log (deleted)
rsyslogd 1228 root 27w REG 253,17 40433209822 6553602 /sec_syslog/2024-05-06/10.71.59.14.log (deleted)
猜测是因为sec_syslog导致的,以下得到验证:
lsof -nPp 1228|grep sec_syslog
rsyslogd 1228 root 11w REG 253,17 701955294 9437186 /sec_syslog/2024-05-05/10.71.59.14.log (deleted)
rsyslogd 1228 root 26w REG 253,17 21333 9437187 /sec_syslog/2024-05-05/127.0.0.1.log (deleted)
rsyslogd 1228 root 27w REG 253,17 40433209822 6553602 /sec_syslog/2024-05-06/10.71.59.14.log (deleted)
rsyslogd 1228 root 28w REG 253,17 4649024 6553603 /sec_syslog/2024-05-06/127.0.0.1.log (deleted)
rsyslogd 1228 root 29w REG 253,17 3681387 2883586 /sec_syslog/2024-05-07/127.0.0.1.log (deleted)
rsyslogd 1228 root 30w REG 253,17 119666961091 2883587 /sec_syslog/2024-05-07/10.71.59.14.log (deleted)
rsyslogd 1228 root 31w REG 253,17 5869568 6946818 /sec_syslog/2024-05-08/127.0.0.1.log (deleted)
rsyslogd 1228 root 32w REG 253,17 50329927680 6946819 /sec_syslog/2024-05-08/10.71.59.14.log (deleted)
重启后,也就好了:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vdb1 197G 78M 187G 1% /sec_syslog
二次发现类似问题:还得靠lsof -n / |grep deleted ,操作如下:
删了大文件,但是这个文件没有释放,ls -n / |grep deleted 反查到
lsof -n / |grep deleted
baserepor 3827 root 2w REG 253,1 0 2492090 /tmp/xuoasefasd.err (deleted)
tshark 47796 root 5r REG 253,1 14106508896 2492042 /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm (deleted)
dumpcap 47802 root 4u REG 253,1 14106508896 2492042 /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm (deleted)
查命令历史:
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1056 [2020-10-15 11:52:14] cd wireshark_pcapng_eth0_20201015103006_KWTDIm
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1057 [2020-10-15 11:52:17] tail -f wireshark_pcapng_eth0_20201015103006_KWTDIm
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1058 [2020-10-15 11:52:21] ls
root_shell_cmd [xiangdong 10.4.12.52] [/tmp] 1059 [2020-10-15 11:52:24] rm -rf wireshark_pcapng_eth0_20201015103006_KWTDIm
再次确认删了,但是磁盘空间还在:
ls -lart /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm
ls: cannot access /tmp/wireshark_pcapng_eth0_20201015103006_KWTDIm: No such file or directory
由于是tahshrk,估计tcpdump是它调用起来的,应该也是,查看进程名:
cat /proc/47796/status |grep Name
Name: tshark
ps -eo"pid,ppid,gid,sid,tty,cmd" --forest|less
1238 1 0 1238 ? /usr/sbin/sshd -D
42045 1238 0 42045 ? \_ sshd: xiangdong [priv]
42047 42045 1040 42045 ? | \_ sshd: xiangdong@pts/0,pts/1,pts/2,pts/3
47537 42047 1040 47537 pts/1 | \_ -bash
47585 47537 1040 47537 pts/1 | | \_ sudo su -
47586 47585 0 47537 pts/1 | | \_ su -
47587 47586 0 47537 pts/1 | | \_ -bash
47628 47587 0 47537 pts/1 | | \_ sudo su -
47629 47628 0 47537 pts/1 | | \_ su -
47630 47629 0 47537 pts/1 | | \_ -bash
47796 47630 0 47537 pts/1 | | \_ tshark -n -t a -R http.request -T fields -e frame.time -e ip.src -e http.host -e http.request.method -e http.request.uri
47802 47796 0 47537 pts/1 | | \_ /sbin/dumpcap -n -i eth0 -Z none
果然:
root 47796 47630 2 10:30 pts/1 00:04:51 | | \_ tshark -n -t a -R http.request -T fields -e frame.time -e ip.src -e http.host -e http.request.method -e http.request.uri
root 47802 47796 0 10:30 pts/1 00:00:36 | | \_ /sbin/dumpcap -n -i eth0 -Z none
杀了它就好了,磁盘就释放了:
df -h
/dev/vda1 40G 37G 583M 99% /
变为:
pkill tshark
df -h
/dev/vda1 40G 24G 14G 64% /
告诉我们要记得退出tshark,别让它后台运行,删文件前用 lsof wireshark_pcapng_eth0_20201015103006_KWTDIm 看这个tshak进程还在不在。
来自:https://www.cnblogs.com/zhangrongfei/p/12463466.html
经过lsof直接看文件谁打开了:#lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1994 root 6w REG 253,0 39892 101327940 /var/log/messages
背景:机器长时间运行往往磁盘空间满了,但是删除了还是占用很大空间和没删除几乎一样,怎么办?
运维监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实满了,这里先说一下服务器的一些删除策略,由于 linux 没有回收站功能,所以线上服务器上所有要删除的文件都会先移到系统 / tmp 目录下,然后定期清除 / tmp 目录下的数据。这个策略本身没有什么问题,但是通过检查发现这台服务器的系统分区中并没有单独划分 / tmp 分区,这样 / tmp 下的数据其实占用根分区的空间,既然找到了问题,那么删除 / tmp 目录下一些占用空间较大的数据文件即可。
发现真出现了,一个队列进程把磁盘写满后,即使杀死PHP队列进程和对应的大文件后df -h的/ 100%占满,经lsof |grep "Remote.log"发现是Filebeat:
实践解决如下,确定杀光了:
ps aux |grep Daemon |awk '{print $2}' |xargs kill -9
kill 10379: No such process
空间还是占用100%,用 lsof查看,这个命令还可以用来看端口对应的程序,如:
/usr/sbin/lsof -i tcp:5902
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 24560 root 9u IPv4 763173 0t0 TCP *:5902 (LISTEN)
Xvnc 24560 root 10u IPv6 763174 0t0 TCP *:5902 (LISTEN)
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 41167 root 18u IPv4 249906712 0t0 TCP *:http (LISTEN)
lsof |grep "Remote.log" 发现是filebeat :
重启一下Filebeat下吧:
/etc/init.d/filebeat restart
Stopping filebeat:
Config OK
Stopping filebeat: [ OK ]
2018/03/22 08:29:07.965771 config.go:86: INFO Additional configs loaded from: /etc/filebeat/conf.d/sec.yml
Config OK [ OK ]
再看这个文件还在,是新生成的,但是空间就变正常了。AddTime:2018-03-22
=============================================================================
# du -sh /tmp/* | sort -nr |head -3
通过命令发现在 / tmp 目录下有个 66G 大小的文件 access_log,这个文件应该是 apache 产生的访问日志文件,从日志大小来看,应该是很久没有清理的 apache 日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除命令,
# rm /tmp/access_Iog
# df -h
从输出来看,根分区空间仍然没有释放,这是怎么回事
一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据,要理解这个问题,就需要知道 linux 下文件的存储机制和存储结构。
一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的 meta-data 中,在将数据删除后,这个指针就从 meta-data 中清除了,而数据部分存储在磁盘中。在将数据对应的指针从 meta-data 中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除 access_log 文件后,空间还没有释放,就是因为 httpd 进程还在一直向这个文件写入内容,导致虽然删除了 access_Ilog 文件,但是由于进程锁定,文件对应的指针部分并未从 meta-data 中清除,而由于指针并未删除,系统内核就认为文件并未被删除,因此通过 df 命令查询空间并未释放。
问题排查:
既然有了解决思路,那么接下来看看是否有进程一直在向 access_log 文件中写入数据,这里需要用到 linux 下的 losf 命令,通过这个命令可以获取一个仍然被应用程序占用的已删除文件列表
# lsof | grep delete
从输出可以看出,/tmp/access_log 文件被进程 httpd 锁定,而 httpd 进程还一直向这个文件写入日志数据,最后一列的‘deleted’状态说明这个日志文件已经被删除,但是由于进程还在一直向此文件写入数据,因此空间并未释放。
解决问题:
到这里问题就基本排查清楚了,解决这一类问题的方法有很多,最简单的方法就是关闭或者重启 httpd 进程,当然重启操作系统也可以。不过这些并不是最好的办法,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:
# echo “”>/tmp/access_log
通过这种方法,磁盘空间不但可以马上释放,也可以保障进城继续向文件写入日志,这种方法经常用于在线清理 apache /tomcat/nginx 等 web 服务产生的日志文件。
摘自:http://mp.weixin.qq.com/s/AJtnz_CE3pmhoaMHm6HNXA
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/9590/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2024-5-9 16:10
评论列表