docker stats --no-stream
컨테이너 접두사별로 그룹화하고 RAM, CPU, 네트워크 및 IO의 합계를 표시하려면 어떻게 해야 합니까 ?
명령의 처음 두 열이 docker stats --no-stream
다음과 같다고 생각하면:
CONTAINER ID NAME
9b0ef23b9c11 CompanyOneDatabase
e8bd20985752 CompanyOneAdminer
0931f3ece839 CompanyOneSite
ecbf58f6373c CompanyOneApi
61a5c5853061 CopmanyTwoDatabase
545f6f7d6f03 CopmanyTwoAdminer
28c026a8b048 CopmanyTwoSite
358a1791c233 CopmanyTwoApi
e31c842b7a35 CopmanyTwoAdminPanel
e31c842b7a35 CopmanyTwoAdminApi
이 결과를 어떻게 얻을 수 있습니까?
CompanyOne RAM_SUM CPU_SUM Network_SUM IO_SUM
CopmanyTwo RAM_SUM CPU_SUM Network_SUM IO_SUM
~에서이 문제그리고앗이 스크립트를 생각해 냈지만 작동하지 않습니다.
#!/bin/bash
docker stats --no-stream | awk '/CompanyOne/ {print $3, $4, $8, $11}' | xargs awk '{
for (i=2; i<=NF; i++) {
sumcols[i]+= $i; sumrows+= $i
}; print $0, sumrows
}
END { for (x in sumcols)
{ printf SEP sumcols[x]; SEP=FS };
print ""
}' infile
기본적으로 쉘에서 매핑/축소를 수행해야 합니다. 어떻게 구현할 수 있나요?
고쳐 쓰다: 이것은 VPS 인스턴스 중 하나의 실제 샘플입니다. 개인정보 보호를 위해 회사 이름은 다음 문자로 대체되었습니다.
답변1
나는 그것을 알아
count.awk:
NF == 1 {
ram[$1] = cpu[$1] = network[$1] = io[$1] = 0 ;
}
NF > 1 {
for (r in ram )
if (substr($2,1,length(r)) == r ) {
ram[r]+=$3 ; cpu[r]+=$4 ; network[r] += $8 ; io[r] += $11 ;
}
}
END { for (r in ram )
printf "%-25s %6.2f %6d %6d %6d\n",r,ram[r],cpu[r],network[r],io[r] ;
}
회사 목록이 필요합니다(샘플에 있음).
Aaaaaaaa
Bbbbbbbbbbb
Cccccccccc
Ddddddddddd
라고
docker stats --no-stream | awk -f count.awk l -
이것은
Bbbbbbbbbbb 0.25 1071 1235 360
Aaaaaaaa 0.27 1118 2674 382
Ddddddddddd 0.23 1372 3310 432
Cccccccccc 0.24 1183 2388 1302
- 형식 문자열("%-25s %6d %6d %6d %6d\n")을 조정하여 더 많거나 적은 공간을 제공할 수 있습니다.
- 각 회사가 항상 동일한 컨테이너 재고를 보유한다면 수동 재고를 피할 수 있습니다.
- 주석에서 지적했듯이
docker stats
형식 문자열( )을 제공하면--format=" "
필수 필드만 인쇄됩니다. - 지역에 따라 awk로 전화해야 할 수도 있습니다.
LC_NUMERIC=C awk -f ...