当我运行 top 时,我看到(uWSGI 使用 ~860MB 的
RES
;这是在 Docker 中):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11 root 20 0 1048736 360688 19064 S 0.3 17.6 1:17.00 uwsgi
12 root 20 0 1018840 328140 18964 S 0.3 16.0 1:42.41 uwsgi
RES 代表驻留大小,它准确表示进程实际消耗了多少物理内存。
我想了解什么在使用这么多内存。我尝试使用标准的 Python 堆分析工具,但它们没有揭示任何大的东西。例如使用
pympler
,我看到:
types | # objects | total size
============================ | =========== | ============
dict | 7933 | 9.15 MB
str | 50742 | 8.40 MB
code | 18044 | 2.20 MB
type | 2347 | 2.03 MB
unicode | 3188 | 1.56 MB
tuple | 8012 | 588.46 KB
list | 4425 | 550.81 KB
weakref | 3707 | 318.57 KB
set | 828 | 308.59 KB
builtin_function_or_method | 3432 | 241.31 KB
cell | 3267 | 178.66 KB
function (__init__) | 1417 | 166.05 KB
getset_descriptor | 2337 | 164.32 KB
wrapper_descriptor | 1968 | 153.75 KB
_sre.SRE_Pattern | 290 | 123.77 KB
是否可能存在某种堆外内存使用情况?也许 uwsgi 本身就使用了那么多 RAM?
UDPATED
我当前的
uwsgi.ini
文件:
[uwsgi]
strict = true
http = :8000
module = my_service.wsgi
master = true
processes = 2
threads = 2
buffer-size = 10000
我在 docker 容器中运行 uWSGI 时遇到了类似的问题。该问题的发生似乎是由于 Docker 未为文件描述符设置
ulimit
,如此 GitHub 问题中所述。
您可以通过在运行 Docker 容器时设置约束来解决此问题。例如,在
docker-compose.yml
中,我添加了:
ulimits:
nofile: 524288
在您的
uwsgi.ini
中设置限制可能会更容易
# Limit number of file descriptors
max-fd = 524288