我在 RHEL aws 机器上运行了大约 12 个 httpd 进程,但浏览器(共享团队开发机器)中没有人访问过。这些进程在开发机器上总共消耗了超过 1.8 GB 的内存,在生产机器上我看到过高达 6 GB 的内存。根据 ps aux,每个进程消耗大约 800 MB 的内存。我对其中一个进程进行了 strace 处理,然后放置了一段时间,结果发现:
<venv>/django/contrib/flatpages/templatetags/analytical 0x7fff37ef41a0) = -1 ENOENT (No such file or directory)
<venv>/django/contrib/flatpages/templatetags/analytical.py, O_RDONLY) = -1 ENOENT (No such file or directory)
<venv>/pagination/templatetags/expert_tags.py, O_RDONLY) = -1 ENOENT (No such file or directory)
<venv>/django/templatetags/raven.py, O_RDONLY) = -1 ENOENT (No such file or directory)
<vevn>/django_extensions/templatetags/raven.py O_RDONLY) = -1 ENOENT (No such file or directory)
短短 5 分钟内,就有数千条 ENOENT 消息,这绝对不是开玩笑。各种不同类型的文件。
一串3其他过程也显示了一些有趣的东西
read(4, 0x7fff37efa00f, 1) = -1 EAGAIN (Resource temporarily unavailable)
有什么方法可以找出资源是否在这里被引用?
我不是操作系统编程专家,但我认为这是不正常的?您知道如何找出导致这种情况的原因吗?如何预防?
奇怪的是,这个 raven.py 当然确实是一个丢失的文件,但我们在虚拟环境中有一个名为的第三方库
raven (3.5.1)
答案1
虽然仍然不确定为什么会有这么多 ENOENT,但对 apache 配置存在误解。我假设 mod_wsgi 在嵌入模式下运行时作为守护进程运行。apache worker.c 部分将进程数设置为 8,扩展为 25,这就是为什么有这么多待机进程的原因。
每个进程都预留了大约 800MB 的虚拟机空间和大约 120MB 的 RAM。一旦将 mod_wsgi 更改为守护进程,这些数字就会下降到大约 200MB 的虚拟机空间和 8MB 的 RAM!apache 的整体内存消耗从超过 1 GB 下降到 64MB!