我在某处读过这篇文章:
“对于一个普通的 Apache 服务器,如果你运行许多子进程并不重要——每个进程大约 1 MB(大部分是共享的),所以它们不会占用很多 RAM。情况不同mod_perl,其中进程可以轻松增长到 10 MB 甚至更多。例如,如果您将 MaxClients 设置为 50,则内存使用量变为 50 × 10 MB = 500 MB。您是否有 500 MB 的 RAM 专用于 mod_perl 服务器? "
我没有在我的服务器上使用 mod_perl。我在 apache2 的轨道上使用 phusion 乘客和 ruby。我正在使用 prefork MPM,MaxClients 设置为默认值 256。这意味着我可以在任何给定时间同时运行 256 个进程。这篇文章引起了我的兴趣,因为我从来没有同时运行 256 个 apache2 进程,通常在任何给定时间我只有 80 个 apache2 进程在运行。但有时即使只有 80 次我的服务器也会陷入困境,以至于当您尝试加载它时网站就会挂起。
当我运行以下命令时,有时会显示 80 个 apache2 进程,例如:
ps aux | grep apache2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1130 0.0 0.1 149080 10600 ? Ss 12:36 0:00 /usr/sbin/apache2 -k start
www-data 2051 0.0 0.3 163608 23592 ? S 16:46 0:00 /usr/sbin/apache2 -k start
www-data 2506 0.0 0.1 149376 7952 ? S 16:47 0:00 /usr/sbin/apache2 -k start
www-data 5149 0.0 0.1 149416 7980 ? S 16:49 0:00 /usr/sbin/apache2 -k start
www-data 5175 0.0 0.1 149368 7876 ? S 16:49 0:00 /usr/sbin/apache2 -k start
www-data 10212 0.0 0.1 149368 7848 ? S 16:53 0:00 /usr/sbin/apache2 -k start
www-data 19114 0.0 0.1 149368 7904 ? S 17:01 0:00 /usr/sbin/apache2 -k start
www-data 19138 0.0 0.1 150768 11856 ? S 17:01 0:00 /usr/sbin/apache2 -k start
www-data 20592 0.0 0.1 149428 8092 ? S 16:35 0:00 /usr/sbin/apache2 -k start
www-data 21336 0.0 0.1 149368 7808 ? S 17:03 0:00 /usr/sbin/apache2 -k start
www-data 21375 0.0 0.1 149432 7916 ? S 17:03 0:00 /usr/sbin/apache2 -k start
1000 26458 0.0 0.0 8112 896 pts/6 S+ 17:07 0:00 grep apache2
www-data 30848 0.0 0.1 149396 8044 ? S 16:43 0:00 /usr/sbin/apache2 -k start
但是在内存下,它们的范围从 0.1 到 0.4,这似乎不是很多内存。所以我的问题是,当您从浏览器向站点发送请求时,除了生成一个新的 apache2 进程作为父 apache2 进程的子进程之外,乘客是否还会创建另一个进程,这可能会导致内存陷入困境?当我运行 top 命令时,我注意到有时它会在 %100 CPU 上显示一个 ruby 进程。我想知道 ruby 进程是否以某种方式通过乘客链接到 apache2 进程。就像那篇文章所说的那样,一定有什么东西导致这些进程增长到大内存消费者。一定有什么我没看的。
顺便说一句,我的机器上有超过 5 个内存:
$ cat meminfo
MemTotal: 6113156 kB