本文主要為大家介紹阿里云ECS的CPU100%排查過(guò)程,具有很好的參考價(jià)值,有需要的朋友可以學(xué)習下
一、背景和現象
初創(chuàng )公司,架構lanmp,web前端和后端分開(kāi)服務(wù)器,業(yè)務(wù)驅動(dòng)主要是nginx和apache,nginx主要是處理靜態(tài)文件和反向代理,前后端、搜索引擎、緩存、隊列等附加的服務(wù)都是用docker容器部署。因為比較初級,上傳文件和采集文件都是直接寫(xiě)在硬盤(pán)上,涉及到的目錄共享,就在其中一臺服務(wù)器存儲并且nfs共享。我們暫且分為1(apache1)、ECS2(apache2)、ECS3(nginx)。某天網(wǎng)站業(yè)務(wù)中斷,但是沒(méi)有報錯。一直在等待響應,默認響應超時(shí)是一分鐘,所以很基礎高可用沒(méi)有起到作用。中斷10分鐘左右,重啟服務(wù),提示“open too many files”,但是lsof統計沒(méi)幾個(gè)。因為初級處理不了,所以直接重啟服務(wù)器,一段時(shí)間后一切恢復正常,可是第二天又來(lái)一次這種情況。
二、第一次出現后的排查思路
本來(lái)第一次發(fā)現這種問(wèn)題的時(shí)候就要追查原因了,看了一下zabbix監控圖像其中斷了十分鐘,包括網(wǎng)絡(luò )、內存、CPU、硬盤(pán)、IO等監控數據。首先想到的是網(wǎng)絡(luò )問(wèn)題,結論是zabbix-servert獲取不到了zabbix-agent采集的數據,估計就是網(wǎng)絡(luò )不通了。
但是,這個(gè)結論站不住腳,因為我本身通過(guò)ssh登錄服務(wù)器,并且命令輸入無(wú)卡頓,不至于頭文件都傳不過(guò)來(lái)。后來(lái)一看的云監控,上面有數據,似乎也可以佐證網(wǎng)絡(luò )這個(gè)說(shuō)法,因為云監控是阿里云內部的監控,可以?xún)染W(wǎng)獲取到監控數據。直到看CPU的使用率這項,發(fā)現有一段時(shí)間的CPU使用率100%。并且我重啟的時(shí)候CPU恢復正常,不能說(shuō)網(wǎng)絡(luò )一定沒(méi)問(wèn)題,但系統肯定有問(wèn)題。也可以解釋因為CPU使用已經(jīng)是100%,zabbix-agent和根本不能正常運行,所以沒(méi)有監控數據。因為這個(gè)公司全部都是云服務(wù)器,沒(méi)有使用IDC所以我們也沒(méi)有安裝smokeping來(lái)監控,接著(zhù)我們就不把重心在網(wǎng)絡(luò )上了。
目前掌握的信息就是:在毫無(wú)征兆的情況下,CPU暴漲到100%,重啟之前一直保留,重啟之后恢復原樣。匆忙之中又看了一下系統各日志,因為太匆忙,沒(méi)有總結,沒(méi)有找到什么有價(jià)值的東西?,F在有下面幾種猜想:第一,程序的bug或者部署不當,觸發(fā)之后耗盡資源。第二、docker容器的bug。第三、網(wǎng)絡(luò )攻擊。第四、病毒入侵。第五、阿里云方系統不穩定。
小總結了一下,現在問(wèn)題還沒(méi)有找出來(lái)。下次還有這個(gè)問(wèn)題的可能,所以先盡量防范,但是又不能重啟一刀切。所以在zabbix上面設置了自動(dòng)化,當檢測到ECS1獲取不到數據的時(shí)候馬上操作ECS3標記后端為ECS1的apache為down。保留異?,F場(chǎng)。(請求停止的時(shí)候,還在)
三、現場(chǎng)排查
1、相應的排查計劃(想到這些信息需要獲取的,實(shí)際上沒(méi)有嚴格按照這樣的步驟)
1)用htop和top命令監控CPU、內存使用大的進(jìn)程。先看看哪個(gè)進(jìn)程消耗資源較多,用戶(hù)態(tài)、內核態(tài)、內存、IO……同時(shí)sar -b查io的歷史定時(shí)抽樣。
2)統計tcp連接數,看看有沒(méi)有DDOS攻擊。netstat -anp |grep tcp |wc -l 。用iftop-i eth1看看通訊。同時(shí)用tail -n 1200 /var/log/messages查看內核日志。
3)用pstree查看打開(kāi)進(jìn)程,ps aux|wc-l看看有沒(méi)有特別多的進(jìn)程。雖然zabbix監控上說(shuō)沒(méi)有,但是我們要檢查一下看看有沒(méi)有異常的進(jìn)程名字。
4)查看全部容器的資源使用docker stats $(docker ps -a -q),看看能不能從容器上排查。
5)有了“too many open files”的啟發(fā),計算打開(kāi)文件數目lsof|wc -l,根據進(jìn)程看看ll /proc/PID/fd文件描述符有沒(méi)有可疑的打開(kāi)文件、文件描述符。
6)關(guān)于用lsof打開(kāi)文件數找到的線(xiàn)索,排序打開(kāi)文件找出進(jìn)程號 lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
7)關(guān)于用lsof打開(kāi)文件數找到的線(xiàn)索,用lsof -p PID查看進(jìn)程打開(kāi)的句柄。直接查看打開(kāi)的文件。
8)啟動(dòng)容器的時(shí)候又總是“open too many files"。那就是打開(kāi)文件數的問(wèn)題,因為CPU的使用率是CPU的使用時(shí)間和空閑時(shí)間比,有可能因為打開(kāi)文件數阻塞而導致CPU都在等待。針對連接數的問(wèn)題,大不了最后一步試試echo 6553500 > /proc/sys/fs/file-max 測試打開(kāi)文件對CPU的影響。
9)玩意測出來(lái)了消耗CPU的進(jìn)程,可以使用strace最終程序。用戶(hù)態(tài)的函數調用跟蹤用「ltrace」,所以這里我們應該用「strace」-p PID
10)從程序里面看到調用系統底層的函數可以跟蹤。跟蹤操作 strace -T -e * -p PID,主要看看代碼調用的函數有沒(méi)有問(wèn)題。
2、現場(chǎng)排查
第二天同樣時(shí)間,ECS果然暴漲了CPU。這是時(shí)候zabbix的工作如希望進(jìn)行保留了一臺故障的ECS1給我。
1)用htop看到資源使用最大是,搜索引擎下我寫(xiě)的一個(gè)判斷腳本xunsearch.sh。腳本里面很簡(jiǎn)單,判斷索引和搜索服務(wù)缺一個(gè)就全部重啟。就當是我的容器有問(wèn)題我直接關(guān)掉搜索引擎容器。httpd頂上,我又關(guān)掉apache容器。rabbitmq相關(guān)進(jìn)程又頂上。這時(shí)候我沒(méi)心情周旋了,肯定不也是這個(gè)原因。sar -b查看的歷史io也沒(méi)有異常。
2)統計tcp連接,幾百。先不用著(zhù)重考慮攻擊了。用tail -n 1200 /var/log/messages查看內核日志,是TCP TIME WAIT的錯誤??梢岳斫鉃镃PU使用100%,程序無(wú)響應外面的tcp請求超時(shí)。這是結果,還是沒(méi)有找到根本原因。
接著(zhù)往下看系統內核日志,發(fā)現了和“open too many files”呼應的錯誤,“file-max limit 65535 reached”意思是,已到達了文件限制瓶頸。這里保持懷疑,繼續收集其他信息。
3)查看進(jìn)程數量,數量幾百。列出來(lái)也看到都是熟悉的進(jìn)程,可以先排除異常進(jìn)程。
4)監控容器的資源使用,里面很不穩定,首先是xunsearch容器使用80%的CPU,關(guān)掉xunsearch,又變成了其他容器使用CPU最高。很大程度上可以排查容器的問(wèn)題和執行程序的問(wèn)題。
5)查看了最大連接數cat /proc/sys/fs/file-max是65535但是用lsof查到的連接數是10000多,完全沒(méi)有達到連接數。
6)各項參數都正常,現在聚焦在打開(kāi)的文件數這個(gè)問(wèn)題上面。也可以用另外同一種方式查看一下內核統計文件 /proc/sys/fs/file-nr,比較一下差異,看看能不能找出問(wèn)題。cat了一下,打開(kāi)文件數是66080,果然超了!內核日志就以這個(gè)為標準。
但是看lsof怎么統計不出來(lái),ll /proc/PID/fd也沒(méi)幾個(gè)。這個(gè)問(wèn)題放在后面,先按照步驟echo 6553500 > /proc/sys/fs/file-max給連接數提高到100倍,CPU果然降了下來(lái)。原因確認了,但是必須找到根源,為什么忽然有這么大的打開(kāi)文件數。關(guān)掉全部docker容器和docker引擎,打開(kāi)文件數是少了一點(diǎn),但是仍然在65535差不多。我就先排除一下業(yè)務(wù)的影響,把ECS3的nginx直接指向視頻ECS2的apache,就等同于在ECS2上實(shí)現了ECS1的場(chǎng)景。查看一下ECS2的句柄數,才4000多,排除了業(yè)務(wù)相關(guān)應用對服務(wù)器的影響。那就能下個(gè)小結論,ECS1被神秘程序打開(kāi)了6萬(wàn)多句柄數,打開(kāi)業(yè)務(wù)就多了2000多的句柄數,然后就崩潰了。不過(guò)這個(gè)現象有點(diǎn)奇怪,ECS2和ECS1在一樣的機房一樣的配置一樣的網(wǎng)絡(luò )環(huán)境,一樣的操作系統,一樣的服務(wù),一樣的容器,為什么一個(gè)有問(wèn)題,一個(gè)沒(méi)問(wèn)題呢?不同的只是有一臺是共享nfs。難道是靜態(tài)文件共享了,其他人讀了,也算是本服務(wù)器打開(kāi)的?
7)現在程序找不到,沒(méi)法繼續lsof -p了。排查之前的猜想。帶著(zhù)排查得到對的結論往下想。
程序的bug和部署不當,那是不可能的,因為主要問(wèn)題來(lái)自于打開(kāi)句柄數,當部署到ECS2那里,一切正常。docker容器的bug,那也不可能的,每個(gè)都是我親自寫(xiě)腳本,親自編譯,親自構建的,關(guān)鍵是我關(guān)掉了docker容器和引擎都沒(méi)有很大改善。網(wǎng)絡(luò )攻擊也排除,因為網(wǎng)絡(luò )連接數沒(méi)幾個(gè),流量也不變。那就只剩下病毒入侵也不是,沒(méi)有異常進(jìn)程??紤]到ECS的穩定性問(wèn)題了。這方面就協(xié)助阿里云工程師去排查。
8)阿里云工程師用的排查手段和我差不多,最終也是沒(méi)能看到什么。也只是給了我一些治標不治本的建議。后來(lái)上升到專(zhuān)家排查,專(zhuān)家直接在阿里云后端抓取了coredump文件分析打開(kāi)的文件是圖片,程序是nfsd。
好像印證了我剛才后面的猜想,應該就是ECS1使用了nfs共享其他服務(wù)器打開(kāi)了然后算在ECS1頭上。那問(wèn)題又來(lái)了,我們的業(yè)務(wù)已經(jīng)到達了可以影響服務(wù)器的程度嗎?
9)既然問(wèn)題解決到這一步,先不管程序有沒(méi)有關(guān)閉打開(kāi)的文件和nfs的配置。我們架構上面的圖片應該是歸nginx讀取,難道是linux的內存機制讓它緩存了。帶著(zhù)緩存的問(wèn)題,首先去ECS3上釋放內存echo 3 > /proc/sys/vm/drop_caches,釋放之后,發(fā)現沒(méi)什么改善,有點(diǎn)失落??偸怯X(jué)得還有一臺后端是PHP主導,但是邏輯上是寫(xiě)入,沒(méi)有打開(kāi)文件之說(shuō)。后來(lái)從程序員中了解到,PHP也有打開(kāi)圖片。我猛然去ECS2釋放一下內存,果然,句柄數降下來(lái)。(這里大家一定有個(gè)疑問(wèn),為什么我直接想到內存緩存而不是目前打開(kāi)的文件呢。其一,這是生產(chǎn)環(huán)境,web前端只有一個(gè),不能亂來(lái)停服務(wù)。其二,第一次遇到問(wèn)題的時(shí)候,重啟之后沒(méi)有問(wèn)題,過(guò)了一天之后積累到一定的程度才爆發(fā),這里已經(jīng)引導了我的思路是積累的問(wèn)題,那就是緩存不斷積累了)
10)因為ECS2的調用ECS1的nfs共享文件,所以lsof也有讀不到那么多句柄數的理由。如果說(shuō)是nfs的服務(wù)本身就有緩存,導致問(wèn)題的話(huà),我查看了配置文件,還是默認值允許緩存,30S過(guò)期,根本不會(huì )因為nfs的緩存造成打開(kāi)文件過(guò)多。如果我們的后端程序打開(kāi)之后沒(méi)好好處理的話(huà),那倒有可能。然后嘗試排除:我改了ECS3的配置,使程序只讀ECS1后端,從ECS1上面卻看不到有什么異常表現,說(shuō)明PHP程序已經(jīng)好好處理了打開(kāi)的文件。也不是docker掛載了nfs的共享的問(wèn)題,因為nginx也有掛載。排查到這里也很大程度上解決問(wèn)題,而且緩存了nfs的全部共享文件,句柄并沒(méi)有增加,也算合理,所以就增加了打開(kāi)文件數的限制。
11)現在排查的結果是跟后端和nfs共享有關(guān)。就是說(shuō),后端掛載了nfs的網(wǎng)絡(luò )共享,被程序讀取。而程序釋放之后,在正常背景的硬盤(pán)文件是沒(méi)有緩存的。但是在nfs掛載的環(huán)境下,緩存并沒(méi)有得到釋放。
12)總結:很多問(wèn)題的排查和我們的猜想結果一樣,但是有些例外的情況。比如這次我想到的原因都一一排除,但是問(wèn)題也是在一步步排查中,逐步被發(fā)現的。
原文地址:https://www.cnblogs.com/hodge01/p/8658538.html
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站