zoukankan      html  css  js  c++  java
  • Web服务器磁盘满故障

    问题:

    硬盘显示被写满,但是用du -sh /*查看时占用硬盘空间之和还远小于硬盘大小,即找不到硬盘分区是怎么被写满的。
    今天下午接到同事紧急求助,说生产线服务器硬盘满了。该删的日志都删掉了。可空间还是满的,情况危急啊。这个问题,在多年以前直接和间接的遇到过1-2次。以前太懒惰了,这次记录下来和大家分享。


    相关日志如下:

    █ 查看硬盘分区大小

    1 [root@www ~]# cat /etc/redhat-release 
    2 CentOS release 6.4 (Final)
    3 [root@www ~]# df -h
    4 Filesystem            Size  Used Avail Use% Mounted on
    5 /dev/sda3             117G  111G     0 100% /
    6 /dev/sda1             145M   12M  126M   9% /boot
    7 tmpfs                 3.0G     0  3.0G   0% /dev/shm

    这是一台web服务器(apache+tomcat+mysql)
    通过dh -h命令查看 总大小117G,使用了111G

     1 [root@www /]# fdisk -l
     2 
     3 Disk /dev/sda: 146.8 GB, 146815733760 bytes
     4 255 heads, 63 sectors/track, 17849 cylinders
     5 Units = cylinders of 16065 * 512 = 8225280 bytes
     6 
     7    Device Boot      Start         End      Blocks   Id  System
     8 /dev/sda1   *           1          19      152586   83  Linux
     9 /dev/sda2              20        2108    16779892+  82  Linux swap / Solaris
    10 /dev/sda3            2109       17849   126439582+  83  Linux
    11 [root@www /]# fdisk -l /dev/sda3 12 13 Disk /dev/sda3: 129.4 GB, 129474132480 bytes 14 255 heads, 63 sectors/track, 15741 cylinders 15 Units = cylinders of 16065 * 512 = 8225280 bytes 16 17 Disk /dev/sda3 doesn't contain a valid partition table

    ==========================================================================================
    █ 使用du命令查看到底哪些目录占用了空间

    [root@www /]# du -sh /*
    8.6M    /bin
    6.1M    /boot
    2.8G    /data ===》这里是DB目录
    124K    /dev
    60M     /etc
    1.6G    /home ===》这里是日志目录
    120M    /lib
    24M     /lib64
    16K     /lost+found
    8.0K    /media
    0       /misc
    12K     /mnt
    0       /net
    8.0K    /opt
    0       /proc
    614M    /root
    35M     /sbin
    8.0K    /selinux
    24K     /server
    8.0K    /srv
    0       /sys
    24K     /tmp
    2.5G    /usr
    29G     /var  ==》这里是www目录

    可以看出,上面所有目录之和 远小于总的空间占用111G,是什么占用了硬盘,还查不到呢?


    解答:

    出现上面问题原因:
    在apache/tomcat服务在运行状态下,清空了运行服务的日志,这里是清理了当天或正在写入的apache及tomcat的日志文件,从而导致了上面问题。(有关原理细节见下文)引申下:一般情况下,大多数服务(包括脚本)在运行时,是不能删除当前正在写入的日志文件的。这点请大家要记牢。

    本文的解决办法:


    查找机器自身的服务,然后重起apache和tomcat。
    重起apache后:

    1 [root@www ]# df -h
    2 Filesystem            Size  Used Avail Use% Mounted on
    3 /dev/sda3             117G  109G  2.3G  98% /
    4 /dev/sda1             145M   12M  126M   9% /boot
    5 tmpfs                 3.0G     0  3.0G   0% /dev/shm

    重起tomcat后:

    [root@www ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             117G   38G   74G  34% /
    /dev/sda1             145M   12M  126M   9% /boot
    tmpfs                 3.0G     0  3.0G   0% /dev/shm

     上面问题原理分析:

    1、这是一个文件系统层面的技术
    
    2、当前 access.log 日志正被 apache 进程占用。通过 rm 命令删除 access.log,实际只删除了文件名(该日志文件应用记数不 0,因此空间不会被释放)
    
    3、rm 命令删除了 access.log 后 apache 依然写日志到 access.log 中,当开启 apache 进程是,已经通过 access.log 定位到文件的 inode 了就是说再写日志是不通过 access.log,因此,即使删除了 access.log,apache 依然写日志到 access.log 所在的 inode 节点,所以导致硬盘空间增加。
    
    4、因为删除了 access.log,所以,我们人类就看不到相关文件了,也就是说找不到该文件,du 也查不到。所以就会发现磁盘满而看不到什么文件撑满的硬盘,
  • 相关阅读:
    ZJNU 1129 The sum problem——中级
    用 PHP 实现 POP3 邮件的收取(3)
    用 PHP 实现 POP3 邮件的收取(2)
    PHP4 调用自己编写的 COM 组件
    用 PHPLIB 进行 Session 的管理和认证
    用 PHP 实现 POP3 邮件的收取(1)
    用 PHP 实现 POP3 邮件的解码(1)
    PHP 应用程序的性能优化
    PHP功能齐全的发送邮件类
    怎样在 php 中使用 PDF 文档功能
  • 原文地址:https://www.cnblogs.com/luoahong/p/6197842.html
Copyright © 2011-2022 走看看