zoukankan      html  css  js  c++  java
  • Web服务器磁盘满深入解析及解决

    #########################################################
    # 硬盘显示被写满但是用du -sh /*查看时占用硬盘空间之和还远
    #小于硬盘大小问的解决
    #date:2010-06-09
    #作者:老男孩---《老男孩linux就业培训中心 》
    #QQ:31333741
    #QQ交流群:385168604   
    #blog: http://oldboy.blog.51cto.com
    ##########################################################


    问题:硬盘显示被写满,但是用du -sh /*查看时占用硬盘空间之和还远小于硬盘大小
    即找不到硬盘分区是怎么被写满的。

    今天下午接到一学生紧急求助,说生产线服务器硬盘满了。该删的日志都删掉了。可空间还是满的,情况危急啊。这个问题,在多年以前直接和间接的遇到过3-4次。以前太懒惰了,这次记录下来和大家分享。


    相关日志如下:

    █ 查看硬盘分区大小
    [root@www ~]# cat /etc/redhat-release 
    CentOS release 5.3 (Final)
    [root@www ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             117G  111G     0 100% /
    /dev/sda1             145M   12M  126M   9% /boot
    tmpfs                 3.0G     0  3.0G   0% /dev/shm
    这是一台web服务器(apache+tomcat+mysql)
    通过dh -h命令查看 总大小117G,使用了111G
    [root@www /]# fdisk -l

    Disk /dev/sda: 146.8 GB, 146815733760 bytes
    255 heads, 63 sectors/track, 17849 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          19      152586   83  Linux
    /dev/sda2              20        2108    16779892+  82  Linux swap / Solaris
    /dev/sda3            2109       17849   126439582+  83  Linux
    [root@www /]# fdisk -l /dev/sda3

    Disk /dev/sda3: 129.4 GB, 129474132480 bytes
    255 heads, 63 sectors/track, 15741 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    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后:
    [root@www 07]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             117G  109G  2.3G  98% /
    /dev/sda1             145M   12M  126M   9% /boot
    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.png

    1
    老男孩运维班28期上述案例实战模拟:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    (1)安装httpd web服务
      yum install httpd -y
      /etc/init.d/httpd start
      lsof -i :80
      /etc/init.d/iptables stop
      cd/etc/httpd/conf 编辑配置文件,让日志记录到/app/logs下面。
    sed -i's@#CustomLog logs/access_log common@CustomLog /app/logs/access_logcommon@g' httpd.conf 
     (2)创建一个小的文件系统,用于存放上述access_log日志。
      dd if=/dev/zero of=/dev/sdc bs=8K  count=10
      ls -l /dev/sdc
      mkfs -t ext4 /dev/sdc
      tune2fs -c -1 /dev/sdc
      mount -o loop /dev/sdc /app/logs
      echo oldboy >/var/www/html/index.html
     (3)重启httpd服务,确保日志记录到了上述文件系统挂载的/app/log下面
      /etc/init.d/httpd restart
     (4)写个循环脚本访问httpd,使得httpd日志充满/app/logs整个空间。
     for in `seq 100000`;do curl -s 127.0.0.1>/dev/null;done
    [root@C64log]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             7.2G  2.0G 4.9G  30% /
    tmpfs                 244M     0 244M   0% /dev/shm
    /dev/sda1             194M   54M 131M  30% /boot
    /dev/sdc               73K   73K    0 100% /app/log
         (5)错误的删除方案
    [root@oldboylogs]# rm -f /app/logs/access_log
    [root@oldboylogs]# df -h
    Filesystem      Size Used Avail Use% Mounted on
    /dev/sda3       8.8G 1.6G  6.9G  19% /
    tmpfs           491M     0 491M   0% /dev/shm
    /dev/sda1       190M  36M  145M  20% /boot
    /dev/sdc         73K  68K  1.0K  99% /app/logs
    提示:此时空间并未被释放,你可知道原因?
        查看被删除的但仍由进程占用的文件名。
    [root@oldboylogs]# lsof|grep del
    httpd      6148     root    7w      REG   7,0    55260         12 /app/logs/access_log (deleted)
    httpd     38178   apache    7w      REG   7,0    55260         12 /app/logs/access_log (deleted)
    httpd     38483   apache    7w      REG   7,0    55260         12 /app/logs/access_log (deleted)
    httpd     38484   apache    7w      REG   7,0    55260         12 /app/logs/access_log (deleted)
    httpd     38752   apache    7w      REG   7,0    55260         12 /app/logs/access_log (deleted)
     (5)解决问题
    1、请先停掉模拟访问测试脚本
    forn in `seq 100000`;do curl -s 127.0.0.1 >/dev/null;done
    2、重启Http服务
    [root@C64log]# /etc/init.d/httpd restart
    Stoppinghttpd:                                           [  OK  ]
    Startinghttpd:                                          [ OK  ]
     (6)查看处理结果
    [root@C64log]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             7.2G  2.0G 4.9G  30% /
    tmpfs                 244M     0 244M   0% /dev/shm
    /dev/sda1             194M   54M 131M  30% /boot
    /dev/sdc               73K   14K  55K  21%/app/logs
    (7)较好的处理方案
    清空日志而不删除日志。
    >/app/logs/access_log
  • 相关阅读:
    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js
  • 原文地址:https://www.cnblogs.com/nyfz/p/9220145.html
Copyright © 2011-2022 走看看