面試官常考的MySQL索引(MySQL進階)
736
2022-05-28
大半夜接到線上一服務器磁盤占用率超過90%的短信,需要立即處理。一般這種情況都是線上異常,當天日志打太多,無法自動刪掉的。上來第一反應就是查我們規范java應用日志目錄,居然沒有文件,再查,居然連java進程都沒有,原來不是java應用,不過沒關系,干一年運維也不是白干的,還是有其他方法可以查的,在此記錄下整個排查過程。
用df -h看下是哪個分區比較大,我司應用包都是布在/home目錄下的。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 18G 5.0G 12G 30% / /dev/xvda1 247M 25M 210M 11% /boot tmpfs 7.4G 248K 7.4G 1% /dev/shm /dev/xvdb1 50G 45G 5.3G 90% /home
1
2
3
4
5
6
然后cd到home目錄下,來看看哪個文檔比較大,我最常用的命令就是du -h --max-depth=1,通常可以直接找到哪個目錄占空間比較大,不過今天詭異了。。
$sudo du -h --max-depth=1 40K ./***.** #這是別人的home路徑,一堆賬號,略去 . . . 40K ./***.** 1.9G . #所有文件占用總空間
1
2
3
4
5
6
7
這就很詭異了,上面提示我/home目錄已使用45G,實際上只用了1.9G,無果。不查大目錄了,我找找到有什么大的文件,查文件,最好用的就是find命令了,因為平時不怎么用,對其參數還是不大了解,所以網上搜了一把,找到下面這條命令(果然學習還是得靠問題驅動)。
find . -type f -size +800M 查找當前目錄下大于800m的文件,依舊無果,改成100m,無果。 然后不按大小,我只查有沒有*.log.*的文件(有時候也是小文件太多,導致磁盤滿),依舊無果,額。。。已有知識有點不夠用了。
看了下監控系統,發現磁盤占用空間一直在增長,肯定一直是有什么進程在寫文件,那我就看看服務器上的進程吧。 常用命令 ps、pstree 這里我先用ps看了下,出來的內容太多,不方便看,遂改用pstree,得到如下結果。
$ sudo pstree init─┬─DragoonAgent─┬─DragoonAgent │ ├─2*[DragoonAgent───10*[{DragoonAgent}]] │ ├─DragoonAgent───7*[{DragoonAgent}] │ └─DragoonAgent───2*[{DragoonAgent}] ├─aegisinc_cli───11*[{aegisinc_cli}] ├─agetty ├─atd ├─crond ├─gshelld───3*[{gshelld}] ├─irqbalance ├─lldpd───lldpd ├─6*[mingetty] ├─nginx-proxy───4*[nginx-proxy] ├─node─┬─4*[node─┬─phantomjs───3*[{phantomjs}]] │ │ └─5*[{node}]] │ ├─node───5*[{node}] │ └─5*[{node}] ├─ntpd ├─portmap ├─sshd───sshd───sshd───bash───pstree ├─staragentd─┬─staragent-core───22*[{staragent-core}] │ └─staragent-ppf─┬─logagent───12*[{logagent}] │ └─11*[{staragent-ppf}] ├─syslog-ng───syslog-ng └─udevd
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
排除系統進程,看到有nginx-proxy(我司常用的包),還有一個node,我猜應該是個nodejs應用(表示完全不了解這鬼東西),pstree -p,可以顯示pid的,有了pid,我們就可以查這些進程在寫入哪些文件了。
這里我查到pid是 10163,讓我來看下這鬼進程在寫哪些文件,使用如下命令。
$ ls -al /proc/10163/fd total 0 dr-x------ 2 admin admin 0 Jul 8 19:56 . dr-xr-xr-x 7 admin admin 0 Jan 20 2015 .. lr-x------ 1 admin admin 64 Sep 12 16:16 0 -> /dev/null l-wx------ 1 admin admin 64 Sep 12 16:16 1 -> /home/admin/snapshot-kgb/logs/nodejs_stdout.log (deleted) lrwx------ 1 admin admin 64 Sep 10 01:39 10 -> socket:[178406733] ###內容有點多,刪去一部分。。。。 lrwx------ 1 admin admin 64 Sep 10 01:39 15 -> socket:[150611725] l-wx------ 1 admin admin 64 Sep 9 02:33 2 -> /home/admin/snapshot-kgb/logs/nodejs_stdout.log (deleted) lrwx------ 1 admin admin 64 Sep 10 01:39 8 -> anon_inode:[eventfd] lr-x------ 1 admin admin 64 Sep 10 01:39 9 -> /
1
2
3
4
5
6
7
8
9
10
11
12
這里有倆文件,末尾標示(deleted),然后想到看下別人的操作記錄,發現今天同事有上來刪過這倆文件,但他沒有重啟進程。 linux刪除正在被寫入的文件之后仍是會占用磁盤空間的,這也解釋了開始為何我用du、df、find為什么查不到大文件。
接下來就是如何處理磁盤空間仍被占用的問題了,只需要重啟下node進程就好了,咋重啟??? 我不會啊!!尷尬。。。嘗試清空下該文件 echo '' > /home/admin/snapshot-kgb/logs/nodejs_stdout.log cat /dev/null > /home/admin/snapshot-kgb/logs/nodejs_stdout.log 無果。。。。
峰回路轉,突然在服務器上發現了重啟進程的腳本,重啟后再用df命令查看磁盤使用率,降到10%了。
總結一下,如何避免以后出現類似的情況。
1.避免直接刪除linux上正在寫入的文件,正確做法應該是,重寫覆蓋該文件 echo ' ' > filename。
2.排查耗時較長,很多命令都是現學現賣。
3.近2k服務器,雖然已有磁盤自動清理機制,但未徹底解決問題,可能還得需要一個完美的工具。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。