按Docker统计中的内存使用情况排序

oaxa6hgo  于 2023-02-03  发布在  Docker
关注(0)|答案(5)|浏览(540)

bounty将在3天后过期。回答此问题可获得+50声望奖励。DeltaIV希望奖励现有答案

有没有办法按照容器的内存使用情况来显示Docker统计信息?
我使用下面的命令来显示容器及其名称,并希望按内存使用情况对结果进行排序。

docker stats --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

未排序的结果如下所示。

NAME                                                                   CONTAINER           CPU %               MEM USAGE / LIMIT
kafka3.interactive.8a38c338742464ffb04d6f23fc6485391318d103            0d68b7fd49a0        1.39%               359.5 MiB / 4.833 GiB
kafka2.interactive.8a38c338742464ffb04d6f23fc6485391318d103            7e5541b0b883        1.22%               309.4 MiB / 4.833 GiB
kafka1.interactive.8a38c338742464ffb04d6f23fc6485391318d103            dff07c6d639c        0.68%               267.4 MiB / 4.833 GiB
service2.interactive.8a38c338742464ffb04d6f23fc6485391318d103          0f20a7e75823        0.06%               617.8 MiB / 4.833 GiB
consulakms.interactive.8a38c338742464ffb04d6f23fc6485391318d103        b5972262194d        3.82%               10.32 MiB / 4.833 GiB
service1.interactive.8a38c338742464ffb04d6f23fc6485391318d103          be56185a37bf        0.09%               596.3 MiB / 4.833 GiB
consumer1.interactive.8a38c338742464ffb04d6f23fc6485391318d103         05145beb209c        0.06%               574.6 MiB / 4.833 GiB
consul1.interactive.8a38c338742464ffb04d6f23fc6485391318d103           3298a8159064        0.67%               10.57 MiB / 4.833 GiB
consul3.interactive.8a38c338742464ffb04d6f23fc6485391318d103           4a1bbbd131ad        3.12%               9.664 MiB / 4.833 GiB
zookeeper2.interactive.8a38c338742464ffb04d6f23fc6485391318d103        040f00b4bbc7        0.09%               42.45 MiB / 4.833 GiB
consulbootstrap.interactive.8a38c338742464ffb04d6f23fc6485391318d103   45268a11f2f4        3.62%               11.46 MiB / 4.833 GiB
zookeeper3.interactive.8a38c338742464ffb04d6f23fc6485391318d103        331772b27079        0.12%               51.27 MiB / 4.833 GiB
consul2.interactive.8a38c338742464ffb04d6f23fc6485391318d103           77b63171e6b5        1.07%               12.59 MiB / 4.833 GiB
zookeeper1.interactive.8a38c338742464ffb04d6f23fc6485391318d103        c5ad82730598        0.08%               43.17 MiB / 4.833 GiB
service3.interactive.8a38c338742464ffb04d6f23fc6485391318d103          610da86c6949        3.79%               546.7 MiB / 4.833 GiB
squid.interactive.8a38c338742464ffb04d6f23fc6485391318d103             928ddbb197fa        0.01%               144.2 MiB / 4.833 GiB
ttp71kqs

ttp71kqs1#

要按Mem Usage字段排序,可以使用以下命令:
GNU/Linux:
docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -k 4 -h
MacOS操作系统:
docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.M‌​emPerc}}" | sort -k 9 -n
单击此链接查看docker stats--format选项的所有可用选项:www.example.comhttps://docs.docker.com/engine/reference/commandline/stats/#formatting

lbsnaicq

lbsnaicq2#

docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.MemUsage}}" | sort -k 3 -h

命令仅按内存排序

jaql4c8m

jaql4c8m3#

请确保您的区域设置的小数点分隔符是一个点。如果它是不同的排序将无法工作。
这就是为什么我使用这个命令(Linux),注意LC_ALL=en_US.utf8

docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | LC_ALL=en_US.utf8 sort -k 4 -h
omhiaaxx

omhiaaxx4#

在前面的答案的基础上,我创建了下面的函数,并将其放入别名文件中。
它每秒捕获一次dockers统计数据,然后生成4个表,按CPU %、MEM使用、NET I/O和BLOCK I/O降序排序。
此外,这也会保留表格标题:-)

function dks() { 
    watch -n 1 'STATS=$(docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"); echo "$STATS" | (read -r; printf "%s\n" "$REPLY"; sort -k3hr) | head; echo; echo "$STATS" | (read -r; printf "%s\n" "$REPLY"; sort -k4hr) | head; echo; echo "$STATS" | (read -r; printf "%s\n" "$REPLY"; sort -k7hr) | head; echo; echo "$STATS" | (read -r; printf "%s\n" "$REPLY"; sort -k10hr) | head;'; 
}
h4cxqtbf

h4cxqtbf5#

我不喜欢使用watch方法所带来的延迟(比直接使用docker stats要慢得多),所以我编写了以下代码:

python - << EOF
import subprocess
import re
def getmemperc (value):
    try:
        return float(re.split('\s+', value)[6][:-1])
    except:
        return 0
proc = subprocess.Popen(['sudo', 'docker','stats'],stdout=subprocess.PIPE)
arr = []    
for line in iter(proc.stdout.readline,''):
    line = line.rstrip().decode()
    if (line.startswith('\x1b[2J\x1b[H')):
        if arr != []:
            print(arr.pop(0))
            arr = sorted(arr, key=lambda x: getmemperc(x), reverse=True)
            for a in arr:
                print(a)
        arr = []
    arr.append(line)
EOF

docker stats相比,无额外延迟。

相关问题