我在一台 debian 机器上有一个流量很大的应用程序,而 apache 开始表现得很奇怪。
每次我启动 apache 时,都会产生大量 apache 进程,应用程序根本无法加载,而且很快整个机器就会死机,必须重新启动才能重新启动。
这是我在启动 apache 后立即得到的结果:
top - 20:14:44 up 1:16, 2 users, load average: 0.48, 0.10, 0.03 Tasks: 330 total, 5 running, 325 sleeping, 0 stopped, 0 zombie Cpu(s): 12.0%us, 21.4%sy, 0.0%ni, 65.7%id, 0.2%wa, 0.1%hi, 0.7%si, 0.0%st Mem: 8179920k total, 404984k used, 7774936k free, 60716k buffers Swap: 2097136k total, 0k used, 2097136k free, 43424k cached 10251 www-data 15 0 467m 8100 4016 S 6 0.1 0:00.04 apache2 10262 www-data 15 0 467m 8092 4012 S 6 0.1 0:00.05 apache2 10360 www-data 15 0 468m 8296 4016 S 6 0.1 0:00.05 apache2 10428 www-data 15 0 468m 8272 3992 S 6 0.1 0:00.05 apache2 10241 www-data 15 0 467m 8256 4012 S 4 0.1 0:00.03 apache2 10259 www-data 15 0 467m 8092 4012 S 4 0.1 0:00.04 apache2 10274 www-data 15 0 467m 8056 4012 S 4 0.1 0:00.03 apache2 10291 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2 10293 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2 10308 www-data 15 0 468m 8296 4016 S 4 0.1 0:00.02 apache2 10317 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.02 apache2 10320 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2 10325 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2
等等……还有更多的 apache2 进程。
不到一分钟后,您可以在下方看到负载已从 0.48 变为 2.17。如果此时我不停止 apache,负载会在几分钟或更短的时间内继续上升,直到机器死机。
top - 20:15:34 up 1:17, 2 users, load average: 2.17, 0.62, 0.21 Tasks: 1850 total, 5 running, 1845 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3%us, 2.1%sy, 0.0%ni, 96.4%id, 0.0%wa, 0.1%hi, 1.0%si, 0.0%st Mem: 8179920k total, 1938524k used, 6241396k free, 60860k buffers Swap: 2097136k total, 0k used, 2097136k free, 44196k cached
我们有一个防火墙,将我们知道的可以访问我们网站的地址列入白名单。
任何关于问题可能是什么的想法都非常欢迎。
谢谢!
最佳答案
您可能犯了错误,将 Apache 配置为使用的内存远远超过您的所有内存。这是一个容易犯的错误。
我假设您使用的是 Prefork Apache 和进程内应用程序服务器(例如 PHP 或 mod_perl)。在此模型中,您最终将使用最大 (MaxClients * 每个进程的应用程序的最大内存使用量) 内存。如果您几乎没有那么多,是时候减少一个、另一个或两者。
在一般情况下,这意味着将 MaxClients 减少到您的服务器有足够的内存来应对的程度。
如果您使用 Prefork 模型,通常用于 MaxClients 的默认值(通常为 150)不适合在普通机器上运行进程内重量级应用程序服务器(大多数应用程序服务器要么不支持,要么不鼓励,使用线程模型)。
但是,减少 MaxClients 最终会导致应用程序变得不可用,特别是如果您启用了 keepalives 并且 keepalive 超时时间过长。仅保持连接事件的进程(服务器状态中的状态 K)仍然使用大量 RAM,这可能是个问题 - 尝试最小化保持连接超时,或完全关闭它。
您需要密切关注服务器状态(由 mod_status 提供)。
当然,只有在您了解后果的情况下,您才应该进行任何这些更改。三思而后行,更改配置一次。如果您有能力在类似规范的非生产机器上使用模拟负载测试更改,请这样做。
关于linux - 当我启动 apache 并继续杀死我的机器时,如何防止产生大量的 apache 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/501205/