如何在Docker容器内运行psutil?

3

我正在尝试从我的python应用程序中监视docker容器的CPU和内存。我计划使用psutil来完成这项工作。我在其他论坛上看到过/proc可能会在psutil中被更改。

import psutil
psutil.PROCFS_PATH = 'proc/self'
psutil.cpu_percent()

这让我遇到了以下错误:
 File "app.py", line 22, in <module>
 web-vote-app_1  |     r = psutil.cpu_percent()
 web-vote-app_1  |   File "/usr/local/lib/python2.7/site-packages/psutil       /__init__.py", line 1773, in cpu_percent
 web-vote-app_1  |     _last_cpu_times = cpu_times()
 web-vote-app_1  |   File "/usr/local/lib/python2.7/site-packages/psutil/__init__.py", line 1645, in cpu_times
 web-vote-app_1  |     return _psplatform.cpu_times() 
 web-vote-app_1  |   File "/usr/local/lib/python2.7/site-packages/psutil/_pslinux.py", line 544, in cpu_times
 web-vote-app_1  |     fields = [float(x) / CLOCK_TICKS for x in fields]
 web-vote-app_1  | ValueError: could not convert string to float: (python)
 web-result_1    |  * Running on http://0.0.0.0:5002/ (Press CTRL+C to quit)
 swarmmicroservicedemov1_web-vote-app_1 exited with code 1

请问是否有可能获取容器的相同信息而不是主机,如果可以的话,该怎么做?谢谢。


这不是“我的”字符串,而是由文件系统提供的。我想知道确切的文件系统 proc 位置,以便我可以监视容器指标而不是主机系统指标。 - crazyglasses
你的 app.py 文件至少有22行,请问能否把它们全部展示出来? - OneCricketeer
你好,我可以展示给你所有的内容,但我确定这与应用程序中的内容无关。它更多地涉及到Linux文件系统及其cgroups。psutil默认从“/proc”中提取信息,这将为我提供主机级别的指标,但我想找到容器级别的指标,那么我该在哪里找到呢? - crazyglasses
除非您将主机/proc挂载在那里,否则我认为那不正确。但是再说一遍,在容器中我还没有运行过psutil。 - OneCricketeer
1
从我的经验来看,容器所看到的CPU使用率与主机相同;无论容器是否有自己的/proc/目录(安装并在容器内部查看htop,您将看到与主机对应的CPU活动(百分比))。 - Robert
显示剩余3条评论
1个回答

2

为什么要更改默认的/proc/路径?

这只是有效的:

import psutil
psutil.cpu_percent(interval=1)

每个容器已经正确挂载了它的/proc信息。因此,psutil可以在不挂载任何额外信息的情况下正常工作。

编辑:查看它的工作

Dockerfile:

FROM python:2

RUN pip install psutil

CMD sh -c 'while true; do python -c "import psutil; print psutil.cpu_percent()"; sleep 0.5; done'

构建和运行:

docker build . -t psutil-test && docker run -it psutil-test
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM python:2
 ---> 2e9467da064d
Step 2/3 : RUN pip install psutil
 ---> Using cache
 ---> bdb07a51b12b
Step 3/3 : CMD sh -c 'while true; do python -c "import psutil; print psutil.cpu_percent()"; sleep 0.5; done'
 ---> Using cache
 ---> 028f88f8844c
Successfully built 028f88f8844c
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0

1
你确定这个吗? - crazyglasses
我已经添加了 interval=1 以获得更真实的CPU使用率。 - Robert
4
根据来源,在Linux(=在Docker中),它使用/proc/meminfo获取内存统计信息。这不是每个cgroup的记录,而是主机级别的统计:https://ops.tips/blog/why-top-inside-container-wrong-memory/。 - Jan Katins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接