web服務器磁盤滿故障深刻解析

#########################################################
# 硬盤顯示被寫滿可是用du -sh /*查看時佔用硬盤空間之和還遠
#小於硬盤大小問的解決
#date:2010-06-09
#做者:老男孩---《老男孩linux就業培訓中心 》
#QQ:31333741 MAIL:oldboy521@hotmail.com
#QQ交流羣:45039636    
#blog: http://oldboy.blog.51cto.com
#psite: http://oldboy.cc(即將開放)
#pblog:http://blog.etiantian.org
##########################################################html


問題:硬盤顯示被寫滿,可是用du -sh /*查看時佔用硬盤空間之和還遠小於硬盤大小
即找不到硬盤分區是怎麼被寫滿的。mysql

今天下午接到一學生緊急求助,說生產線服務器硬盤滿了。該刪的日誌都刪掉了。可空間仍是滿的,狀況危急啊。這個問題,在多年之前直接和間接的遇到過3-4次。之前太懶惰了,此次記錄下來和你們分享。linux


相關日誌以下:web

█ 查看硬盤分區大小
[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 -lsql

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

   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/sda3tomcat

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

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的日誌文件,從而致使了上面問題。(有關原理細節見下文)app

引伸下:
通常狀況下,大多數服務(包括腳本)在運行時,是不能刪除當前正在寫入的日誌文件的。這點請你們要記牢。

本文的解決辦法:
查找機器自身的服務,而後重起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
 

 

刪除文件原理圖:

老男孩運維班28期上述案例實戰模擬:
(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 n 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)解決問題
一、請先停掉模擬訪問測試腳本
forn in `seq 100000`;do curl -s 127.0.0.1 >/dev/null;done
二、重啓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
相關文章
相關標籤/搜索