點擊上方藍字關(guān)注我們
隨著X86服務器的普及,目前各種主流數(shù)據(jù)庫、中間件、容器等都在逐步遷往Linux平臺,那對于應用開發(fā)人員還有系統(tǒng)運維人員掌握Linux相關(guān)技術(shù)將顯得尤為重要。今天我們就來分享一下Linux三板斧擺脫小白的煩惱。
大家都知道服務器硬件簡單理解就是Cpu+內(nèi)存+硬盤(存儲)這些,那Linux就是負責調(diào)度這些硬件的軟件,讓大家一起和諧工作產(chǎn)生GDP。由此我們可以發(fā)現(xiàn)Linux主要就是管Cpu、內(nèi)存、硬盤這3類的工作,那換一個角度也就是說Linux運行異常也大概率就這3類問題。下面我們就來重點說說這3個東西:
CPU
一說cpu,熟悉linux的都知道vmstat、top之類的命令,這里我們找個案例來解讀一下:
圖中可以看到這是一臺4cpu的服務器,目前procs-r17,18左右,cpuid空閑為0,由于這是一臺4cpu的服務器,理論上在某一時刻CPU的并行處理能力上限將是4,那procs-r遠遠大于cpu核心數(shù)意味著CPU忙不過來了,拼了命淦但還是有一堆任務等著它淦(來者不拒),所以后面的cpuidle是0,那這就是一個高并發(fā)場景的cpu過載的特征。
通過top命令同樣可以看到目前有17個進程處于running狀態(tài),31.4%us:用戶狀態(tài)的調(diào)用,68.4%sy:涉及到系統(tǒng)內(nèi)核的調(diào)用.在進程模塊中可以看到大量的dd進程以及外層的bash(測試啟動的ddif=/dev/zeroof=/dev/null命令)。當發(fā)現(xiàn)服務器cpu過載時便可以通過這個思路來排查是否存在異常高消耗進程。注意對于多線程的程序比如java,%CPU字段很可能出現(xiàn)1100%這種情況,簡單理解就是多個線程在cpu上運行,相當于消耗了11顆cpu的運算量。
參考man vmstat:
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
內(nèi)存
再來說說內(nèi)存,由于內(nèi)存容量存在上限,比如服務器物理內(nèi)存128G,當我們進行一個500G數(shù)據(jù)運算時,內(nèi)存是明顯放不下的,這時候Linux就引入了一個叫swap的東西,相當于一個臨時空間,它基于磁盤,當內(nèi)存不夠時,將部分當前不使用的數(shù)據(jù)轉(zhuǎn)儲到swap空間中,這樣就可以最大化的利用有限的內(nèi)存進行計算。這個設計理念是好的,但實際生產(chǎn)環(huán)境中往往引發(fā)各種慘痛的案例,如下:
可以看到圖中的服務器總共配置了32Gswap空間,當前已經(jīng)使用了12G說明已經(jīng)有數(shù)據(jù)被從內(nèi)存中swapout到臨時空間,top進程也同樣出現(xiàn)kswapd[0-9],這些進程就是專門負責swapin,swap out,Top中看到這類進程時需額外注意。這時cpu6.%us,12.6%sy,13.9%id,66.7%wa,這個wa說明存在磁盤IO等待,那簡單理解就是由于swap空間的硬盤性能不足,內(nèi)存中的數(shù)據(jù)swapout速度過慢,引發(fā)系統(tǒng)層的panic,服務器hang,造成業(yè)務中斷故障。實際在這個案例過程中vmstat命令輸出也可以發(fā)現(xiàn)cpu–b/si so這些指標的異常
總結(jié)一下swap,一般在服務器系統(tǒng)安裝時系統(tǒng)管理員便會用本地盤劃分swap分區(qū),這里本地盤的性能比較容易出現(xiàn)瓶頸,大量的swap易引發(fā)系統(tǒng)panic,另外一個Linux使用vm.swappiness參數(shù)來控制使用物理內(nèi)存還是使用交換空間的權(quán)重,在老舊一些的版本中設置為0容易引發(fā)系統(tǒng)bug推薦設置為1,在較新的版本中比如redhat7/8則推薦設置為0來避免使用交換空間,那在一些數(shù)據(jù)庫一體機等專有服務器上物理內(nèi)存都能達到TB級,這種也可以直接關(guān)閉swap功能。
參考Man :
Swappiness is a Linux kernel parameter that controls the relative weight given to swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value causes the kernel to avoid swapping, a higher value causes the kernel to try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may decrease response latency.
Man vmstat
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
man top
2c. SUMMARY Area Fields
The summary area fields describing CPU statistics are abbreviated. They provide information about times spent in:
us = user mode
sy = system mode
ni = low priority user mode (nice)
id = idle task
wa = I/O waiting
man vmstat ,
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
最后我們在來說說磁盤類的問題,目前主流方法都是基于磁盤響應時間作為判斷依據(jù)(iostat命令輸出的await值),這里不區(qū)分讀寫,比如SSD存儲響應時間都在5ms以內(nèi),高端SSD的響應時間甚至達到1ms以內(nèi),而傳統(tǒng)的機械硬盤響應時間則較慢一些,高端類的存儲陣列也在20ms以內(nèi),差一點的40ms,50ms也比較常見。了解了這些當我們通過iostat命令來核查服務器磁盤響應情況時便能夠直觀的發(fā)現(xiàn)是否存在問題。如圖:
可以看到%iowait已經(jīng)超過了%user,%system,IO方面壓力較大,再往下可以看到sdb/sdc讀寫都非常少而await(響應時間單位ms)值卻異常的大,IO幾乎無法完成,推測存儲出現(xiàn)異常,通知系統(tǒng)管理員核驗確認RAID出現(xiàn)降級故障.這里需要額外注意iostat輸出的sdb/sdc的%util值為100%,這個%util100實際沒有參考意義,因為系統(tǒng)也并不知道后端存儲的iops能力以及使用率,只有await才能判斷磁盤IO響應是否正常.如圖:
這是一臺本地機械盤(sda),在少量的讀寫情況下%util已經(jīng)97.9,但響應時間24.18任然在正常范圍內(nèi),不能根據(jù)util%值來判斷sda是否存在問題。而下面的sdb/sdc等等磁盤都是外掛SSD存儲,可以看到iops近萬的情況下較慢的盤await也才1點幾ms,快的盤都不到1ms。
參考man iostat
await
The average time (in milliseconds) for I/O requests issued to the device to be served. This includes the time spent
by the requests in queue and the time spent servicing them.
通過以上三板斧,我們便可以對當前Linux系統(tǒng)的運行情況做到心中有數(shù),在此基礎上實際運用過程中,比如swap引起的案例中,vmstatcpu-b/si so以及iostat的swap空間掛載盤一定會有所表現(xiàn),不能教條的認為一定是這一方面的問題,所以需要結(jié)合起來分析。本期分享就到此結(jié)束。
END
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/129995.html
摘要:函數(shù)名列出某個函數(shù)的源代碼,含函數(shù)名上下各五行類比調(diào)試或從開始連續(xù)而非單步執(zhí)行程序遇到斷點停下。相當于中的或單條執(zhí)行。 目錄 一、調(diào)試器gdb 1、可以使用gdb的可執(zhí)行文件生成 2、使用命令 1、開始調(diào)試和退出調(diào)試 2、list 3、類比vs調(diào)試 4、代碼調(diào)試三劍客 5、變量 6、斷點 二...
摘要:環(huán)境基礎開發(fā)工具使用軟件包管理器的三板斧查看軟件包安裝軟件卸載軟件和互傳文件的三種模式的轉(zhuǎn)換命令模式插入模式底行模式編譯器使用函數(shù)庫調(diào)試器使用項目自動化構(gòu)建工具軟件包管理器軟件包和軟件包管理器就好比手機上的和應用 ...
摘要:溝通方面的技巧,后端,產(chǎn)品,設計,測試等領(lǐng)域的知識??梢钥闯?,前端需要跟團隊中的各種角色交流對接,對相關(guān)的領(lǐng)域有了解可以降低溝通的成本。 前端除了JS,HTML,CSS三板斧,還要懂些什么?有什么東西對我們提升自己前端水平有幫助? 開發(fā)的過程 我們不如先了解一下前端開發(fā)的過程 跟產(chǎn)品了解需求 跟后臺溝通接口 跟美術(shù)對接設計 寫文檔 編寫代碼 使用babel,sass等工具編譯代碼 部...
摘要:如果發(fā)現(xiàn)某類對象占用內(nèi)存很大例如幾個,很可能是類對象創(chuàng)建太多,且一直未釋放。 OOM(OutOfMemoryError) 問題歸根結(jié)底三點原因: 本身資源不夠 申請的內(nèi)存太多 資源耗盡 解決思路,換成Java服務分析,三個原因也可以解讀為: 有可能是內(nèi)存分配確實過小,而正常業(yè)務使用了大量內(nèi)存 某一個對象被頻繁申請,卻沒有釋放,內(nèi)存不斷泄漏,導致內(nèi)存耗盡 某一個資源被頻繁申請,系統(tǒng)...
摘要:前言是現(xiàn)在幾乎每個項目中必備的一個東西,但是其工作原理避不開對的解析在生成的過程,有引擎,早期了項目,了解這個之前我們先來看看這種引擎解析出來是什么東西。 前言 babel是現(xiàn)在幾乎每個項目中必備的一個東西,但是其工作原理避不開對js的解析在生成的過程,babel有引擎babylon,早期fork了項目acron,了解這個之前我們先來看看這種引擎解析出來是什么東西。不光是babel還有...
閱讀 1459·2023-01-11 13:20
閱讀 1815·2023-01-11 13:20
閱讀 1267·2023-01-11 13:20
閱讀 2007·2023-01-11 13:20
閱讀 4227·2023-01-11 13:20
閱讀 2885·2023-01-11 13:20
閱讀 1489·2023-01-11 13:20
閱讀 3814·2023-01-11 13:20