系統(tǒng)性能監(jiān)控工具ssar實(shí)例精選 | 龍蜥SIG
[導(dǎo)讀]跟蹤診斷技術(shù)SIG致力于為操作系統(tǒng)生態(tài)提供系統(tǒng)性,工具化,并以數(shù)據(jù)為支撐的發(fā)現(xiàn)、跟蹤和診斷問(wèn)題的能力。SIG目標(biāo):為龍蜥社區(qū)(OpenAnolis)開(kāi)源操作系統(tǒng),提供一個(gè)全棧覆蓋內(nèi)核與核心組件的跟蹤和診斷工具,增強(qiáng)龍蜥社區(qū)(OpenAnolis)全棧的可觀察性和可靠性。作者廣成(...
跟蹤診斷技術(shù) SIG 致力于為操作系統(tǒng)生態(tài)提供系統(tǒng)性,工具化,并以數(shù)據(jù)為支撐的發(fā)現(xiàn)、跟蹤和診斷問(wèn)題的能力。
歡迎更多開(kāi)發(fā)者加入跟蹤診斷技術(shù)SIG:
前言
ssar 是阿里自研并貢獻(xiàn)至龍蜥社區(qū)的一款系統(tǒng)性能監(jiān)控工具。該工具系統(tǒng)開(kāi)銷很小,已經(jīng)在公司部分業(yè)務(wù)規(guī)模化部署,且持續(xù)穩(wěn)定運(yùn)行 1 年以上。
$ ssar proc -p $(pidof sresar) -i 1 --mem$ ssar proc -p $(pidof sresar) -i 1 --cpu
$ ssar load5s -f 2021-07-15T19:00:00 -r 300 -z
$ ssar procs -f 2021-09-09T14:51:00 -r 1 -o pid,rss,maj_flt,maj_dlt,cmd -k maj_dlt -l 5 pid rss maj_flt maj_dlt cmd 58532 8240736 126575484 1305199 java 46873 8237292 173405708 1257924 java 51357 577796 13201 63 python 253136 566352 11687 46 syslog-ng 46025 1229520 478 42 bash 進(jìn)一步,通過(guò) ssar 的 procs 子命令,可以定位到發(fā)生大量主缺頁(yè)中斷的正是 pid 為 58532 和 46873 這 2 個(gè) java 進(jìn)程。引起 java 進(jìn)程大量發(fā)生主缺頁(yè)中斷的原因是進(jìn)程 rss 內(nèi)存極度逼近 cgroup 組設(shè)置的memory.limit_in_bytes 值,導(dǎo)致 cgroup 組內(nèi)留給 clean 狀態(tài)的代碼段內(nèi)存空間不足以完全加載所有程序代碼段。所以代碼段在程序執(zhí)行中,只能不斷的被丟棄再?gòu)拇疟P讀取。
$ tsar2 --tcpofoTime -tcpofo-- ---tcpofo--- ---tcpofo--- -tcpofo- tcpofo- -tcpofo-Time OfoPruned DSACKOfoSent DSACKOfoRecv OFOQueue OFODrop OFOMerge08/09/21-16:45 0.00 0.00 0.00 251.86 0.00 0.0008/09/21-16:50 0.00 0.00 0.00 182.35 0.00 0.0008/09/21-16:55 0.00 0.00 0.00 115.70 0.00 0.00 ?
$ tsar2 --tcperrTime ---tcperr--- ---tcperr--- ---tcperr--- ---tcperr---- --tcperr---Time RenoFailures SackFailures LossFailures AbortOnMemory AbortFailed08/09/21-16:45 0.00 0.00 0.00 0.00 0.0008/09/21-16:50 0.00 0.00 0.00 0.00 0.0008/09/21-16:55 0.00 0.00 0.00 0.00 0.00 ?
$ sudo systemctl restart sresar # 重啟采集進(jìn)程配置文件生效 ?
關(guān)于龍蜥社區(qū)SIGSIG是開(kāi)放的,并爭(zhēng)取讓交付成果成為社區(qū)發(fā)行的一部分,由組內(nèi)核心成員主導(dǎo)治理,可通過(guò)郵件列表和組內(nèi)的成員進(jìn)行交流。龍蜥社區(qū)SIG目前已超20個(gè),包括跟蹤診斷技術(shù)SIG、商密軟件棧、高性能存儲(chǔ)技術(shù)SIG、Java語(yǔ)言與虛擬機(jī)SIG、Cloud Kernel、OceanBase SIG等。
歡迎更多開(kāi)發(fā)者加入跟蹤診斷技術(shù)SIG:
前言
ssar 是阿里自研并貢獻(xiàn)至龍蜥社區(qū)的一款系統(tǒng)性能監(jiān)控工具。該工具系統(tǒng)開(kāi)銷很小,已經(jīng)在公司部分業(yè)務(wù)規(guī)模化部署,且持續(xù)穩(wěn)定運(yùn)行 1 年以上。
一、定位 CPU 和內(nèi)存波動(dòng)時(shí)的進(jìn)程級(jí)因素
日常運(yùn)維中,整機(jī) CPU 和內(nèi)存經(jīng)常出現(xiàn)較大的增長(zhǎng),從而引起系統(tǒng)不穩(wěn)定。此時(shí)特別需要能回朔歷史數(shù)據(jù),查看指標(biāo)波動(dòng)時(shí)刻的進(jìn)程級(jí) CPU 和內(nèi)存等影響因素。
二、跟蹤單進(jìn)程的CPU和內(nèi)存波動(dòng)詳情
通過(guò)上面的方法,發(fā)掘出了影響整機(jī)指標(biāo)波動(dòng)的進(jìn)程,還可以進(jìn)一步通過(guò) proc 子命令更進(jìn)一步追蹤特定進(jìn)程的 CPU 和內(nèi)存變化情況。其中左尖括號(hào)(<)表示 2021-08-09T11:39:00 時(shí)刻該 sresar 進(jìn)程還沒(méi)有啟動(dòng),右尖括號(hào)(>)表示 2021-08-09T11:47:00 時(shí)刻該 sresar 進(jìn)程已經(jīng)結(jié)束。
$ ssar proc -p $(pidof sresar) -i 1 --mem$ ssar proc -p $(pidof sresar) -i 1 --cpu
三、記錄5秒級(jí)精度的系統(tǒng)load信息
ssar 的 load5s 子命令不僅將 load 的精度提高到了 5s,還創(chuàng)造性增加了load5s 指標(biāo),load5s 指標(biāo)比 load1、load5 和 load15 指標(biāo)更加精準(zhǔn),更能反映系統(tǒng)當(dāng)時(shí)的壓力情況。這里明顯可以看出傳統(tǒng)的 load1 指標(biāo)在系統(tǒng)負(fù)載壓力消失后,還一定的滯后性,但load5s指標(biāo)卻可以精準(zhǔn)的顯示機(jī)器的負(fù)載壓力。
$ ssar load5s -f 2021-07-15T19:00:00 -r 300 -z
四、記錄線程D狀態(tài)異常的stack詳情
對(duì)于 load5s 值大于 CPU 核數(shù)一定倍數(shù)的情況,會(huì)觸發(fā) load 詳情的采集,其中針對(duì) D 狀態(tài)線程會(huì)抽樣記錄內(nèi)核調(diào)用棧。使用 load2p 可以顯示詳細(xì)的 D 狀態(tài)調(diào)用棧信息。
五、診斷整機(jī)高階內(nèi)存不足情況
系統(tǒng)內(nèi)存不足相關(guān)的問(wèn)題,一直是日常運(yùn)維中最常見(jiàn)的問(wèn)題之一。有時(shí)候我們會(huì)從系統(tǒng)日志中看到類似這樣的日志信息“page allocction failure: order:4”,這是 free 內(nèi)存不足,并且伴隨內(nèi)存碎片化,內(nèi)核空間申請(qǐng)不到高階內(nèi)存的表現(xiàn)。
六、定位 Cgroup 級(jí)別的內(nèi)存顛簸問(wèn)題
在 cgroup 層面出現(xiàn)內(nèi)存不足時(shí),也有一個(gè)內(nèi)存顛簸問(wèn)題,會(huì)引起系統(tǒng)嚴(yán)重的問(wèn)題。
$ ssar procs -f 2021-09-09T14:51:00 -r 1 -o pid,rss,maj_flt,maj_dlt,cmd -k maj_dlt -l 5 pid rss maj_flt maj_dlt cmd 58532 8240736 126575484 1305199 java 46873 8237292 173405708 1257924 java 51357 577796 13201 63 python 253136 566352 11687 46 syslog-ng 46025 1229520 478 42 bash 進(jìn)一步,通過(guò) ssar 的 procs 子命令,可以定位到發(fā)生大量主缺頁(yè)中斷的正是 pid 為 58532 和 46873 這 2 個(gè) java 進(jìn)程。引起 java 進(jìn)程大量發(fā)生主缺頁(yè)中斷的原因是進(jìn)程 rss 內(nèi)存極度逼近 cgroup 組設(shè)置的memory.limit_in_bytes 值,導(dǎo)致 cgroup 組內(nèi)留給 clean 狀態(tài)的代碼段內(nèi)存空間不足以完全加載所有程序代碼段。所以代碼段在程序執(zhí)行中,只能不斷的被丟棄再?gòu)拇疟P讀取。
七、網(wǎng)絡(luò) TCP 重傳擴(kuò)展信息
在主機(jī)網(wǎng)絡(luò)層面,日常運(yùn)維中也會(huì)受到網(wǎng)絡(luò)丟包、重傳和亂序等問(wèn)題的困擾。這里也提供了幾組更加深入的網(wǎng)絡(luò)指標(biāo)供診斷網(wǎng)絡(luò)問(wèn)題使用。
$ tsar2 --tcpofoTime -tcpofo-- ---tcpofo--- ---tcpofo--- -tcpofo- tcpofo- -tcpofo-Time OfoPruned DSACKOfoSent DSACKOfoRecv OFOQueue OFODrop OFOMerge08/09/21-16:45 0.00 0.00 0.00 251.86 0.00 0.0008/09/21-16:50 0.00 0.00 0.00 182.35 0.00 0.0008/09/21-16:55 0.00 0.00 0.00 115.70 0.00 0.00 ?
$ tsar2 --tcperrTime ---tcperr--- ---tcperr--- ---tcperr--- ---tcperr---- --tcperr---Time RenoFailures SackFailures LossFailures AbortOnMemory AbortFailed08/09/21-16:45 0.00 0.00 0.00 0.00 0.0008/09/21-16:50 0.00 0.00 0.00 0.00 0.0008/09/21-16:55 0.00 0.00 0.00 0.00 0.00 ?
八、自定義采集任意系統(tǒng)指標(biāo)
做驅(qū)動(dòng)開(kāi)發(fā)的同學(xué)很可能希望能記錄自己的驅(qū)動(dòng)模塊中一些性能數(shù)據(jù),ssar 工具為這種場(chǎng)景提供了簡(jiǎn)單和完善的采集方案。只需要驅(qū)動(dòng)開(kāi)發(fā)同學(xué),將內(nèi)核模塊中的性能指標(biāo)通過(guò)/proc/或/sys/下的偽文件方式暴露為用戶空間即可。數(shù)據(jù)可以是累積值,也可以是瞬時(shí)值,例如 mydev 偽文件中有 2 個(gè)值,左側(cè)的indicator1 是累積值,右側(cè)的 indicator2 是瞬時(shí)值。
$ sudo systemctl restart sresar # 重啟采集進(jìn)程配置文件生效 ?
九、診斷特定CPU中斷不均情況
特定 CPU 的 softirq 資源消耗過(guò)多,會(huì)影響此 CPU 上用于用戶空間的資源使用。因此當(dāng)中斷分布不均時(shí),會(huì)嚴(yán)重影響用戶空間進(jìn)程的執(zhí)行。首先需要了解 softirq 資源消耗在各個(gè) CPU 之間是否均衡。
十、支持靈活的數(shù)據(jù)輸出和解析
ssar 不僅數(shù)據(jù)指標(biāo)非常豐富,而且輸出格式上也非常易于使用和解析。ssar 的所有數(shù)據(jù)輸出,都支持支持 json 格式輸出,便于 python 等高級(jí)語(yǔ)言的解析。使用方法就是在命令上增加一個(gè) --api 選項(xiàng)。
關(guān)于龍蜥社區(qū)SIGSIG是開(kāi)放的,并爭(zhēng)取讓交付成果成為社區(qū)發(fā)行的一部分,由組內(nèi)核心成員主導(dǎo)治理,可通過(guò)郵件列表和組內(nèi)的成員進(jìn)行交流。龍蜥社區(qū)SIG目前已超20個(gè),包括跟蹤診斷技術(shù)SIG、商密軟件棧、高性能存儲(chǔ)技術(shù)SIG、Java語(yǔ)言與虛擬機(jī)SIG、Cloud Kernel、OceanBase SIG等。