服務器CPU使用率過高的處理

最近發現公司服務器搭建的網站訪問緩慢,服務器輸入命令也反應慢,處理步驟如下:

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 依然有那文件,也是標註被刪除的文件,進程號都一致了,關掉相應應用程序,查看此文件也不在了,啓動應用又出現,此文件是應用自動產生,沒辦法刪除掉,確實還沒解決這個問題??????

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章