linux平台下server運維問題分析與定位 收藏
結合我工作中碰到的運維問題,總結一下linux下server常見的運維問題以及定位方式。這裡的server主要指自主開發的邏輯server,web srv因為通常採用通用的架構所以問題比較少。
邏輯server通常的處理能力在3k/s - 1w/s之間,因業務特點而不同。邏輯server一般是自主開發的,雖然在上線前大都經過功能和壓力測試,但放到現網環境上部署後還是難免會出現一些問題,有些問題是在灰度發布時就可以發現,而有些問題則是乙個漫長的暴露過程。下面先總結一下大致的問題分類和定位方法。
1. 程式bug如fd洩漏或記憶體洩漏
業務上線前一定要做壓測,同時檢視程序消耗的記憶體與fd數,結合業務特性分析fd使用量是否合理,同時觀察記憶體使用是不是最終會趨於穩定的值,如果一直增加,就肯定有洩漏。
fd洩漏確認方法是:ls /proc/pid/fd -al | wc,可以看到單個程序使用的fd數,觀察是否一直在漲長,如果沒有最終達到乙個穩定值,則可以確認存在洩漏。同時可以cat /proc/net/sockstat觀察整體的fd使用數量是否一直在漲長,通常32位的機器,fd超過10w時系統會到達瓶頸。
記憶體洩漏確認方法是:top 看程序使用的res 和 shr,觀察是否一直在漲長,如果沒有最終達到乙個穩定值,則可以確認存在洩漏。同時可以看下mem的使用量是否一直在增加。記憶體洩漏最終的結果是使用到的swap分割槽,一旦出現這種情況,cpu的wa欄位會出現遠大於0的情況,表明cpu阻塞在等待輸入輸出上。
2. 業務自然增長
這一點依賴於對請求數的統計,通過對前後幾天的對比,不難確認是否是業務自然增長,單機請求量上公升使系統出現瓶頸,這種問題通過擴容可以輕鬆解決,但最好的辦法是對系統的容量和關鍵引數如cpu/mem/eth加上監控,能夠做到提前告警,這樣不至於在出問題的時候緊急擴容。
3. 特性變更導致使用者行為異常
舉個例子,有一次我在公升級server時,基於效能的考慮,少返回了乙個已無效的字段,灰度公升級一台機器後,發現系統負載公升高了3倍,當時的第一反應是有bug,使到cpu的使用突增,但vmstat發現 公升級前cpu使用率 usr 和 sys大致是 14 7,公升級後為 42 21,大致同比增長了3倍,再看一下請求數,發現請求數也同比增長,可見,是某些原因達致使用者在重試。
因為上線前經過功能測試,所以正常使用者的功能應該沒有問題,對比這些的版本髮更,發現有可能是少返回了乙個字段,使外掛程式使用者解析失敗而不停重試,因此重新加上欄位後再次發布,問題解決。從那次之後,總結了一點,當返回給使用者側的資料出現字段變更時,一定要灰度發布確認是否影響到外掛程式使用者,如果有影響的話可以返回通過假資料解決。
4. 系統引數配置不當
舉個例子,一段時間發現在訪問高峰時段,程序會出現申請fd失敗的情況,由於某些介面採用短連線,每次處理都需要申請fd、處理、釋放fd,後來檢視了系統引數,發現/proc/sys/net/ipv4/tcp_tw_recycle 和 /proc/sys/net/ipv4/tcp_tw_reuse都配的是0,0表示不開啟加快**fd和復用time_wait狀態的fd,導致短連線關閉後,fd大面積處在time_wait狀態,因些新的請求由於申請不到fd而失敗,通過調整系統引數後問題解決。
5. 編碼問題導致系統處理能力較差
系統呼叫方面,可以通過strace -c統計系統呼叫次數和耗時,從而對業務邏輯優化。strace -c的使用方法,詳見我的另一篇文章。
這裡舉個例子,我有一次strace -c了乙個處理程序,發現stat函式的cpu使用率非常高,然後strace跟蹤了一下程序的系統呼叫發現,該程序用到了乙個統計上報的類,類本身是用static初始化的,但類的上報介面中,每次都會初始化乙個物件,對取樣進行分析,並進行上報,這時會解析一次取樣配置檔案同時再解析一次上報配置檔案,所以雖然類本身是static但是已經沒有意義了,物件還是每次都會初始化,後來改造了一下,把介面中的物件用指標代替,只在第一次介面呼叫時初始化,再次呼叫時,判斷指標非null,則直接使用。優化後,發現系統的cpu使用下降了近20%,可見,減少無謂的系統呼叫對系統的處理能力是有很大提公升的。
1. 檢視日誌
通過檢視系統日誌,可以第一時間確定是不是業務邏輯或外部介面出了問題,並可以結合**程序核實。
2. 是否fd>10w
cat /proc/net/sockstat,觀察tcp_use欄位,如果持續增長而不趨於穩定說明fd洩漏或連線數過多,>10w時系統會出現異常。
3. 負載分析
首先用vmstat 1,觀察cpu 、swap和r欄位,大致可以分為以下幾種情況:
cpu的wa欄位遠》0,並且swap的si欄位遠》0,說明已經用到了交換分割槽,這時通過top觀察程序的res和shr欄位,如果res欄位很大,並且持續增長,可以確認是存在記憶體洩漏。
cpu的usr和sys成比例比較高,r字段值也比較高,而swap使用量為0,說明可能是請求量有變化,這時核對請求量資料,是否成比例增長,如果是成比例增長的話,可以確認是請求量增大的原因,這時要根據幾天的請求量資料確認是突增還是自然增長。
為什麼linux平台下軟體安裝不是雙擊執行
首先要說一下,很多linux的發行版例如ubuntu或者centos fedora等,是可以雙擊安裝自己發行版的安裝包的,例如deb rpm等。但是為什麼非要這三個命令,而不是雙擊之後自動執行上述三個命令呢?主要還是跨平台和定製化的考慮。我們知道linux發行版眾多,linux支援的平台也很多,從使...
為什麼linux平台下軟體安裝不是雙擊執行
首先要說一下,很多linux的發行版例如ubuntu或者centos fedora等,是可以雙擊安裝自己發行版的安裝包的,例如deb rpm等。但是為什麼非要這三個命令,而不是雙擊之後自動執行上述三個命令呢?主要還是跨平台和定製化的考慮。我們知道linux發行版眾多,linux支援的平台也很多,從使...
Linux平台下解除安裝ORACLE
實驗環境 作業系統版本 red hat enterprise linux server release 5.5 tikanga 資料庫版本 oracle database 10g enterprise edition release 10.2.0.1.0。解除安裝oracle 10g的過程,在不同平...