docker stats 명령 소스 분석 결과

2473 단어 docker
본고는 docker 1.10.3 버전의 원본 코드를 바탕으로 docker stats 명령에 대해 원본 분석을 하고 docker stats 명령이 출력한 데이터가 cgroups fs에서 어떻게 계산되는지 본다.$ docker stats nginx-test
CONTAINER
CPU %
MEM USAGE/LIMIT
MEM %
NET I/O
BLOCK I/O
nginx-test
0.00%
4.268 MB/1.041 GB
0.41%
1.296 kB/648 B
7.463 MB/0 B
docker client 관련 코드 입구 참조 가능:/docker/docker/api/client/stats.go#141 docker daemon 관련 코드 입구 참조:/docker/docker/daemon/daemon.go#1474
원본 코드 분석 결과
Cpu 데이터:
docker daemon은 이번 읽기/sys/fs/cgroup/cpuacct/docker/[container Id]/cpuacct를 기록합니다.usage의 값, cputotal_usage;마지막으로 읽은 이 값이 pre 임을 기록했습니다.cpu_total_usage;
/proc/stat에서 cpufieldvalue를 읽고 누적하여 시스템usage;마지막 값이 pre 임을 기록합니다.system_usage;
읽기/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage_percpu의 기록, 그룹 구성percpu_usage_array;
docker stats는 Cpu Percent의 알고리즘을 계산합니다.
cpu_delta = cpu_total_usage - pre_cpu_total_usage; system_delta = system_usage - pre_system_usage; CPU % = ((cpu_delta/system_delta) * length(per_cpu_usage_array) ) * 100.0
메모리 데이터:
읽기/sys/fs/cgroup/memory/docker/[containerId]/memory.usage_in_bytes의 값으로memusage;
용기가 메모리를 제한하면/sys/fs/cgroup/memory/docker/[id]/memory를 읽습니다.limit_in_bytes는memlimit, 그렇지 않으면memlimit = machine_mem;
docker stats에서 Memory 데이터를 계산하는 알고리즘:
MEM USAGE = mem_usage MEM LIMIT = mem_limit MEM % = (mem_usage/mem_limit) * 100.0
Networt Stats 데이터:
이 용기 네트워크 namespace veth pairs에 속하는 호스트에 대응하는veth* 가상 네트워크 카드 EthInterface 그룹을 가져오고, 그룹의 모든 네트워크 카드 장치를 순환해서 읽습니다./sys/class/net//statistics/rxbytes 획득 rxbytes, 읽기/sys/class/net//statistics/txbytes 대응하는 tx 획득bytes.
모든 가상 NIC에 대응하는 rxbytes 이 용기를 누적하는 rxbytes.
이러한 모든 가상 NIC에 해당하는 txbytes 이 용기를 누적하는 txbytes.
docker stats에서 Network IO 데이터를 계산하는 알고리즘:
NET I = rx_bytes NET O = tx_bytes
Blkio Stats 데이터:
모든 블록 장치의 IoServiceBytesRecursive 데이터 가져오기:/sys/fs/cgroup/blkio/docker/[containerId]/blkio.io_serviced_recursive에 유효한 값이 있는지 여부,
  • 있으면 읽기/sys/fs/cgroup/blkio/docker/[containerId]/blkio.io_service_bytes_recursive의 값 되돌리기;
  • 없으면/sys/fs/cgroup/blkio/docker/[containerId]/blkio.throttle.io_service_bytes의 값 되돌리기;

  • 각 블록 장치의 Io ServiceBytesRecursive 데이터에 있는 모든read field에 대한value를 누적하여 해당 컨테이너의blkread 값;각 블록 장치의 IoServiceBytesRecursive 데이터에 있는 모든 write field에 대한value를 누적하여 이 용기의blkwrite 값;
    docker stats에서 Block IO 데이터를 계산하는 알고리즘:
    BLOCK I = blk_read BLOCK O = blk_write

    좋은 웹페이지 즐겨찾기