Container及其內(nèi)部進(jìn)程監(jiān)控剖析

      網(wǎng)友投稿 932 2022-05-28

      目前市場上的虛擬化技術(shù)種類很多,例如moby(docker)、LXC、RKT等等。在帶來方便應(yīng)用部署和資源充分利用的好處的同時(shí),如何監(jiān)控相應(yīng)Container及其內(nèi)部應(yīng)用進(jìn)程成為運(yùn)維人員不可避免遇到的新情況。UAV.Container從虛擬化技術(shù)的基礎(chǔ)原理和Linux操作系統(tǒng)的內(nèi)核特性出發(fā),得到Container容器和內(nèi)部進(jìn)程的各維度監(jiān)控?cái)?shù)據(jù),使無論是虛擬機(jī)或物理機(jī)運(yùn)維人員,還是業(yè)務(wù)運(yùn)維人員角度,都能得到合適的監(jiān)控維度。

      虛擬化技術(shù)從基礎(chǔ)原理上主要是cgroups、namespace和file system的應(yīng)用,而操作系統(tǒng)作為cgroup和namespace根節(jié)點(diǎn),無論在container里啟動(dòng)何種應(yīng)用,從內(nèi)核角度上來說,肯定在操作系統(tǒng)有其一定的特征和表現(xiàn)形式。我們需要做的就是對這些特征做加工處理,以得到相應(yīng)的監(jiān)控?cái)?shù)據(jù)。

      下面我們以docker技術(shù)舉例,其他虛擬化技術(shù)類似。

      一、Container ID

      Container ID是一個(gè)Container的唯一標(biāo)識。從容器監(jiān)控的角度我們需要能得到該進(jìn)程在哪個(gè)Container里運(yùn)行。在操作系統(tǒng)層面,進(jìn)程的cgroup的掛載情況就能有所體現(xiàn)。如圖所示,我們在一個(gè)ID為3411554ff684的Container內(nèi)部跑一個(gè)Tomcat進(jìn)程。

      由于Container的pid namespace是操作系統(tǒng)的pid namespace的子namespace,那么該進(jìn)程在操作系統(tǒng)級也應(yīng)該有相應(yīng)的pid,用docker top命令驗(yàn)證一下:

      該容器內(nèi)進(jìn)程在宿主機(jī)上的進(jìn)程號為1848。接下來進(jìn)入/proc/1848/cgroup下看看該進(jìn)程的cgroup掛載情況

      從cgroup文件里清楚的顯示了實(shí)現(xiàn)了該容器的虛擬化技術(shù)、Container ID和此container的資源掛載路徑,對比一下這里面顯示的Container ID,和創(chuàng)建Container時(shí)的ID完全相同。這也驗(yàn)證了通過掃描宿主機(jī)進(jìn)程的cgroup信息可以獲得Container ID。這樣就將pid和Container ID做了關(guān)聯(lián)。

      二、CPU

      雖然cgroup管控了該cgroup下所有進(jìn)程的CPU使用情況,但從操作系統(tǒng)的角度上,不論進(jìn)程是否隸屬于某個(gè)子cgroup下,仍然是共用宿主機(jī)的CPU。所以監(jiān)控宿主機(jī)上該進(jìn)程的CPU就能得到進(jìn)程的CPU監(jiān)控指標(biāo)。

      Linux上常用的CPU監(jiān)控命令是top。top對CPU監(jiān)控的原理是在time1時(shí)刻獲取CPU從啟動(dòng)時(shí)的累計(jì)總時(shí)間countAll1和busy總時(shí)間countBusy1,再到time2時(shí)刻獲取CPU總時(shí)間countAll2和busy總時(shí)間countBusy2,最后用busy的時(shí)間差值減去總時(shí)間的差值得到了在time1到time2這個(gè)時(shí)間段內(nèi)機(jī)器CPU的占用情況。也就是:

      CPU占用率(%) = (countBusy2 - countBusy1)/(countAll2 - countAll1) * 100

      進(jìn)程同理,在兩個(gè)時(shí)刻分別得到每個(gè)進(jìn)程的busy總時(shí)間countProcBusy1和countProcBusy2,則得到進(jìn)程CPU占用率:

      進(jìn)程CPU占用率(%) = (countProcBusy2 - countProcBusy1)/(countProcAll2 - countProcAll1)*100

      宿主機(jī)從啟動(dòng)開始的CPU總時(shí)間片可以從/proc/stat下獲取:

      第一行是總的CPU使用情況,具體參數(shù)的意思:

      所以,選擇當(dāng)前為time1,3秒后為time2,countAll = user + nice + system + idle + iowait + irq + softirq + stealstolean + guest + guest_nice。countBusy為countAll減去idle的值,這樣上面第一個(gè)公式的所有需要的值就齊了,可以直接計(jì)算。

      第二行、第三行是每個(gè)邏輯CPU的使用情況,這里記下有兩個(gè)邏輯CPU,CPU的邏輯核數(shù)與CPU顯示模式irix和solaris有關(guān)。

      接下來是countProcBusy的計(jì)算,進(jìn)程的CPU時(shí)間片位于/proc/$pid/stat下,如圖所示:

      這個(gè)文件里面體現(xiàn)了很多進(jìn)程的相關(guān)信息。其中第14、15、16、17個(gè)參數(shù)與CPU有關(guān)。

      所以,countProcBusy = utime + stime + cutime + cstime,該值包括其所有線程的cpu時(shí)間。而countProcAll2-countProcAll1=3s,通過兩個(gè)時(shí)刻的countProcBusy和countProcAll,進(jìn)程CPU的占用率就能得到了。

      其中需要注意的問題有兩點(diǎn):

      1) jiffies實(shí)際上指的是內(nèi)核時(shí)鐘使用的節(jié)拍總數(shù),所以這里的jiffies需要換算成秒才能應(yīng)用上面的除法公式。

      2) 剛剛我們談到CPU顯示模式irix和solaris,簡單來說irix模式就是機(jī)器有N個(gè)邏輯CPU,CPU顯示上限就是N100%,solaris模式就是不管機(jī)器有多少邏輯CPU,CPU顯示上限就是100%,而/proc/$pid/stat顯示的是計(jì)算了所有邏輯CPU時(shí)間的,所以兩種顯示方式意味著計(jì)算方法稍有差異,solaris模式的結(jié)果需要在上面進(jìn)程CPU占用率公式基礎(chǔ)之上除以邏輯核數(shù)。

      三、內(nèi)存

      進(jìn)程內(nèi)存的監(jiān)控有兩個(gè)維度的數(shù)據(jù):一是物理占用內(nèi)存大小,二是進(jìn)程內(nèi)存占用百分比的大小。

      進(jìn)程內(nèi)存占用率(%) = 進(jìn)程物理內(nèi)存占用大小 / 宿主機(jī)總內(nèi)存大小 * 100

      與CPU類似,/proc/$pid/status文件記錄了進(jìn)程物理內(nèi)存使用情況,其中VmRSS即為該進(jìn)程目前所占實(shí)際物理內(nèi)存的大小。

      /proc/meminfo文件下記錄了機(jī)器內(nèi)存占用情況,這個(gè)文件很長,截取其中的一部分展示一下,MemTotal就是宿主機(jī)總內(nèi)存大小:

      這樣,這個(gè)進(jìn)程的物理內(nèi)存占用和機(jī)器總內(nèi)存就都得到了,相應(yīng)的進(jìn)程內(nèi)存的占用率也就得到了。

      四、磁盤IO

      磁盤IO獲取也很簡單,/proc/$pid/io已經(jīng)幫我們把這個(gè)進(jìn)程的io情況記錄下來了,但是與CPU類似,io文件里存的也是該進(jìn)程從啟動(dòng)到現(xiàn)在的io總量,那么:

      磁盤I/O(bytes/秒) = (time2時(shí)刻I/O – time1時(shí)刻I/O) / (time2 – time1)

      其中的read_bytes和write_bytes分別為該進(jìn)程從啟動(dòng)到目前為止的讀取字節(jié)數(shù)和寫入字節(jié)數(shù),分別取2個(gè)時(shí)刻的值,根據(jù)上面的公式,就得到了該進(jìn)程的磁盤IO。

      五、端口號和連接數(shù)

      由于Network Namespace對網(wǎng)絡(luò)做了隔離,所以如果進(jìn)程在Container內(nèi)部運(yùn)行,該進(jìn)程的端口信息也應(yīng)該是進(jìn)程本身監(jiān)聽的端口號,而不是真正實(shí)際對外的端口,而Container內(nèi)外端口的映射機(jī)制是由應(yīng)用的虛擬化技術(shù)本身控制的,這就避免不了與實(shí)現(xiàn)容器的虛擬化技術(shù)打交道了,那么問題就轉(zhuǎn)化成獲取容器內(nèi)進(jìn)程本身監(jiān)聽的端口了。

      /proc/$pid/net/tcp(tcp6,udp,udp6)就對端口號和連接數(shù)做了相應(yīng)的歷史記錄。這些文件格式都類似,以tcp6舉例

      解釋幾個(gè)關(guān)鍵的key:

      因?yàn)閟t = 0A代表listen,所以從其中挑選出st = 0A的數(shù)據(jù),取出對應(yīng)的inode號,這里這個(gè)inode號是socket號,則問題轉(zhuǎn)換為了這個(gè)進(jìn)程是否還存在這個(gè)socket號代表的socket。在/proc/$pid/fd下有該進(jìn)程所有的fd(file descriptor),截取一段舉個(gè)例子。

      每個(gè)文件描述符后面的軟鏈實(shí)際上就是打開的文件,以socket開頭的就是這個(gè)進(jìn)程打開的socket,在中括號中間的部分就是socket號。拿著這個(gè)socket號和上面tcp6里獲得的inode號做一個(gè)匹配,如果對應(yīng)上,那么tcp6里的st = 0A的端口就是這個(gè)進(jìn)程監(jiān)聽的。至于容器內(nèi)外端口的映射,這就需要根據(jù)應(yīng)用的虛擬化技術(shù)的映射方法來獲取了。連接數(shù)計(jì)算與端口掃描是同理的,區(qū)別只在于需要對st = 01(establish)進(jìn)行掃描計(jì)數(shù)累加。

      六、總結(jié)

      上面的方法將容器內(nèi)所有進(jìn)程的CPU、內(nèi)存、磁盤IO、端口號和連接數(shù)都拿到了。根據(jù)Container ID就可以對不同的Container的對應(yīng)數(shù)據(jù)做加和,就獲得了Container級的監(jiān)控?cái)?shù)據(jù)。

      在容器內(nèi)的進(jìn)程是通過在操作系統(tǒng)級別反映出的pid和Container ID的對應(yīng)關(guān)系來關(guān)聯(lián)的。這樣就可以通過讀取/proc下的文件來獲取監(jiān)控?cái)?shù)據(jù)。

      參考文檔:

      http://elixir.free-electrons.com/linux/v3.10/ident

      Container及其內(nèi)部進(jìn)程監(jiān)控剖析

      本文轉(zhuǎn)載自異步社區(qū)。

      軟件開發(fā) Web應(yīng)用防火墻 WAF

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:云計(jì)算-構(gòu)建Ceph集群分布式存儲部署
      下一篇:分布式RPC框架Dubbo實(shí)現(xiàn)服務(wù)治理實(shí)現(xiàn)示例:集成Kryo實(shí)現(xiàn)高速序列化,集成Hystrix實(shí)現(xiàn)熔斷器
      相關(guān)文章
      在线观看国产一区亚洲bd| 亚洲精品第一综合99久久| 亚洲欧美自偷自拍另类视| 亚洲国产成人va在线观看网址| 亚洲欧洲日产国码www| 久久亚洲精品成人AV| 久久久久亚洲av无码专区| 亚洲成人免费在线| 亚洲视频一区在线| 亚洲国产成人精品无码区在线秒播 | 亚洲黄色在线电影| 亚洲日韩中文字幕| 亚洲国产日韩精品| 亚洲欧美日韩中文字幕一区二区三区| 亚洲国产日韩精品| 国产成人精品日本亚洲语音| 国产成人综合亚洲| 国外亚洲成AV人片在线观看| 亚洲精品乱码久久久久久自慰| 亚洲春色在线视频| 亚洲精品美女在线观看播放| 亚洲第一区视频在线观看| 国产成人精品日本亚洲18图| 亚洲色偷偷综合亚洲av78| 日韩在线视精品在亚洲| 中文字幕亚洲一区二区三区| 亚洲精品无码mv在线观看网站| 亚洲国产AV无码专区亚洲AV| 亚洲天堂中文资源| 亚洲另类古典武侠| 亚洲精品无码mⅴ在线观看| 亚洲福利精品一区二区三区| 国产亚洲av人片在线观看| 亚洲AV无码乱码国产麻豆穿越| 久久精品国产亚洲AV无码偷窥| 亚洲欧洲中文日产| 亚洲AV永久无码精品一福利| 亚洲午夜福利精品久久| 久久青青草原亚洲AV无码麻豆 | 久久亚洲春色中文字幕久久久 | 亚洲一区二区三区无码中文字幕 |