Docker 監控的一點想法

目前項目內部署了docker,因而涉及到關於監控的事情,參考一些經典實例以及一些本身的想法,總結一下思路。node

一、關於監控的內容

監控宿主機自己

監控宿主機自己仍是比較簡單的,同其餘服務器監控相似,對cpu、network、io、disk等作通用的檢查,這裏再也不細說。python

額外的,由於是docker的宿主機,還應該監控 容器自己的一些指標,如 :linux

  • 擁有的所有的容器數量;
  • 正在運行的容器的數量;
  • dead容器的數量(若是此數量變化應該報警);
  • docker 自己的信息,如Storage Driver、Data Space Used、Data Space Total、Metadata Space Total、Metadata Space Used、client version、client api version、server version、servier api version 等;

監控容器

docker容器經過namespace作資源隔離,經過cgroup來作資源限制。監控方便,只能經過在宿主機自己查看對應容器的cgroup stats。git

具體大項有:github

  1. 容器的自己信息,如名稱,ip、使用的鏡像、啓動時間、啓動命令等;
  2. 容器的狀態,如可先監控兩個量值,running or not running (當狀態變化時報警);
  3. 容器使用cpu的資源信息;
  4. 容器使用memory的資源信息;
  5. 容器的network io信息;
  6. 容器的disk信息;

二、關於監控項的獲取

宿主機自己

宿主機的通常信息獲取 見zabbix監控項,不重複。web

  1. 擁有的所有容器的數量:docker

    docker ps -a -q | wc -l
  2. 正在運行的容器的數量:shell

    docker ps  -q | wc -l
  3. 非運行狀態的容器的數量:json

    docker ps -a  | grep -v 'Up '  | grep -v 'CONTAINER' | wc -l
  4. docker自己信息,可從命令 docker version & docker info中獲取api

監控容器

一、容器自己信息 & 狀態:

從docker inspect 中獲取,簡單腳本以下:

#!/usr/bin/env python
import commands
import sys
import types
import json
def get_container_info( container ):
msg = commands.getoutput('docker inspect '+container)
#return msg
data = json.loads( msg )
return data[0]
container = sys.argv[1]
msg = get_container_info( container )
containerid = msg["Id"]
image = msg['Image']
name = msg['Name']
ip = msg['NetworkSettings']['IPAddress']
status = msg['State']['Running']
startedat = msg['State']['StartedAt']
print containerid, image, name, ip, status, startedat

二、 容器使用cpu狀況:

從cpuacct中獲取相應的值,首先要獲取一個cpu週期的時間值,getconf CLK_TCK,默認爲100,即100Hz,一個週期即爲 1/100s = 10ms = 10^7 ns;

能夠獲取cpuacct.usage、 cpuacct.stat ,可是具體怎麼作對比,還得觀察。

理論上的計算方法爲,在單位時間內,docker 容器對應的cpu使用的變化值 除以 總系統cpu時間的變化值 乘以 100%;其中,docker容器對應的cpu值能夠從cgroup.cpuacct中的cpuacct.usage值獲得,他的單位是納秒,10^9個納秒爲1秒;系統的cpu總時間能夠從/proc/stat中獲取,第一行中。以「cpu 」開頭那行,數值累加就是當前系統cpu總時間,須要注意的是,他的數值單位爲 「cpu週期」,就是剛纔獲取到的 1/CLK_TCK ,關於/proc/stat 的說明文檔:http://www.linuxhowtos.org/System/procstat.htm

從docker源碼中獲知,docker的stats計算方法和這個有點出入,它在此計算的基礎上,又乘以 cpu核數 獲得最終結果,這個讓我有點不理解,和官方確認中。。。。。
已經和官方確認,只是雙方對「cpu利用率如何定義」的問題,我認爲應該是平均利用率,官方認爲應該是total cpu 利用率,好吧。。。。。 地址爲: #issues 13626
相關源碼地址爲:https://github.com/docker/docker/blob/0d445685b8d628a938790e50517f3fb9...

如下是用shell完成的模擬docker計算cpu利用率方法的小腳本:

#!/bin/sh
##echo user nice system idle iowait irq softirq
CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
CGROUP_USAGE_1=$(cat /cgroup/cpuacct/docker/55dec85d2e93c487fbeb1e85c9677e64dd1b4bdcc5be0e5f2539e52c87641d4e/cpuacct.usage)
sleep 1
CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
CGROUP_USAGE_2=$(cat /cgroup/cpuacct/docker/55dec85d2e93c487fbeb1e85c9677e64dd1b4bdcc5be0e5f2539e52c87641d4e/cpuacct.usage)
CGROUP_USAGE=`expr $CGROUP_USAGE_2 - $CGROUP_USAGE_1`
Total=`expr $Total_2 - $Total_1`
CGROUP_RATE=`expr $CGROUP_USAGE*24/$Total/10000000*100|bc -l`
echo $CGROUP_USAGE_1 , $CGROUP_USAGE_2 , $CGROUP_USAGE , $Total,  $CGROUP_RATE

三、 容器使用memory狀況:

從容器所在cgroup組中查看memory.stats信息,具體值 的信息以下

統計  描述
cache   頁緩存,包括 tmpfs(shmem),單位爲字節
Rss 匿名和 swap 緩存,不包括 tmpfs(shmem),單位爲字節
Mapped_file memory-mapped 映射的文件大小,包括 tmpfs(shmem),單位爲字節
pgpgin  存入內存中的頁數
pgpgout 從內存中讀出的頁數
swap    swap 用量,單位爲字節
Active_anon 在活躍的最近最少使用(least-recently-used,LRU)列表中的匿名和 swap 緩存,包括 tmpfs(shmem),單位爲字節
Inactive_anon   不活躍的 LRU 列表中的匿名和 swap 緩存,包括tmpfs(shmem),單位爲字節
Active_file 活躍 LRU 列表中的 file-backed 內存,以字節爲單位
Inactive_file   不活躍 LRU 列表中的 file-backed 內存,以字節爲單位
unevictable 沒法再生的內存,以字節爲單位
hierarchical_memory_limit(重點)   包含 memory cgroup 的層級的內存限制,單位爲字節
hierarchical_memsw_limit    包含 memory cgroup 的層級的內存加 swap 限制,單位爲字節

四、容器網絡io狀況: 能夠執行命令: docker exec ifconfig eth0 看 Rx和Tx的值。

五、磁盤io狀況 從blkio 中獲取,相關參考:

  1. blkio.time:統計cgroup對設備的訪問時間,按格式device_types:node_numbers milliseconds讀取信息便可,如下相似。
  2. blkio.io_serviced:統計cgroup對特定設備的IO操做(包括read、write、sync及async)次數,格式device_types:node_numbers operation number
  3. blkio.sectors:統計cgroup對設備扇區訪問次數,格式device_types:node_numbers sector_count
  4. blkio.io_service_bytes:統計cgroup對特定設備IO操做(包括read、write、sync及async)的數據量,格式device_types:node_numbers operation bytes
  5. blkio.io_queued:統計cgroup的隊列中對IO操做(包括read、write、sync及async)的請求次數,格式number operation
  6. blkio.io_service_time:統計cgroup對特定設備的IO操做(包括read、write、sync及async)時間(單位爲ns),格式device_types:node_numbers operation time
  7. blkio.io_merged:統計cgroup 將 BIOS 請求合併到IO操做(包括read、write、sync及async)請求的次數,格式number operation
  8. blkio.io_wait_time:統計cgroup在各設備中各種型IO操做(包括read、write、sync及async)在隊列中的等待時間(單位ns),格式device_types:node_numbers operation time

六、磁盤使用狀況,我覺得只須要監控docker pool space的情況便可,默認創建100G的空間供docker使用,可經過docker info來查看,一個典型的輸出以下:

Containers: 11
Images: 181
Storage Driver: devicemapper
Pool Name: docker-8:5-7471107-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: extfs
Data file: 
Metadata file: 
Data Space Used: 7.846 GB
Data Space Total: 107.4 GB
Metadata Space Used: 15.92 MB
Metadata Space Total: 2.147 GB
Udev Sync Supported: true
Library Version: 1.02.89-RHEL6 (2014-09-01)
Execution Driver: native-0.2
Kernel Version: 2.6.32-431.el6.x86_64
Operating System: <unknown>
CPUs: 24
Total Memory: 62.87 GiB
Name: jx-lj-opweb01.lianjia.com
ID: QTML:RSSS:IKAX:FRIP:4YEQ:IXWX:ROMV:APZD:RV4M:ISY2:QW2D:VMXW

七、在前期能夠先重點監控 宿主機狀況 & 容器的memory狀態,其餘狀態可記錄,監控值可稍後商榷。

相關文章
相關標籤/搜索