我的webapp允许用户在沙箱中执行一些任意代码。为了防止forkbombs,应用程序在执行用户代码之前调用setrlimit并将RLIMIT_NPROC
限制为50。这在Ubuntu 12.04中运行良好,直到Ubuntu 13.04。但是,在升级到Ubuntu 13.10(随Apache 2.4和Linux 3.11提供)之后,我们达到了50个www-data
进程的限制,即使Apache2处于空闲状态也是如此!
使用bash
作为用户www-data
运行ulimit
可以轻松复制问题。首先切换到用户www-data
并启动bash
:
jeroen@Ubuntu:/$ sudo su www-data
$ bash
www-data@Ubuntu:/$
现在逐渐降低RLIMIT_NPROC
直到遇到问题:
#RLIMIT_NPROC=100: works fine
www-data@Ubuntu:/$ ulimit -u 100
www-data@Ubuntu:/$ ls
bin dev initrd.img lib64 mnt root srv usr vmlinuz.old
boot etc initrd.img.old lost+found opt run sys var
cdrom home lib media proc sbin tmp vmlinuz
#RLIMIT_NPROC=50: limit reached
www-data@Ubuntu:/$ ulimit -u 50
www-data@Ubuntu:/$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
因此,在将RLIMIT_NPROC
设置为50后,该过程不再分叉。这意味着已经有50个或更多进程作为用户www-data
运行。但是,这似乎并非如此,服务器只是空闲的Apache 2.4。根据{{1}},目前ps
只拥有2个过程:
www-data
那么为什么jeroen@Ubuntu:~$ ps aux | grep www-data
www-data 11473 0.0 0.5 631296 46164 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
www-data 11474 0.0 0.5 565656 45632 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
jeroen 12136 0.0 0.0 13644 956 pts/4 S+ 14:51 0:00 grep --color=auto www-data
在Apache 2.4中达到www-data
限制为50,即使在空闲时也是如此?
答案 0 :(得分:1)
感谢@sarnold的建议,发现了问题。我的应用程序依赖于mpm_prefork
,直到Ubuntu 13.04,在安装apache2-mpm-prefork
软件包时自动启用此模块。我认为情况仍然如此,但事实证明它正在运行mpm_event
。
似乎在Apache 2.4中,MPM的包装已经改变,安装后需要手动启用mpm_prefork
:
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo service apache2 restart
现在问题似乎已经消失了。