直播回顾:准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核?| 龙蜥技术
簡(jiǎn)介:?你還在為分析機(jī)器負(fù)載高而苦惱?這款 ssar 工具獨(dú)創(chuàng) load5s 指標(biāo)精準(zhǔn)定位超硬核。??
編者按:本文整理自龍蜥SIG技術(shù)周會(huì),作者聞茂泉,阿里云計(jì)算平臺(tái)事業(yè)部SRE運(yùn)維專家,是龍蜥社區(qū)跟蹤診斷SIG核心成員。本文帶你了解 ssar 的基本功能和使用、初步學(xué)習(xí)用 ssar 解決單機(jī) OS 問(wèn)題的診斷。直播視頻回放已上線至龍蜥社區(qū)官網(wǎng):首頁(yè)-支持-視頻,歡迎觀看。
一、系統(tǒng)性能分析工具 ssar 功能定位??
說(shuō)起性能分析就不得不提到《性能之巔》這本書,它是業(yè)界里程碑式的經(jīng)典書籍。在書中第 4 章觀測(cè)工具部分,Brendan 告訴我們觀測(cè)工具主要包括:計(jì)數(shù)器(Counters)、跟蹤(Tracing)、采樣(Profiling)和監(jiān)控(Monitoring)幾大類。
依據(jù)數(shù)據(jù)獲取方式和數(shù)據(jù)實(shí)時(shí)性兩個(gè)維度,可以將性能觀測(cè)工具做個(gè)分類:
1)左上角 A 區(qū)是直接讀取計(jì)數(shù)器實(shí)時(shí)數(shù)據(jù)的一些系統(tǒng)命令,top、ps 這些命令我們都很常用,它們讀取的是 /proc/ 這個(gè)目錄的信息,這里面的數(shù)據(jù)是內(nèi)核幫我們記賬出來(lái)的。
2)左下角 B 區(qū)也是基于計(jì)數(shù)器的 ,但它是記錄歷史信息的工具,比如說(shuō)最常用的就是sar工具,下文我們統(tǒng)稱這類工具為系統(tǒng)性能監(jiān)控工具。在阿里內(nèi)部也有 tsar 工具,國(guó)外還有開源軟件 atop。系統(tǒng)性能監(jiān)控工具一方面可以回溯歷史數(shù)據(jù),同時(shí)也提供實(shí)時(shí)模式數(shù)據(jù)。
3)右上角 C 區(qū)跟蹤采樣工具,內(nèi)核的 tracepoint、kprobe 等就是跟蹤類工具,perf 工具主要是采樣類工具,下文我們統(tǒng)稱這兩類工具為跟蹤采樣工具。目前這些工具都是只獲取實(shí)時(shí)的數(shù)據(jù)。如果不結(jié)合其他工具,單純使用它們來(lái)追查歷史數(shù)據(jù),它們是無(wú)法提供的。
4)右下角 D 區(qū),我們認(rèn)為可以通過(guò) B 區(qū)和 C 區(qū)的工具協(xié)同使用達(dá)到目標(biāo)。C 區(qū)工具只負(fù)責(zé)獲取內(nèi)核關(guān)鍵數(shù)據(jù),B 區(qū)工具只負(fù)責(zé)數(shù)據(jù)采集和數(shù)據(jù)獲取,二者之間使用標(biāo)準(zhǔn)數(shù)據(jù)接口。
我們?cè)谛阅芊治龉こ虒?shí)踐中重點(diǎn)聚焦在左下 B 區(qū)和右上 C 區(qū)藍(lán)框 2 個(gè)象限的建設(shè)上。今天我們主要探討的就是 B 區(qū)的系統(tǒng)性能監(jiān)控工具建設(shè)情況。以后會(huì)再給大家介紹 C 區(qū)的工具建設(shè)情況。
在對(duì)系統(tǒng)性能監(jiān)控和跟蹤采樣工具的具體理解上,我們認(rèn)同如下 3 個(gè)理念:
1)內(nèi)核計(jì)數(shù)器(Counters)信息獲取代價(jià)低,無(wú)額外開銷。相比較而言,跟蹤采樣工具或多或少都有一些運(yùn)行開銷,如 kprobe 的使用還可能會(huì)引起一些穩(wěn)定性風(fēng)險(xiǎn)。因此,我們傾向于最大化挖掘計(jì)數(shù)器信息的價(jià)值。比如要獲知機(jī)器直接內(nèi)存回收的信息時(shí),內(nèi)核計(jì)數(shù)器已經(jīng)提供了更低代價(jià)獲取的直接內(nèi)存回收和異步內(nèi)存回收的指標(biāo),就完全沒必要使用 ftrace 監(jiān)控直接內(nèi)存回收的情況了。另一方面,對(duì)于內(nèi)核計(jì)數(shù)器不能涵蓋的細(xì)顆粒度內(nèi)核數(shù)據(jù),還必須要依賴內(nèi)核跟蹤采樣工具獲取。比如當(dāng) IOPS 較高時(shí),我們想了解具體的每一個(gè) IO 讀寫的具體文件信息,內(nèi)核計(jì)數(shù)器中完全沒有相關(guān)信息。只有讓跟蹤采樣工具專注于自己的核心任務(wù),才更有條件打磨出更加穩(wěn)定和可靠的精品工具。
2)現(xiàn)有的系統(tǒng)性能監(jiān)控工具,除單機(jī)監(jiān)控工具外,還有很多白屏化的監(jiān)控平臺(tái)。白屏化監(jiān)控平臺(tái)一般都是將數(shù)據(jù)采集到中心數(shù)據(jù)庫(kù),然后再集中展示。白平化監(jiān)控平臺(tái)采集更詳細(xì)的計(jì)數(shù)器信息時(shí),不可避免的都會(huì)遇到存儲(chǔ)成本的問(wèn)題,不宜將過(guò)多數(shù)據(jù)采集到白屏化監(jiān)控平臺(tái)。但同時(shí)對(duì)于一些高頻使用的常規(guī)指標(biāo),如 CPU、內(nèi)存和網(wǎng)絡(luò)使用率情況,使用白屏化監(jiān)控平臺(tái)展示,確實(shí)可以大大提升可觀測(cè)性。所以高頻常規(guī)指標(biāo)使用白屏化監(jiān)控平臺(tái)的同時(shí),仍然需要一個(gè)數(shù)據(jù)指標(biāo)更加豐富的單機(jī)系統(tǒng)性能監(jiān)控工具配合使用。在一些關(guān)鍵時(shí)刻,還必須依賴這些低頻數(shù)據(jù)來(lái)分析和定位問(wèn)題。
3)傳統(tǒng)的黑屏系統(tǒng)性能監(jiān)控工具,多年來(lái)一直相對(duì)比較固化,歷數(shù) 2010 年、2015 年、2020 年指標(biāo)內(nèi)容變化不是特別大。舉個(gè)例子,新版本內(nèi)核的計(jì)數(shù)器中,網(wǎng)絡(luò)擴(kuò)展指標(biāo)多達(dá) 400 多個(gè),僅 TCP 擴(kuò)展指標(biāo)就有 116 個(gè),但是實(shí)際上常規(guī)的系統(tǒng)性能監(jiān)控在TCP網(wǎng)絡(luò)指標(biāo)這一塊,也就使用了不超過(guò) 15 個(gè)指標(biāo),大部分指標(biāo)價(jià)值并沒有被挖掘出來(lái)。這些網(wǎng)絡(luò)的內(nèi)核計(jì)數(shù)器指標(biāo),在很多網(wǎng)絡(luò)相關(guān)問(wèn)題發(fā)生時(shí),都很有實(shí)用價(jià)值。
基于這些理念,我們認(rèn)為研發(fā)一款數(shù)據(jù)指標(biāo)更全、迭代周期更短、性能更加穩(wěn)定的系統(tǒng)性能監(jiān)控工具,以應(yīng)對(duì)日益復(fù)雜的系統(tǒng)性能問(wèn)題是很必要的。
今天我們要介紹的阿里自研 ssar 工具,就是這樣一款系統(tǒng)性能監(jiān)控類工具,并且已經(jīng)在知名的操作系統(tǒng)社區(qū)龍蜥開源。它幾乎涵蓋了傳統(tǒng)系統(tǒng)性能監(jiān)控 sar 工具的所有功能,同時(shí)擴(kuò)展了更多的整機(jī)級(jí)別的指標(biāo),新增了進(jìn)程級(jí)指標(biāo)和特色的 load 指標(biāo)、load 高問(wèn)題的診斷是這個(gè)工具一個(gè)獨(dú)特的功能。
開源軟件 atop 也是這樣一個(gè)類似功能的系統(tǒng)性能監(jiān)控工具。公開渠道了解到友商也在大規(guī)模部署 atop 工具,這說(shuō)明在業(yè)界其他互聯(lián)網(wǎng)公司也感受到了擁有這樣一個(gè)功能定位的監(jiān)控工具的重要性。
二、系統(tǒng)性能分析工具 ssar 簡(jiǎn)介
系統(tǒng)性能監(jiān)控工具 ssar 開源地址(見文末),其中 Reference_zh-CN.md 是更詳細(xì)的中文幫助手冊(cè),package 目錄中有 rpm 和 deb 包提供,其他操作系統(tǒng)可以自行編譯打包。
ssar工具分為采集器、內(nèi)層的通用查詢器、外層的增強(qiáng)查詢器和經(jīng)典查詢器幾部分。
1)采集器 sresar:C 語(yǔ)言實(shí)現(xiàn)的一個(gè)常駐進(jìn)程,將數(shù)據(jù)記錄到本地磁盤,采集數(shù)據(jù)內(nèi)容包括:(a) 按文件單位采集的整機(jī)數(shù)據(jù)、meminfo、stat、vmstat等; (b) 包含 24 個(gè)指標(biāo)的進(jìn)程級(jí)數(shù)據(jù);(c) 獨(dú)特的 load5s 指標(biāo)和詳細(xì)的 R 或 D 狀態(tài)線程詳情數(shù)據(jù);
2)通用查詢器 ssar 命令:c++ 語(yǔ)言實(shí)現(xiàn),負(fù)責(zé)按文件名、某行、某列等通用規(guī)則對(duì)文件數(shù)據(jù)進(jìn)行邏輯解析;
3)古典查詢器tsar2:python 語(yǔ)言實(shí)現(xiàn),對(duì) ssar 命令進(jìn)行封裝,全面兼容 tsar 命令;
4)增強(qiáng)查詢器ssar+:python 語(yǔ)言實(shí)現(xiàn),對(duì) ssar 命令進(jìn)行封裝,規(guī)劃上是未來(lái) ssar 工具的主要核心,適合于把較復(fù)雜的數(shù)據(jù)邏輯放在 python 語(yǔ)言實(shí)現(xiàn)層。
三、系統(tǒng)性能分析工具 ssar 支持快速開發(fā)迭代
傳統(tǒng) sar 工具只采集一些固定指標(biāo),使用 C 語(yǔ)言采集數(shù)據(jù)的同時(shí)進(jìn)行指標(biāo)解析。在這種模式下,不是極難擴(kuò)展新指標(biāo),就是擴(kuò)展新指標(biāo)開發(fā)迭代周期特別長(zhǎng)。
ssar工具完全顛覆了傳統(tǒng) sar工具的架構(gòu)設(shè)計(jì),在產(chǎn)品設(shè)計(jì)和程序架構(gòu)上做了很多變化,可以讓我們快速、低開發(fā)成本的增加新的計(jì)數(shù)器指標(biāo)。
1)如果我們需要關(guān)注一個(gè)新的指標(biāo),而這個(gè)指標(biāo)又沒有被采集。對(duì)于傳統(tǒng)的系統(tǒng)性能監(jiān)控工具sar來(lái)說(shuō),修改發(fā)布迭代周期是非常長(zhǎng)的,發(fā)布下來(lái)可能要數(shù)周到數(shù)月,中間要經(jīng)過(guò)逐步的灰度發(fā)布過(guò)程。在學(xué)習(xí)內(nèi)核知識(shí)或者解決生產(chǎn)問(wèn)題的時(shí)候,新問(wèn)題等不起這么久。但 ssar 工具以文件為采集單位,不需要修改代碼,直接修改配置文件,重啟 srerar 采集進(jìn)程就可以采集到一個(gè)新的數(shù)據(jù)源文件。新增采集文件可在 sys.conf 文件中的 file 區(qū)域增加一行配置項(xiàng),其中 sre_path 為數(shù)據(jù)源位置,cfile 為數(shù)據(jù)文件存儲(chǔ)名,turn 為開啟采集。
2)ssar 工具把一些通用處理邏輯都抽象到通用查詢器 ssar 命令里,配置了文件采集后,只需一條 ssar 命令即可查詢顯示數(shù)據(jù),完美實(shí)現(xiàn)分鐘級(jí)周期的開發(fā)迭代。其中cfile指定存儲(chǔ)文件名,line 指定第 3 行,column 指定第 5 到 15 行,metric 指定顯示原值,alias指定指標(biāo)名稱。
3)ssar 會(huì)把更加復(fù)雜的數(shù)據(jù)邏輯放到外層 python 語(yǔ)言的查詢器中實(shí)現(xiàn)。這個(gè)時(shí)候很容易通過(guò)在 python 語(yǔ)言中適應(yīng)數(shù)據(jù)格式的變化。內(nèi)核中有些指標(biāo)的格式會(huì)隨著內(nèi)核版本的變化而變化,比如 TCP 的 TimeWaitOverflow 指標(biāo)在 3.10、4.9 和 4.19 版中所處的列數(shù)就不同。此時(shí)通過(guò) python 語(yǔ)言可以輕松獲取 column 值,再傳遞給ssar通用查詢器。即使面對(duì)未來(lái)的內(nèi)核版本中的各種未知格式變化,我們也可以在python語(yǔ)言查詢器中輕松應(yīng)對(duì)自如。可隨時(shí)調(diào)試和升級(jí)python查詢器,如 cp tsar2 ?/tmp/test.py。不論是單機(jī)環(huán)境 debug,還是腳本批量下發(fā),均可輕量級(jí)操作。
四、ssar 工具整機(jī)指標(biāo)使用介紹
ssar 命令顯示整機(jī)指標(biāo)信息,其中 /s 結(jié)尾的是增量指標(biāo),表示當(dāng)前時(shí)刻和上一個(gè)時(shí)刻的區(qū)間內(nèi)平均每秒的增量數(shù)值。無(wú) /s 結(jié)尾的是刻度指標(biāo),只表示當(dāng)前時(shí)刻的瞬時(shí)值。
使用 help 選項(xiàng)可獲取整機(jī)指標(biāo)使用幫助信息。
各個(gè)選項(xiàng)參數(shù)的含義如上所示,選項(xiàng)參數(shù)有如下一些特點(diǎn):
1)-f 選項(xiàng)指定顯示數(shù)據(jù)的結(jié)束時(shí)間點(diǎn),-b 選項(xiàng)指定顯示數(shù)據(jù)的開始時(shí)間點(diǎn),-r 選項(xiàng)指定顯示數(shù)據(jù)的時(shí)間區(qū)間長(zhǎng)度,三個(gè)選項(xiàng)只需指定 2 個(gè)即可。-f 選項(xiàng)默認(rèn)值為當(dāng)前時(shí)刻,-r 選項(xiàng)默認(rèn)值為 300 分鐘。
2)各個(gè)選項(xiàng)參數(shù)值大多可以支持輸入小數(shù),單位分別支持天、時(shí)、分、秒,如1.2d、5.5h、60m 和 1s。如無(wú)單位后綴,則默認(rèn)單位后綴是m分鐘,如 60 同 60m。
3)-H選項(xiàng)用于隱藏header信息,使輸出結(jié)果更便于各種 shell 命令的解析,--api輸出json格式數(shù)據(jù),使輸出結(jié)果更便于python腳本等高級(jí)語(yǔ)言解析。
4)小o選項(xiàng)用于指定輸出數(shù)據(jù)列的字段信息,多列指標(biāo)用逗號(hào)隔開。對(duì)于高頻常用的多個(gè)字段輸出,還提供字段組合選項(xiàng),如--cpu、--mem。大O選項(xiàng)用于在既有字段組合輸出基礎(chǔ)上,追加輸出指標(biāo)信息。因此,大O選項(xiàng)可與--cpu ?--mem等同時(shí)使用,而小o選項(xiàng)和大O選項(xiàng)及其他字段組合互斥。
ssar 對(duì)整機(jī)指標(biāo)的采集是以文件為單位,通過(guò) toml 格式的配置文件 /etc/ssar/sys.conf 配置及開關(guān)文件的采集:
1)src_path='/proc/stat' 表示采集數(shù)據(jù)源文件位置為/proc/stat;
2)cfile='stat'表示保存的數(shù)據(jù)文件后綴名為 stat;
3)turn 選項(xiàng)控制當(dāng)前采集是否開啟,設(shè)置為 true 開啟采集;
4)gzip 選項(xiàng)控制采集文件是否采用 gzip 壓縮格式存儲(chǔ),設(shè)置為 true 開啟壓縮;
ssar 支持兩種數(shù)據(jù)提取方式,預(yù)定義方式和自定義方式。
ssar 預(yù)定義指標(biāo)提取數(shù)據(jù)方式適合于使用 ssar 命令直接消費(fèi)數(shù)據(jù)的場(chǎng)景。預(yù)定義指標(biāo)可在 sys.conf 文件中靈活的配置,下面 2 個(gè)例子說(shuō)明了如何配置預(yù)定義指標(biāo):
1)配置項(xiàng) user 表示指標(biāo)名為 user,數(shù)據(jù)文件后綴為 stat,取開頭為 cpu 的行的第 2 列數(shù)據(jù)的差值,輸出字段寬度 10 個(gè)字節(jié)。
2)配置項(xiàng)insegs表示指標(biāo)名為 insegs,數(shù)據(jù)文件后綴為 snmp,取第 8 行的第 11 列數(shù)據(jù)的差值,輸出字段寬度 10 個(gè)字節(jié)。
配置了預(yù)定義指標(biāo)后,可以進(jìn)一步配置 view 視圖,聚合預(yù)定義指標(biāo)到一個(gè)視圖下。這就是 ssar --cpu 的命令里 --cpu 的來(lái)源。
ssar 也支持自定義指標(biāo)方式提取數(shù)據(jù)指標(biāo),自定義指標(biāo)提取數(shù)據(jù)方式適合于使用python語(yǔ)言封裝的查詢器使用。如下是一些自定義指標(biāo)方式的使用示例:
1)取 meminfo 中 MemFree 值,字段名命名為 freessar -o 'metric=c|cfile=meminfo|line_begin=MemFree:|column=2|alias=free'
2)取 snmp 中第 8 行第 13 列值的差值ssar -o 'metric=d:cfile=snmp:line=8:column=13:alias=retranssegs'
3)顯示 cpu0 到 cpu15 的 idle 的實(shí)時(shí)模式數(shù)據(jù)
ssar -o 'metric=d|cfile=stat|line=2-17|column=5|alias=idle_{line};' -f +100
自定義方式使用方法說(shuō)明:
1)cfile 用來(lái)指定數(shù)據(jù)文件中的后綴名,需要同 sys.conf 配置文件中的 [file] 部分的 cfile 的值保持一致;
2)line 直接指定指標(biāo)所在的行數(shù),line 與 line_begin 不能同時(shí)指定;
3)line_begin 指定指標(biāo)所在行的行首匹配關(guān)鍵字符串,需要保證在整個(gè)文件中獨(dú)一無(wú)二;
4)column 指定指標(biāo)在特定行所處的列數(shù),列以空格為分隔符;
5)metric 用于指定按以上規(guī)則獲取到值后是原值輸出,還是取相鄰時(shí)間的差值輸出,值為c表示原值輸出,為d表示取差值輸出;
6)alias 用于指定當(dāng)前指標(biāo)輸出的標(biāo)題名或 json 格式中的 key 值.
tsar工具是阿里集團(tuán)的一款經(jīng)典系統(tǒng)性能監(jiān)控工具。基于ssar命令的整機(jī)自定義指標(biāo)方式,使用python語(yǔ)言封裝的 tsar2 命令幾乎完全兼容tsar命令。
各個(gè)模塊的指標(biāo)集合:
tsar2 命令不但功能十分強(qiáng)大,而且開發(fā)成本極低:
1)tsar2開發(fā)周期只有不到2周時(shí)間;
2)tsar2命令兼容 tsar 功能部分的python代碼實(shí)現(xiàn)只有600多行;
3)tsar2在兼容原有基礎(chǔ)功能的基礎(chǔ)上還新增了4組網(wǎng)絡(luò)診斷指標(biāo),不考慮前期預(yù)研的時(shí)間,4組指標(biāo)的代碼實(shí)現(xiàn)時(shí)間只用了2個(gè)小時(shí)。4組網(wǎng)絡(luò)診斷指標(biāo):tsar2 ?--tcpofo、tsar2 ?--retran、tsar2 ?--tcpdrop、tsar2 ?--tcperr。
基于 ssar 良好的擴(kuò)展性和低擴(kuò)展開發(fā)門檻,針對(duì)軟中斷分布不均這種業(yè)界常見問(wèn)題,使用 python 語(yǔ)言實(shí)現(xiàn)了 3 組功能強(qiáng)大的診斷功能:
1)首先,tsar2 的 cputop 子命令可以將各個(gè)核軟中斷 CPU 使用率(sirq)最高的核排序出來(lái)。N1 表示排序最高的 CPU 信息,N2 表示排序次高的 CPU 信息。比如 11:35 這個(gè)時(shí)刻下 N1 的三個(gè)值表示 54 號(hào)核 CPU 的 sirq 軟中斷使用率為第 54 號(hào)核 CPU 資源的 21.84%。從圖中顯示的部分?jǐn)?shù)據(jù)看 54 號(hào)核頻繁出現(xiàn)軟中斷 sirq 使用較高的情況。
2)如果我們不確定找到 54 號(hào)核 CPU 是否準(zhǔn)確,還可以通過(guò) tsar2 命令的 cpu 視圖中指定觀察 cpu54 核的 sirq 的變化。
3)一旦確定軟中斷 CPU 使用率異常的 CPU 核號(hào),可以通過(guò) tsar2 的 irqtop 子命令查找引起問(wèn)題的具體軟中斷信息。在 irqtop 子命令中指定 54 號(hào) CPU,并排序出軟中斷次數(shù)最多的 irq 號(hào)是 155,對(duì)應(yīng)的 irq 名稱是 virtio3-input.1,并且看到 11:50:48 秒的軟中斷次數(shù)高達(dá) 1.9K。
irqtop子命令默認(rèn)只支持實(shí)時(shí)模式。如需開啟歷史模式可去掉命令中-l選項(xiàng),同時(shí)還需要修改配置文件 sys.conf,開啟 interrupts 數(shù)據(jù)文件的采集。
如此強(qiáng)大的cputop和irqtop子命令同樣也是在python語(yǔ)言中,通過(guò)400行代碼輕松實(shí)現(xiàn)。這里也同樣表明了在ssar架構(gòu)下,開發(fā)新的系統(tǒng)性能監(jiān)控功能的靈活優(yōu)勢(shì)。
五、ssar工具進(jìn)程指標(biāo)使用介紹
ssar 的 procs 子命令可以顯示多進(jìn)程信息,效果相當(dāng)于可以顯示任意歷史時(shí)刻的 linux ps 命令的輸出。
ssar 的 procs 子命令選項(xiàng)可參考ssar procs -h命令,選項(xiàng)參數(shù)有如下一些特點(diǎn):
1)-f、-b和-r選項(xiàng)同樣只需指定2個(gè)選項(xiàng)即可,-f選項(xiàng)默認(rèn)值為當(dāng)前時(shí)刻,-r選項(xiàng)默認(rèn)值為5分鐘。多進(jìn)程子命令情況下,只會(huì)在開始和結(jié)束時(shí)刻分別取 2 個(gè)時(shí)刻數(shù)據(jù)進(jìn)行對(duì)比。瞬時(shí)的刻度類指標(biāo)只顯示結(jié)束時(shí)刻值。
2)強(qiáng)大的字段排序功能支持多字段依次排序,先按第一個(gè)字段排序,相同值按第二個(gè)字段排序。排序字段前減號(hào)表示降序排序,排序字段前加號(hào)表示升序排序。每個(gè)字段都有系統(tǒng)內(nèi)建排序規(guī)則,通常數(shù)據(jù)類指標(biāo)按降序排序,如rss,屬性指標(biāo)按升序排序,如 pid。
3)所有進(jìn)程排序后,-l選項(xiàng)可限制輸出進(jìn)程的行數(shù)。
4)兩個(gè)特色的指標(biāo)組合 --job 和 --sched,用于進(jìn)程組和調(diào)度問(wèn)題排查。
ssar 的 proc 子命令顯示單進(jìn)程縱向歷史時(shí)刻信息。
1)-p選項(xiàng)為必選參數(shù),用于指定需要顯示的進(jìn)程的 pid 信息。
2)-f選項(xiàng)指定結(jié)束時(shí)間點(diǎn),-b選項(xiàng)指定開始時(shí)間點(diǎn),-r選項(xiàng)指定時(shí)間跨度,三個(gè)選項(xiàng)只需指定2個(gè)即可。-f默認(rèn)值為當(dāng)前時(shí)刻,-r默認(rèn)值為 300 分鐘。
3)-H選項(xiàng)隱藏header信息更便于shell腳本解析,--api選項(xiàng)輸出json格式數(shù)據(jù)更便于python腳本等高級(jí)語(yǔ)言解析。
4)小 o 選項(xiàng)用于指定輸出數(shù)據(jù)列的字段,多列指標(biāo)用逗號(hào)隔開。對(duì)于高頻常用的多字段同時(shí)輸出,還提供字段組合選項(xiàng),如 --cpu、--mem。大 O 選項(xiàng)用于在既有字段組合輸出基礎(chǔ)上,追加輸出字段指標(biāo)。因此,大 O 選項(xiàng)可與 --cpu ?--mem 等同時(shí)使用,而小 o 選項(xiàng)和大 O 選項(xiàng)及其他字段組合互斥。
5)左尖括號(hào) < 表示7點(diǎn)02分sleep.sh進(jìn)程還沒啟動(dòng),右尖括號(hào) > 表示7點(diǎn)22分進(jìn)程已結(jié)束。此功能可以協(xié)助判斷一個(gè)特定進(jìn)程的開始和結(jié)束時(shí)間范圍。
下面通過(guò)一個(gè)簡(jiǎn)單的例子,來(lái)說(shuō)明下如何通過(guò) ssar 進(jìn)程級(jí)指標(biāo)診斷線程數(shù)打滿問(wèn)題。Linux 內(nèi)核有個(gè)參數(shù) kernel.pid_max = 131072,這個(gè)參數(shù)會(huì)設(shè)置機(jī)器的總線程數(shù)上限。
1)一臺(tái)機(jī)器在非工作時(shí)段發(fā)生了異常進(jìn)程創(chuàng)建大量線程將線程數(shù)打爆的情況。凌晨3點(diǎn)整,整機(jī)線程數(shù)飆升到了131.1K,且持續(xù)時(shí)間極短,3點(diǎn)1分已經(jīng)恢復(fù)。
2)傳統(tǒng)條件下,這種場(chǎng)景的發(fā)生根本來(lái)不及等待人工登錄上去抓取現(xiàn)場(chǎng)信息。如今有了ssar工具對(duì)歷史信息的自動(dòng)采集,我們可以等到工作時(shí)間,使用ssar的多進(jìn)程子命令輕松獲取進(jìn)程級(jí)原因。NLWP(Number of light weight process)表示一個(gè)進(jìn)程的線程數(shù),使用-k選項(xiàng)數(shù)按 nlwp 字段排序可以發(fā)現(xiàn)是 pid 為 1045 的 Java 進(jìn)程引起線程數(shù)打滿。
3)不放心的同學(xué),還可以使用 awk 將這個(gè)問(wèn)題時(shí)刻2021-03-30T03:00:00的所有線程數(shù)相加,和為 131024,印證了確實(shí)等同于當(dāng)時(shí)機(jī)器總線程數(shù)plit值131.1K。
六、ssar工具load指標(biāo)使用介紹
傳統(tǒng)的系統(tǒng)性能監(jiān)控工具中的 load1 指標(biāo)盡管比 load5 和 load15 指標(biāo)更精準(zhǔn),仍然不能滿足排查問(wèn)題時(shí)對(duì)時(shí)間范圍的精準(zhǔn)度的要求。ssar 在國(guó)內(nèi)外全行業(yè)獨(dú)創(chuàng)了 load5s 指標(biāo),該指標(biāo)可以讓我們將 load 的準(zhǔn)確性提升到 5 秒級(jí)的精度。load5s 指標(biāo)的準(zhǔn)確性絕不僅體現(xiàn)在采集頻率上,簡(jiǎn)單說(shuō) load5s 指標(biāo)就是 R+D 的線程數(shù),也是內(nèi)核數(shù)據(jù)結(jié)構(gòu)中的全局變量 active 值。為了準(zhǔn)確理解 linux load 和 load5s 指標(biāo),執(zhí)行如下實(shí)驗(yàn)操作:
找一臺(tái)實(shí)驗(yàn)機(jī)器,先編譯一個(gè)可以模擬 D 狀態(tài)線程的程序 uninterruptible。然后用 stress 命令啟動(dòng) 100 個(gè)進(jìn)程執(zhí)行 30 秒后退出。大約再等 20 秒左右再批量循環(huán)啟動(dòng) 1000 個(gè) uninterruptible 進(jìn)程。執(zhí)行結(jié)束后,效果如下圖所示。
1)綠色時(shí)間區(qū)域,5 分 52 秒時(shí) load5s 和 load1 都處于一個(gè)低水位,毫無(wú)疑問(wèn)說(shuō)明當(dāng)時(shí)機(jī)器負(fù)載壓力很低。
2)第一個(gè)紅色時(shí)間區(qū)域,伴隨著stress命令開始執(zhí)行,load5s 和 load1 都同時(shí)升高,6分07秒時(shí)刻,load5s 值已經(jīng)達(dá)到78,load1 開始升高到 6.27,但是這個(gè) load1 的值遠(yuǎn)遠(yuǎn)不能體現(xiàn)出當(dāng)前機(jī)器上并發(fā)運(yùn)行的線程的狀況。隨著時(shí)間的推移,6分32秒這個(gè)時(shí)刻,load1的值緩慢升到了39.22。
3)第一個(gè)藍(lán)色時(shí)間區(qū)域,伴隨著stress命令進(jìn)程退出,load5s已經(jīng)迅速跌回到一個(gè)低水位,6分37秒這個(gè)時(shí)刻的 load5s 值也同時(shí)迅速降低到了很低的值0,機(jī)器的R+D狀態(tài)線程已經(jīng)幾乎沒有了,系統(tǒng)完全沒有任何壓力。但此時(shí)load1還保持在36.08的高值。明顯可以看出傳統(tǒng)的 load1 指標(biāo)在系統(tǒng)負(fù)載壓力消失后,還一定的滯后性。
在后面2個(gè)紅色區(qū)域和2個(gè)藍(lán)色區(qū)域,也可以觀察到同樣的現(xiàn)象。共同的規(guī)律是紅色區(qū)域開始時(shí)刻,代表R+D狀態(tài)線程數(shù)的load5s值明顯很高,但相同時(shí)刻的load1卻還較低。藍(lán)色區(qū)域開始時(shí)刻,代表R+D狀態(tài)線程數(shù)的load5s值已經(jīng)為0,但相同時(shí)刻load1卻還較高。
上面這個(gè)實(shí)驗(yàn)充分說(shuō)明 load5s 才是更能準(zhǔn)確反映系統(tǒng)負(fù)載壓力的指標(biāo),而單純用 load1 值判斷機(jī)器的負(fù)載是不準(zhǔn)確的。所以我們需要用 load5s 指標(biāo)替代 load1 指標(biāo)來(lái)精準(zhǔn)判斷機(jī)器負(fù)載發(fā)生的時(shí)間范圍。這里強(qiáng)調(diào)一下,load5s指標(biāo)完全在用戶態(tài)通過(guò)工程化的方法巧妙獲取,沒有對(duì)內(nèi)核模塊的任何依賴。
除 load5s 指標(biāo)外,上面的解決方案中,還提供了一組指標(biāo)用于全面的評(píng)估系統(tǒng)負(fù)載情況。其中 load5s 是 R+D 狀態(tài)的線程數(shù)之和,runq是當(dāng)時(shí)的R狀態(tài)線程數(shù),threads是所有狀態(tài)線程數(shù)總和,因此 threads 值是 load5s 值的天花板,threads 最大值受內(nèi)核參數(shù)設(shè)置限制。
ssar 工具還會(huì)根據(jù) load5s 和 CPU 核數(shù)之比的大小,來(lái)觸發(fā)對(duì) load 詳情的采集,前邊的 actr 是采集到的并發(fā)R狀態(tài)線程數(shù),actd 是采集到的并發(fā) D 狀態(tài)線程數(shù),act 是 actr 和 actd 數(shù)之和。當(dāng)我們需要了解load構(gòu)成的詳細(xì)因素時(shí),可以借助load2p子命令進(jìn)一步顯示actr和actd的詳情信息。
未觸發(fā) load 詳情采集的采集時(shí)刻,act 值不存在,顯示為短橫線-。可以用-z選項(xiàng)過(guò)濾出 load5s 子命令輸出結(jié)果中act存在值的時(shí)刻,即 ssar load5s -z。
然后再用 load2p 子命令顯示更加詳細(xì)的load詳情信息,選項(xiàng)-c 指定需要顯示的load詳情的時(shí)刻值。load2p子命令一共可輸出6個(gè)視圖的信息,loadrd、stack、loadr、loadd、psr和stackinfo。
1)loadrd視圖顯示指定時(shí)刻所有R和D狀態(tài)的線程信息,每個(gè)線程包括線程狀態(tài)、線程ID、進(jìn)程ID、CPU核號(hào)、線程調(diào)度優(yōu)先級(jí)和命令名稱。ssar 只采集 R 和 D 狀態(tài)的線程信息。
2)stack視圖顯示抽樣后的D狀態(tài)調(diào)用棧,最多抽樣100個(gè)。每個(gè)D狀態(tài)線程調(diào)用棧包含線程ID、進(jìn)程ID、進(jìn)程名稱、棧頂函數(shù)位置、棧頂函數(shù)名和完整的調(diào)用棧。
3)基于以上2個(gè)視圖的信息,load2p子命令又聚合了4個(gè)視圖信息,并且默認(rèn)只顯示這4個(gè)聚合視圖 loadr、loadd、psr 和stackinfo。Loadr 視圖按 pid 聚合 R 狀態(tài)線程信息,適合診斷 loadR 高時(shí)的進(jìn)程級(jí)因素。
4)loadd視圖按pid聚合D狀態(tài)線程信息,適合診斷l(xiāng)oadD高時(shí)的進(jìn)程級(jí)因素。
5)psr視圖按CPU核號(hào)psr聚合,適合診斷綁核不均的情況。
6)stackinfo視圖按調(diào)用棧聚合,對(duì)loadD高時(shí),診斷D狀態(tài)線程發(fā)生的原因特別有用。
七、ssar工具配置文件說(shuō)明
ssar工具的主配置文件是/etc/ssar/ssar.conf,其中分為[main]、[load]和[proc]三部分。
1)[main]部分配置選項(xiàng)主要用于設(shè)置ssar工具整體的一些選項(xiàng)內(nèi)容,[load]和[proc]分別對(duì)應(yīng)load信息采集和進(jìn)程信息采集部分的選項(xiàng),整機(jī)信息的配置選項(xiàng)在前文介紹的/etc/ssar/sys.conf文件中獨(dú)立設(shè)置。
2)duration_threshold選項(xiàng)設(shè)置最多保留168小時(shí)。inode_use_threshold、 disk_use_threshold和disk_available_threshold這3個(gè)選項(xiàng)任意一個(gè)條件不滿足時(shí),則停止數(shù)據(jù)采集,并且開始從時(shí)間最老的數(shù)據(jù)到最新的逐步刪除數(shù)據(jù),以試圖使剛才不成立的條件成立,一直刪除到只剩最新的一個(gè)小時(shí)數(shù)據(jù)目錄為止。ssar工具的這種磁盤空間處理邏輯可以說(shuō)不占用額外的磁盤空間。
3) load5s_flag、 proc_flag和sys_flag分別控制采集器三部分?jǐn)?shù)據(jù)的采集,嵌入式系統(tǒng)中可以同時(shí)關(guān)閉load5s_flag和proc_flag后再配置sys.conf,從而做到只采集自己關(guān)注的數(shù)據(jù)源。
4) scatter_second選項(xiàng)用于在大規(guī)模集群中,使各個(gè)主機(jī)的采集時(shí)間分散化。
5) load5s_threshold設(shè)置load詳情采集觸發(fā)閾值,不同角色的服務(wù)器此閾值需要根據(jù)各自特點(diǎn)個(gè)性化設(shè)置。
八、ssar工具CPU使用率綜合分析
Linux top命令中有2處%Cpu,一處是在頭部,另外是在每個(gè)進(jìn)程信息中。關(guān)于兩者之間的關(guān)系,我們借助ssar工具的使用簡(jiǎn)單介紹一下。
為了準(zhǔn)確理解linux CPU Usage指標(biāo),在一臺(tái)4核機(jī)器上執(zhí)行如下實(shí)驗(yàn)。A終端執(zhí)行命令 ? stress -t 120 -c 3,執(zhí)行時(shí)間為23時(shí)23分20秒,120秒后會(huì)結(jié)束。B終端同時(shí)執(zhí)行top命令,如圖所示。
理解 CPU Usage 指標(biāo):
1)在A終端上,等待stress執(zhí)行結(jié)束2分鐘后,執(zhí)行tsar2命令。23時(shí)25分的user值為75.60,它的含義表示23時(shí)24分到23時(shí)25分這60秒內(nèi)的平均user CPU使用為75.60%。這里看出tsar2的user值等同于top命令的us值75.2,區(qū)別就是tsar2的是60秒平均值,top的是運(yùn)行時(shí)刻的之前3秒的平均值,但因?yàn)槿齻€(gè)stress命令運(yùn)行平穩(wěn),top的3秒平均值也基本代表60秒的均值。
2)在A終端上繼續(xù)執(zhí)行ssar命令,23時(shí)25分的user/s值為301.35。ssar的cpu值是取自/proc/stat,單位是內(nèi)核tick數(shù)。x86_64系統(tǒng)每秒100個(gè)tick,即100HZ。4顆CPU總數(shù)就是每秒400個(gè)tick, 23:25時(shí)間的user值是301.35,它的含義表示23時(shí)24分到23時(shí)25分這60秒內(nèi)的平均每秒user CPU使用量為301.35 tick數(shù)。
3)我們可以查看tsar2的python源碼,能夠了解到tsar2的user值是ssar的user值占ssar所有CPU使用量之和的百分比。
4)在A終端上繼續(xù)執(zhí)行ssar procs子命令。23時(shí)25分的三個(gè)stress進(jìn)程的pucpu值都為100.0。這里的每一個(gè)100.0的含義是這個(gè)進(jìn)程在23時(shí)24分到23時(shí)25分這60秒內(nèi)的進(jìn)程的平均用戶空間CPU使用率為100.0。計(jì)算過(guò)程是用進(jìn)程的cpu時(shí)間片除以自然時(shí)長(zhǎng),再乘以100,即百分比的100。這個(gè)算法和top命令下半部分的進(jìn)程級(jí)別的%CPU一致。
5)這里我們可以看到這樣的數(shù)據(jù)關(guān)系301.25 ≈ 100 + 100 + 100 + 3.3,只不過(guò)整機(jī)user CPU值301.35是自然時(shí)間乘以了100HZ,進(jìn)程級(jí)CPU是乘以了百分比的100。使用ssar --cpu和ssar procs --cpu兩個(gè)命令,已經(jīng)可以將整機(jī)總體的CPU使用情況和進(jìn)程級(jí)別CPU使用情況的關(guān)聯(lián)起來(lái)。
6)最后top命令中的us值和進(jìn)程信息中的%CPU的關(guān)系也就自然建立起來(lái)了。一點(diǎn)不同就是top中是將整體CPU使用情況進(jìn)一步計(jì)算了一次百分占比。
九、ssar工具內(nèi)存回收案例
在 load 高的各種場(chǎng)景中,有一種R狀態(tài)線程數(shù)并發(fā)多的load高是由于sys CPU使用率偏高引起的。ssar 全面的指標(biāo)體系,從多個(gè)角度將這種場(chǎng)景發(fā)生過(guò)程進(jìn)行了透徹的呈現(xiàn)。為了準(zhǔn)確的說(shuō)明問(wèn)題,有必要回顧下內(nèi)核內(nèi)存回收的相關(guān)概念。如圖所示,當(dāng)整機(jī)free內(nèi)存低于黃線low閾值時(shí),內(nèi)核的異步內(nèi)存回收線程kswapd開始被喚醒,kswapd會(huì)在其他進(jìn)程申請(qǐng)內(nèi)存的同時(shí)回收內(nèi)存。當(dāng)整機(jī)free內(nèi)存觸達(dá)紅線min閾值時(shí),觸發(fā)整機(jī)直接內(nèi)存回收,所有來(lái)自用戶空間的內(nèi)存申請(qǐng)將被阻塞住,線程狀態(tài)同時(shí)轉(zhuǎn)換為D狀態(tài)。此時(shí)只有來(lái)自內(nèi)核空間的內(nèi)存申請(qǐng)可以繼續(xù)使用min值以下的free內(nèi)存。后續(xù)當(dāng)整機(jī)free內(nèi)存逐步恢復(fù)到綠線high閾值以上后,kswapd線程停止內(nèi)存回收工作。
下面以ssar的數(shù)據(jù)指標(biāo)為依據(jù),一步一步的展示了當(dāng)整機(jī)內(nèi)存緊張后是如何引起sys CPU高,并進(jìn)而引發(fā)load高的完整過(guò)程:
1)用戶空間java進(jìn)程在20點(diǎn)43分到20點(diǎn)45分2分鐘內(nèi)大量申請(qǐng)24GB內(nèi)存;
2)整機(jī)內(nèi)存used在20點(diǎn)43分到20點(diǎn)45分2分鐘內(nèi)迅速增長(zhǎng)了26GB,同時(shí)整機(jī)free內(nèi)存迅速減少了14GB;
3)free內(nèi)存在20點(diǎn)45分時(shí)只有3GB,低于low閾值,pgscan_kswapd/s值非0表明觸發(fā)kswapd異步內(nèi)存回收。
4)kswapd異步內(nèi)存回收跟不上進(jìn)程內(nèi)存申請(qǐng)的速度,當(dāng)free內(nèi)存低至min閾值時(shí),pgscan_direct/s值非0表明觸發(fā)直接內(nèi)存回收,用戶空間內(nèi)存申請(qǐng)進(jìn)程開始D住。棧頂函數(shù)sleep_one_page和congestion_wait等都表明發(fā)生了直接內(nèi)存回收。
5)20點(diǎn)44分到20點(diǎn)45分出現(xiàn)大量網(wǎng)絡(luò)吞吐,每秒進(jìn)出流量分別達(dá)到1.5G和1.0G。網(wǎng)絡(luò)流量吞吐會(huì)伴有內(nèi)核空間內(nèi)存申請(qǐng),繼續(xù)消耗min閾值以下(橙色部分)free內(nèi)存。
6)內(nèi)核網(wǎng)絡(luò)模塊會(huì)申請(qǐng)order3階內(nèi)存,20點(diǎn)45分時(shí)刻buddyinfo中order3以上高階內(nèi)存消耗殆盡,剩余的3GB free內(nèi)存處于碎片化狀態(tài)。內(nèi)核空間申請(qǐng)的內(nèi)存是連續(xù)內(nèi)存,雖然order2和order1有庫(kù)存,但申請(qǐng)order3時(shí)是無(wú)法被分配的,內(nèi)核只能處于忙等狀態(tài)。
7)觸發(fā)內(nèi)核態(tài)忙等,同時(shí)會(huì)引發(fā)20點(diǎn)44分到20點(diǎn)45分的sys CPU升高,sys CPU平均每秒占總CPU資源的89.61%,擠占用戶空間既有進(jìn)程CPU資源,同期用戶態(tài)CPU使用從原來(lái)的72.59%降低到7.73%。
8)觸發(fā)直接內(nèi)存回收時(shí),會(huì)引發(fā)大量D狀態(tài)線程,后續(xù)order3庫(kù)存枯竭引發(fā)sys CPU高后,會(huì)繼續(xù)引發(fā)大量R狀態(tài)線程。load5s子命令看到的現(xiàn)象就是先出現(xiàn)load5s指標(biāo)升高,再出現(xiàn)load5s和runq同時(shí)升高。
內(nèi)存回收是生產(chǎn)環(huán)境較常見的一個(gè)情況。除以上場(chǎng)景外,生產(chǎn)中還會(huì)發(fā)生其他場(chǎng)景的內(nèi)存回收,數(shù)據(jù)指標(biāo)的表現(xiàn)上也有差異。還需要借助其他性能分析工具,結(jié)合內(nèi)核代碼進(jìn)一步分析。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的直播回顾:准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核?| 龙蜥技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何构建一个流量无损的在线应用架构 |
- 下一篇: 阿里云成为首个通过“虚拟化云平台性能测试