Linux服務(wù)器性能出問(wèn)題,排查下這些參數(shù)指標(biāo)
來(lái)源:原創(chuàng) 時(shí)間:2017-10-24 瀏覽:0 次一個(gè)依據(jù) Linux 操作體系的效勞器運(yùn)轉(zhuǎn)的一起,也會(huì)表征出各式各樣參數(shù)信息。一般來(lái)說(shuō)運(yùn)維人員、體系管理員會(huì)對(duì)這些數(shù)據(jù)會(huì)極為靈敏,可是這些參數(shù)關(guān)于開發(fā)者來(lái)說(shuō)也十分重要,特別當(dāng)你的程序非正常作業(yè)的時(shí)分,這些蛛絲馬跡往往會(huì)協(xié)助快速定位盯梢問(wèn)題。
這兒僅僅一些簡(jiǎn)略的東西檢查體系的相關(guān)參數(shù),當(dāng)然許多東西也是經(jīng)過(guò)剖析加工 /proc、/sys 下的數(shù)據(jù)來(lái)作業(yè)的,而那些愈加詳盡、專業(yè)的功用監(jiān)測(cè)和調(diào)優(yōu),可能還需求愈加專業(yè)的東西(perf、systemtap 等)和技能才干完結(jié)哦。
究竟來(lái)說(shuō),體系功用監(jiān)控自身就是個(gè)大學(xué)識(shí)。
?
一、CPU和內(nèi)存類
1.1 top
榜首行后邊的三個(gè)值是體系在之前 1、5、15 的均勻負(fù)載,也能夠看出體系負(fù)載是上升、平穩(wěn)、下降的趨勢(shì),當(dāng)這個(gè)值超越 CPU 可履行單元的數(shù)目,則標(biāo)明 CPU 的功用現(xiàn)已飽滿成為瓶頸了。
第二行計(jì)算了體系的使命狀況信息。running 很天然不用多說(shuō),包含正在 CPU 上運(yùn)轉(zhuǎn)的和將要被調(diào)度運(yùn)轉(zhuǎn)的;sleeping 一般是等候工作(比方 IO 操作)完結(jié)的使命,細(xì)分能夠包含 interruptible 和 uninterruptible 的類型;stopped 是一些被暫停的使命,一般發(fā)送 SIGSTOP 或許對(duì)一個(gè)前臺(tái)使命操作 Ctrl-Z 能夠?qū)⑵鋾和?zombie 僵尸使命,盡管進(jìn)程停止資源會(huì)被主動(dòng)收回,可是含有退出使命的 task descriptor 需求父進(jìn)程拜訪后才干開釋,這種進(jìn)程閃現(xiàn)為 defunct 狀況,不管是因?yàn)楦高M(jìn)程提早退出仍是未 wait 調(diào)用,呈現(xiàn)這種進(jìn)程都應(yīng)該分外留意程序是否規(guī)劃有誤。
第三行 CPU 占用率依據(jù)類型有以下幾種狀況:
(us) user:CPU 在低 nice 值(高優(yōu)先級(jí))用戶態(tài)所占用的時(shí)刻(nice<=0)。正常狀況下只需效勞器不是很閑,那么大部分的 CPU 時(shí)刻應(yīng)該都在此履行這類程序
(sy) system:CPU 處于內(nèi)核態(tài)所占用的時(shí)刻,操作體系經(jīng)過(guò)體系調(diào)用(system call)從用戶態(tài)墮入內(nèi)核態(tài),以履行特定的效勞;一般狀況下該值會(huì)比較小,可是當(dāng)效勞器履行的 IO 比較密布的時(shí)分,該值會(huì)比較大
(ni) nice:CPU 在高 nice 值(低優(yōu)先級(jí))用戶態(tài)以低優(yōu)先級(jí)運(yùn)轉(zhuǎn)占用的時(shí)刻(nice>0)。默許新發(fā)動(dòng)的進(jìn)程 nice=0,是不會(huì)計(jì)入這兒的,除非手動(dòng)經(jīng)過(guò) renice 或許 setpriority() 的方法修正程序的nice值
(id) idle:CPU 在閑暇狀況(履行 kernel idle handler )所占用的時(shí)刻
(wa) iowait:等候 IO 完結(jié)做占用的時(shí)刻
(hi) irq:體系處理硬件中止所耗費(fèi)的時(shí)刻
(si) softirq:體系處理軟中止所耗費(fèi)的時(shí)刻,記住軟中止分為 softirqs、tasklets (其實(shí)是前者的特例)、work queues,不知道這兒是計(jì)算的是哪些的時(shí)刻,究竟 work queues 的履行現(xiàn)已不是中止上下文了
(st) steal:在虛擬機(jī)狀況下才有含義,因?yàn)樘摂M機(jī)下 CPU 也是同享物理 CPU 的,所以這段時(shí)刻標(biāo)明虛擬機(jī)等候 hypervisor 調(diào)度 CPU 的時(shí)刻,也意味著這段時(shí)刻 hypervisor 將 CPU 調(diào)度給其他 CPU 履行,這個(gè)時(shí)段的 CPU 資源被“stolen”了。這個(gè)值在我 KVM 的 VPS 機(jī)器上是不為 0 的,但也只要 0.1 這個(gè)數(shù)量級(jí),是不是能夠用來(lái)判別 VPS 超售的狀況?
CPU 占用率高許多狀況下意味著一些東西,這也給效勞器 CPU 運(yùn)用率過(guò)高狀況下指明晰相應(yīng)地排查思路:
當(dāng) user 占用率過(guò)高的時(shí)分,一般是某些個(gè)其他進(jìn)程占用了許多的 CPU,這時(shí)分很簡(jiǎn)略經(jīng)過(guò) top 找到該程序;此刻如果置疑程序反常,能夠經(jīng)過(guò) perf 等思路找出熱門調(diào)用函數(shù)來(lái)進(jìn)一步排查;
當(dāng) system 占用率過(guò)高的時(shí)分,如果 IO 操作(包含終端 IO)比較多,可能會(huì)形成這部分的 CPU 占用率高,比方在 file server、database server 等類型的效勞器上,不然(比方>20%)很可能有些部分的內(nèi)核、驅(qū)動(dòng)模塊有問(wèn)題;
當(dāng) nice 占用率過(guò)高的時(shí)分,一般是有意行為,當(dāng)進(jìn)程的建議者知道某些進(jìn)程占用較高的 CPU,會(huì)設(shè)置其 nice 值保證不會(huì)吞沒其他進(jìn)程對(duì) CPU 的運(yùn)用懇求;
當(dāng) iowait 占用率過(guò)高的時(shí)分,一般意味著某些程序的 IO 操作功率很低,或許 IO 對(duì)應(yīng)設(shè)備的功用很低以至于讀寫操作需求很長(zhǎng)的時(shí)刻來(lái)完結(jié);
當(dāng) irq/softirq 占用率過(guò)高的時(shí)分,很可能某些外設(shè)呈現(xiàn)問(wèn)題,導(dǎo)致發(fā)作許多的irq懇求,這時(shí)分經(jīng)過(guò)檢查 /proc/interrupts 文件來(lái)深究問(wèn)題所在;
當(dāng) steal 占用率過(guò)高的時(shí)分,黑心廠商虛擬機(jī)超售了吧!
第四行和第五行是物理內(nèi)存和虛擬內(nèi)存(交流分區(qū))的信息:
total = free + used + buff/cache,現(xiàn)在buffers和cached Mem信息總和到一起了,可是buffers和cached
Mem 的聯(lián)系許多當(dāng)?shù)囟紱]說(shuō)清楚。其實(shí)經(jīng)過(guò)比照數(shù)據(jù),這兩個(gè)值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是針對(duì) raw disk 的塊緩存,首要是以 raw block 的方法緩存文件體系的元數(shù)據(jù)(比方超級(jí)塊信息等),這個(gè)值一般比較小(20M左右);而 Cached 是針關(guān)于某些詳細(xì)的文件進(jìn)行讀緩存,以添加文件的拜訪功率而運(yùn)用的,能夠說(shuō)是用于文件體系中文件緩存運(yùn)用。
而 avail Mem 是一個(gè)新的參數(shù)值,用于指示在不進(jìn)行交流的狀況下,能夠給新敞開的程序多少內(nèi)存空間,大致和 free + buff/cached 適當(dāng),而這也印證了上面的說(shuō)法,free + buffers + cached Mem才是真實(shí)可用的物理內(nèi)存。并且,運(yùn)用交流分區(qū)不見得是壞工作,所以交流分區(qū)運(yùn)用率不是什么嚴(yán)峻的參數(shù),可是頻頻的 swap in/out 就不是好工作了,這種狀況需求留意,一般標(biāo)明物理內(nèi)存緊缺的狀況。
最終是每個(gè)程序的資源占用列表,其間 CPU 的運(yùn)用率是一切 CPU core 占用率的總和。一般履行 top 的時(shí)分,自身該程序會(huì)許多的讀取 /proc 操作,所以根本該 top 程序自身也會(huì)是獨(dú)占鰲頭的。
top 盡管十分強(qiáng)壯,可是一般用于控制臺(tái)實(shí)時(shí)監(jiān)測(cè)體系信息,不適合長(zhǎng)時(shí)刻(幾天、幾個(gè)月)監(jiān)測(cè)體系的負(fù)載信息,一起關(guān)于短壽的進(jìn)程也會(huì)遺失無(wú)法給出計(jì)算信息。
1.2 vmstat
vmstat 是除 top 之外另一個(gè)常用的體系檢測(cè)東西,下面截圖是我用-j4編譯boost的體系負(fù)載。
r 標(biāo)明可運(yùn)轉(zhuǎn)進(jìn)程數(shù)目,數(shù)據(jù)大致相符;而b標(biāo)明的是 uninterruptible 睡覺的進(jìn)程數(shù)目;swpd 標(biāo)明運(yùn)用到的虛擬內(nèi)存數(shù)量,跟 top-Swap-used 的數(shù)值是一個(gè)含義,而如手冊(cè)所說(shuō),一般狀況下 buffers 數(shù)目要比 cached Mem 小的多,buffers 一般20M這么個(gè)數(shù)量級(jí);io 域的 bi、bo 標(biāo)明每秒鐘向磁盤接納和發(fā)送的塊數(shù)目(blocks/s);system 域的 in 標(biāo)明每秒鐘的體系中止數(shù)(包含時(shí)鐘中止),cs標(biāo)明因?yàn)檫M(jìn)程切換導(dǎo)致上下文切換的數(shù)目。
提到這兒,想到曾經(jīng)許多人糾結(jié)編譯 linux kernel 的時(shí)分 -j 參數(shù)究竟是 CPU Core 仍是 CPU Core+1?經(jīng)過(guò)上面修正 -j 參數(shù)值編譯 boost 和 linux kernel 的一起敞開 vmstat 監(jiān)控,發(fā)現(xiàn)兩種狀況下 context switch 根本沒有改變,且也只要明顯添加 -j 值后 context switch 才會(huì)有明顯的添加,看來(lái)不用過(guò)于糾結(jié)這個(gè)參數(shù)了,盡管詳細(xì)編譯時(shí)刻長(zhǎng)度我還沒有測(cè)驗(yàn)。材料說(shuō)如果不是在體系發(fā)動(dòng)或許 benchmark 的狀況,參數(shù) context switch>100000 程序必定有問(wèn)題。
1.3 pidstat
如果想對(duì)某個(gè)進(jìn)程進(jìn)行全面詳細(xì)的追尋,沒有什么比 pidstat 更適宜的了——??臻g、缺頁(yè)狀況、主被迫切換等信息盡收眼底。這個(gè)指令最有用的參數(shù)是-t,能夠?qū)⑦M(jìn)程中各個(gè)線程的詳細(xì)信息羅列出來(lái)。
-r: 閃現(xiàn)缺頁(yè)過(guò)錯(cuò)和內(nèi)存運(yùn)用狀況,缺頁(yè)過(guò)錯(cuò)是程序需求拜訪映射在虛擬內(nèi)存空間中可是還尚未被加載到物理內(nèi)存中的一個(gè)分頁(yè),缺頁(yè)過(guò)錯(cuò)兩個(gè)首要類型是
minflt/s 指的 minor faults,當(dāng)需求拜訪的物理頁(yè)面因?yàn)槟承┰?比方同享頁(yè)面、緩存機(jī)制等)現(xiàn)已存在于物理內(nèi)存中了,僅僅在當(dāng)時(shí)進(jìn)程的頁(yè)表中沒有引證,MMU 只需求設(shè)置對(duì)應(yīng)的 entry 就能夠了,這個(gè)價(jià)值是適當(dāng)小的
majflt/s 指的 major faults,MMU 需求在當(dāng)時(shí)可用物理內(nèi)存中懇求一塊閑暇的物理頁(yè)面(如果沒有可用的閑暇頁(yè)面,則需求將其他物理頁(yè)面切換到交流空間去以開釋得到閑暇物理頁(yè)面),然后從外部加載數(shù)據(jù)到該物理頁(yè)面中,并設(shè)置好對(duì)應(yīng)的 entry,這個(gè)價(jià)值是適當(dāng)高的,和前者有幾個(gè)數(shù)據(jù)級(jí)的差異
-s:棧運(yùn)用狀況,包含 StkSize 為線程保存的棧空間,以及 StkRef 實(shí)際運(yùn)用的??臻g。運(yùn)用ulimit -s發(fā)現(xiàn)CentOS 6.x上面默許??臻g是10240K,而 CentOS 7.x、Ubuntu系列默許??臻g巨細(xì)為8196K
-u:CPU運(yùn)用率狀況,參數(shù)同前面相似
-w:線程上下文切換的數(shù)目,還細(xì)分為cswch/s因?yàn)榈群蛸Y源等要素導(dǎo)致的主動(dòng)切換,以及nvcswch/s線程CPU時(shí)刻導(dǎo)致的被迫切換的計(jì)算
如果每次都先ps得到程序的pid后再操作pidstat會(huì)顯得很費(fèi)事,所以這個(gè)殺手锏的-C能夠指定某個(gè)字符串,然后Command中如果包含這個(gè)字符串,那么該程序的信息就會(huì)被打印計(jì)算出來(lái),-l能夠閃現(xiàn)完好的程序名和參數(shù)
? ~ pidstat -w -t -C “ailaw” -l
這么看來(lái),如果檢查單個(gè)特別是多線程的使命時(shí)分,pidstat比常用的ps更好使!
1.4 其他
當(dāng)需求獨(dú)自監(jiān)測(cè)單個(gè) CPU 狀況的時(shí)分,除了 htop 還能夠運(yùn)用 mpstat,檢查在 SMP 處理器上各個(gè) Core 的作業(yè)量是否負(fù)載均衡,是否有某些熱門線程占用 Core。
? ~ mpstat -P ALL 1
如果想直接監(jiān)測(cè)某個(gè)進(jìn)程占用的資源,既能夠運(yùn)用top -u taozj的方法過(guò)濾掉其他用戶無(wú)關(guān)進(jìn)程,也能夠選用下面的方法進(jìn)行挑選,ps指令能夠自定義需求打印的條目信息:
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep 'ailawd'; sleep 1; done
如想理清承繼聯(lián)系,下面一個(gè)常用的參數(shù)能夠用于閃現(xiàn)進(jìn)程樹結(jié)構(gòu),閃現(xiàn)作用比pstree詳細(xì)漂亮的多
? ~ ps axjf
二、磁盤IO類
iotop 能夠直觀的閃現(xiàn)各個(gè)進(jìn)程、線程的磁盤讀取實(shí)時(shí)速率;lsof 不只能夠閃現(xiàn)一般文件的翻開信息(運(yùn)用者),還能夠操作 /dev/sda1 這類設(shè)備文件的翻開信息,那么比方當(dāng)分區(qū)無(wú)法 umount 的時(shí)分,就能夠經(jīng)過(guò) lsof 找出磁盤該分區(qū)的運(yùn)用狀況了,并且添加 +fg 參數(shù)還能夠額定閃現(xiàn)文件翻開 flag 符號(hào)。
2.1 iostat
? ~ iostat -xz 1
其實(shí)不管運(yùn)用 iostat -xz 1 仍是運(yùn)用 sar -d 1,關(guān)于磁盤重要的參數(shù)是:
avgqu-s:發(fā)送給設(shè)備 I/O 懇求的等候行列均勻長(zhǎng)度,關(guān)于單個(gè)磁盤如果值>1標(biāo)明設(shè)備飽滿,關(guān)于多個(gè)磁盤陣列的邏輯磁盤狀況在外
await(r_await、w_await):均勻每次設(shè)備 I/O 懇求操作的等候時(shí)刻(ms),包含懇求擺放在行列中和被效勞的時(shí)刻之和;
svctm:發(fā)送給設(shè)備 I/O 懇求的均勻效勞時(shí)刻(ms),如果 svctm 與 await 很挨近,標(biāo)明幾乎沒有 I/O 等候,磁盤功用很好,不然磁盤行列等候時(shí)刻較長(zhǎng),磁盤呼應(yīng)較差;
%util:設(shè)備的運(yùn)用率,標(biāo)明每秒中用于 I/O 作業(yè)時(shí)刻的占比,單個(gè)磁盤當(dāng) %util>60% 的時(shí)分功用就會(huì)下降(體現(xiàn)在 await 也會(huì)添加),當(dāng)挨近100%時(shí)分就設(shè)備飽滿了,但關(guān)于有多個(gè)磁盤陣列的邏輯磁盤狀況在外;
還有,盡管監(jiān)測(cè)到的磁盤功用比較差,可是不必定會(huì)對(duì)應(yīng)用程序的呼應(yīng)形成影響,內(nèi)核一般運(yùn)用 I/O asynchronously 技能,運(yùn)用讀寫緩存技能來(lái)改進(jìn)功用,不過(guò)這又跟上面的物理內(nèi)存的約束相制約了。
上面的這些參數(shù),對(duì)網(wǎng)絡(luò)文件體系也是受用的。
三、網(wǎng)絡(luò)類
網(wǎng)絡(luò)功用關(guān)于效勞器的重要性顯而易見,東西 iptraf 能夠直觀的實(shí)際網(wǎng)卡的收發(fā)速度信息,比較的簡(jiǎn)練便利經(jīng)過(guò) sar -n DEV 1 也能夠得到相似的吞吐量信息,而網(wǎng)卡都標(biāo)配了最大速率信息,比方百兆網(wǎng)卡千兆網(wǎng)卡,很簡(jiǎn)略檢查設(shè)備的利用率。
一般,網(wǎng)卡的傳輸速率并不是網(wǎng)絡(luò)開發(fā)中最為關(guān)懷的,而是針對(duì)特定的 UDP、TCP 銜接的丟包率、重傳率,以及網(wǎng)絡(luò)延時(shí)等信息。
3.1 netstat
? ~ netstat -s
閃現(xiàn)自從體系發(fā)動(dòng)以來(lái),各個(gè)協(xié)議的整體數(shù)據(jù)信息。盡管參數(shù)信息比較豐富有用,可是累計(jì)值,除非兩次運(yùn)轉(zhuǎn)做差才干得出當(dāng)時(shí)體系的網(wǎng)絡(luò)狀況信息,亦或許運(yùn)用 watch 眼睛直觀其數(shù)值改變趨勢(shì)。所以netstat一般用來(lái)檢測(cè)端口和銜接信息的:
netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
–timers能夠撤銷域名反向查詢,加速閃現(xiàn)速度;比較常用的有
? ~ netstat -antp #列出一切TCP的銜接
? ~ netstat -nltp #列出本地一切TCP偵聽套接字,不要加-a參數(shù)
3.2 sar
sar 這個(gè)東西太強(qiáng)壯了,什么 CPU、磁盤、頁(yè)面交流啥都管,這兒運(yùn)用 -n 首要用來(lái)剖析網(wǎng)絡(luò)活動(dòng),盡管網(wǎng)絡(luò)中它還給細(xì)分了 NFS、IP、ICMP、SOCK 等各種層次各種協(xié)議的數(shù)據(jù)信息,我們只關(guān)懷 TCP 和 UDP。下面的指令除了閃現(xiàn)慣例狀況下段、數(shù)據(jù)報(bào)的收發(fā)狀況,還包含
TCP
? ~ sudo sar -n TCP,ETCP 1
active/s:本地建議的 TCP 銜接,比方經(jīng)過(guò) connect(),TCP 的狀況從CLOSED -> SYN-SENT
passive/s:由長(zhǎng)途建議的 TCP 銜接,比方經(jīng)過(guò) accept(),TCP 的狀況從LISTEN -> SYN-RCVD
retrans/s(tcpRetransSegs):每秒鐘 TCP 重傳數(shù)目,一般在網(wǎng)絡(luò)質(zhì)量差,或許效勞器過(guò)載后丟包的狀況下,依據(jù) TCP 的承認(rèn)重傳機(jī)制會(huì)發(fā)作重傳操作
isegerr/s(tcpInErrs):每秒鐘接納到犯錯(cuò)的數(shù)據(jù)包(比方 checksum 失利)
UDP
? ~ sudo sar -n UDP 1
noport/s(udpNoPorts):每秒鐘接納到的可是卻沒有應(yīng)用程序在指定意圖端口的數(shù)據(jù)報(bào)個(gè)數(shù)
idgmerr/s(udpInErrors):除了上面原因之外的本機(jī)接納到但卻無(wú)法派發(fā)的數(shù)據(jù)報(bào)個(gè)數(shù)
當(dāng)然,這些數(shù)據(jù)必定程度上能夠闡明網(wǎng)絡(luò)可靠性,但也只要同詳細(xì)的事務(wù)需求場(chǎng)景結(jié)合起來(lái)才具有含義。
3.3 tcpdump
tcpdump 不得不說(shuō)是個(gè)好東西。我們都知道本地調(diào)試的時(shí)分喜愛運(yùn)用 wireshark,可是線上效勞端呈現(xiàn)問(wèn)題怎么弄呢?
附錄的參考文獻(xiàn)給出了思路:恢復(fù)環(huán)境,運(yùn)用 tcpdump 進(jìn)行抓包,當(dāng)問(wèn)題復(fù)現(xiàn)(比方日志閃現(xiàn)或許某個(gè)狀況閃現(xiàn))的時(shí)分,就能夠完畢抓包了,并且 tcpdump 自身帶有 -C/-W 參數(shù),能夠約束抓取包存儲(chǔ)文件的巨細(xì),當(dāng)?shù)竭_(dá)這個(gè)這個(gè)約束的時(shí)分保存的包數(shù)據(jù)主動(dòng) rotate,所以抓包數(shù)量整體仍是可控的。爾后將數(shù)據(jù)包拿下線來(lái),用 wireshark 想怎么看就怎么看,豈不樂(lè)哉!tcpdump 盡管沒有 GUI 界面,可是抓包的功用一點(diǎn)點(diǎn)不弱,能夠指定網(wǎng)卡、主機(jī)、端口、協(xié)議等各項(xiàng)過(guò)濾參數(shù),抓下來(lái)的包完好又帶有時(shí)刻戳,所以線上程序的數(shù)據(jù)包剖析也能夠這么簡(jiǎn)略。
下面就是一個(gè)小的測(cè)驗(yàn),可見 Chrome 發(fā)動(dòng)時(shí)分主意向 Webserver 建議樹立了三條銜接,因?yàn)檫@兒約束了 dst port 參數(shù),所以效勞端的應(yīng)對(duì)包被過(guò)濾掉了,拿下來(lái)用 wireshark 翻開,SYNC、ACK 樹立銜接的進(jìn)程仍是很明顯的!在運(yùn)用 tcpdump 的時(shí)分,需求盡可能的裝備抓取的過(guò)濾條件,一方面便于接下來(lái)的剖析,二則 tcpdump 敞開后對(duì)網(wǎng)卡和體系的功用會(huì)有影響,進(jìn)而會(huì)影響到在線事務(wù)的功用。
本文完!