最近發現公司服務器搭建的網站訪問緩慢,服務器輸入命令也反應慢,處理步驟如下:
1、通過top命令查看服務器CPU、內存、IO等使用情況
發現CPU基本在80%以上;內存還好,有富餘;CPU平均加載率Load Average也是達到40左右
2、通過vmstat、iostat參看相關參數,確認是CPU佔用很高,CPU不夠用,當時以爲服務器CPU被用完了,但是應用不是很多,兩CPU是夠用的
3、後來慢慢看進程和服務線程以及端口號佔用和包發送,(w、procinfo、ps、uptime、netstat),只看到被應用的日誌佔用大多的CPU資源
4、後來百度了一下,有個類似的帖子,《解決centos刪除文件後沒有釋放空間》(來源:blog.51cto.com 作者:cj397428869)
4.1、其帖子如下:
現象:
發現當前磁盤空間使用情況:
[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup
通過下面的命令找到無用的文件,然後刪除
[root@ticketb ~]# find /home/oracle/admin/dbticb/udump/ -name"dbticb_*.trc" -mtime +50 | xargs rm -rf
然後在查看磁盤空間使用情況,發現沒有/home空間沒有變化
[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup
這個鬱悶啊,明明刪除文件了,怎麼空間沒有被釋放啊,rm命令應該是直接刪除啊,在查看下/home下還有什麼佔用空間
[root@ticketb ~]# du -h --max-depth=1 /home
16K /home/lost+found
2.6G /home/oracle
2.6G /home
可這裏顯示空間已經釋放了啊,於是google下,
未釋放磁盤空間原因:
在Linux或者Unix系統中,通過rm或者文件管理器刪除文件將會從文件系統的目錄結構上解除鏈接(unlink).然而如果文件是被
打開的(有一個進程正在使用),那麼進程將仍然可以讀取該文件,磁盤空間也一直被佔用。而我刪除的是oracle的告警log文件
刪除的時候文件應該正在被使用
解決方法
首先獲得一個已經被刪除但是仍然被應用程序佔用的文件列表,如下所示:
[root@ticketb ~]# lsof |grep deleted
oracle 12639 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc(deleted)
oracle 12639 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 12639 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 12639 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 12641 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc (deleted)
oracle 12641 oracle 6w REG 253,0 16749822091 215748/home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)
。
。
oracle 23492 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 23492 oracle 7u REG 253,0 0 36282/home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 23492 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log(deleted)
oracle 23494 oracle 10u REG 253,0 0 36307 /home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstrmandb(deleted)
從輸出結果可以看到/home/oracle/admin/dbticb/bdump/alert_dbticb.log還被使用,未被釋放空間
如何讓進程釋放呢?
一種方法是kill掉相應的進程,或者停掉使用這個文件的應用,讓os自動回收磁盤空間
我這個環境有很多進程在使用的這個文件,停掉進程有點麻煩,再有就是風險很大
當linux打開一個文件的時候,Linux內核會爲每一個進程在/proc/ 『/proc/nnnn/fd/目錄(nnnn爲pid)』建立一個以其pid
爲名的目錄用來保存進程的相關信息,而其子目錄fd保存的是該進程打開的所有文件的fd(fd:filedescriptor)。
kill進程是通過截斷proc文件系統中的文件可以強制要求系統回收分配給正在使用的的文件。
這是一項高級技術,僅到管理員確定不會對運行中的進程造成影響時使用。應用程序對這種方
式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題
所以我還是採用停應用來解決
restart oracle數據庫,發現/home/oracle/admin/dbticb/bdump/alert_dbticb.log對應的空間被釋放
在查看磁盤空間的使用情況,發現空間已經回收了
[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 2.6G 16G 15% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup
ok,問題解決,然後做下收尾工作即可
-------------------------------------------------------------------------------------------------
4.2、我用:ll /proc/pid/fd,查看了下這目錄的文件,很多全是紅色高亮的文件,而且是被標註爲已經被刪除了的
4.3、我又使用命令 :lsof | grep deleted查詢了下被刪除而沒被及時收回空間的文件
4.4、在確認沒有用的情況下kill -9 pid直接殺掉進程,刪除部分進程後,top系統,CPU使用率下降不少,繼續將其他被刪除的文件清理出進程。
4.5、CPU太平了,降到1%以下,負載的數值也從原來的40降到了0.X。
不過有個問題是:有兩個文件標註了被刪除的,但是指向的軟連接卻是現在用起的應用下的文件,查了下現在應用的進程號和被刪除進程好對比,兩者不同,我就將其直接kill掉,卻發現運行中的應用程序掛了,重啓應用程序後,在 lsof | grep deleted 依然有那文件,也是標註被刪除的文件,進程號都一致了,關掉相應應用程序,查看此文件也不在了,啓動應用又出現,此文件是應用自動產生,沒辦法刪除掉,確實還沒解決這個問題??????