一次資源耗盡的教訓

2022-02-08 15:45:27 字數 2298 閱讀 5531

ssh_exchange_identification:

read:connection reset by peer

我趕緊嘗試登入,果然出現了,然後運維的在機房一查說資源耗盡了:

然後老大就開始問裡面都有什麼我們知道的服務,評估一下是否能重啟,重啟後都需要開啟哪些服務,我就直接說了我知道的兩個ci 服務和乙個我最近部署的定時任務的服務,一想到最近部署,心裡咯噔以下,不會是我這個定時任務引起的吧 ,一時半會兒過去了,大家都不說話,在群裡各種討論利用redis 什麼漏洞可以登入進去, 但是大家都不知道怎麼弄啊。因為機器上有很多不知道的服務,不能貿然重啟解決,得想其他的方法登入進去,要知道是什麼服務把資源耗光了,治本是關鍵。突然buddy靈機一動,用瀏覽器訪問jenkins服務url後面加個exit後停掉了jenkins ,這時再用ssh就能登入到機器上,運維的小夥伴兒定位到記憶體硬碟都沒事,最後鎖定是程序數滿了。檢視系統限制使用者開啟的最大程序數:

ulimit -a
出現 max user processes 的值是65535 ,也就是說當前使用者開啟的程序數已經達到了65535

cat /etc/security/limits.d/90-nproc.conf
檔案中*     soft      nproc      65535  ,  一般還有  * hard nproc  

如需要修改這個值,則需在  /etc/security/limits.conf  中修改 ,普通使用者是受 /etc/security/limits.d/90-nproc.conf影響,還要修改這裡面的值

最終上面的值都是受全域性的kernel.pid_max的值的影響, 如果kernel.pid_max的值是1000 ,上面都改成了65535,終端使用者能開啟的最大程序數還是1000

檢視全域性pid_max :

cat /proc/sys/kernel/pid_max
或者:

sysctl kernel.pid_max
我的是fedora27,所以這裡使用sysctl

修改這個值,直接修改  /proc/sys/kernel/pid_max檔案 ,但是這樣機器重啟就沒了,永久生效的方法:

直接在/etc/sysctl.conf中新增:

kernel.pid_max=65535

上面巴拉巴拉了一堆,修改使用者的最大程序數限制還是沒有治標啊,如果程序一直增加,這個限制在不久的將來還是會打破把, 既然已經定位到時程序數滿的問題,那就來看看是哪個程序對應的檔案控制代碼數一直在增加:

ps -elf | awk

'' | sort | uniq -c | sort -rn | head -n 10

或者

lsof -n | awk

'' |sort | uniq -c | sort -rn | head -n 10

第一列就是程序開啟的檔案控制代碼數,第二列是對應的程序id:

可以看到最大的程序數對應的程序是4214 ,我們檢視一下這個4214 是哪個埠占用:

netstat -tulnp | grep

4214

查到的埠是 35000,看到35000,呀,這不是我前兩天部署上的服務嗎,果然是我的服務造成的, 為什麼我的服務會導致程序數一直增加呢, 突然想起來 裡面有個呼叫rpc服務獲取資料的**,好像我沒有呼叫close操作,趕緊一檢查驗證一下,果然,在我本地測試,程序數蹭蹭的往**。找到問題的根源所在了,直接 修改**,把開啟的socket 連線加上乙個finally 完美解決,再次觀察程序數,一切正常,此時一萬隻草擬嗎從心裡飛過。這裡要跟所有的16個運維童鞋和部門內部童鞋說聲抱歉,我埋了個大坑,害你們半夜起來折騰了乙個多小時。真心跟你們說聲對不起

經過這次線上事件,讓我牢記開啟的io,一定要記得關閉,雖然不關閉現在沒什麼影響,但是上線後執行的時間稍長一些就會非常危險,也讓我再次深刻理解了linux系統的一切皆檔案,一切皆io ,任何乙個命令,包括檔案的操作,網路socket的建立都是在開啟檔案,開啟檔案會有相對應的檔案控制代碼,如果超過這個控制代碼最大限制,核心為了保護系統,就會提示資源耗盡,禁止任何操作,包括ssh登入的操作,這個檔案控制代碼的理解是不是就是檔案描述符,剛好最近也在看《unix/linux系統程式設計手冊》 、《深入理解計算機作業系統》和《現代作業系統》,來了解一下這個神秘的東西。

一次慘痛的面試教訓

這已經是乙個多星期以前的事情了 2011年7月29日 但是想起來,感覺還是挺不好。寫出來,希望給大家提供乙個反面教材,大家以後面試時,一定注意。這是在第二面中遇到的乙個問題,問題很簡單。但是,不簡單 的我給自己挖了乙個坑,自己還渾然不覺地跳了進去,進去也出不來時,才發現自己給自己挖了個坑。實在是鬱悶...

我的第一次專案管理 一次慘痛的教訓

最近總想發點時間寫些東西但抽不出時間,趁著放年假並且今天剛開完專案的年前回顧會議趕緊寫出來,其實挺不好意思講的,有點尷尬。由於公司逐步發展,專案越來越多,沒有人有時間來負責這個專案,我的老闆們可能看我比較順眼於是便讓我來負責這次的專案開發,於是我便莫名其妙的變成了專案負責人,一開始我是拒絕的,讓乙個...

記一次Excel匯出導致記憶體耗盡的問題

php fatal error allowed memory size of 298844160 bytes exhausted tried to allocate 262144 bytes 一開始首先想到是excel匯出時很吃記憶體,資料一多就容易將記憶體耗盡,於是先從 上做優化,取完資料後將無用...