2016-11-12 159 views
0

我有一台带有8GB RAM的服务器Intel(R)Xeon(R)CPU X3440。
从我看到Apache使用所有RAM并使服务器无响应。
Apache httpd使用所有内存直到服务器关闭

这里是我的Apache配置:

<IfModule prefork.c> 
StartServers  8 
MinSpareServers 5 
MaxSpareServers 20 
ServerLimit  1000 
MaxClients  1000 
MaxRequestsPerChild 4000 
</IfModule> 

这是我的自由-m:

  total  used  free  shared buffers  cached 
Mem:  7859  7725  134   0  189  1566 
-/+ buffers/cache: 5969  1889 
Swap:  4095   61  4034 

这是我的TOP:

top - 10:19:57 up 23 min, 1 user, load average: 8.08, 6.50, 3.90 
Tasks: 1124 total, 1 running, 1123 sleeping, 0 stopped, 0 zombie 
Cpu(s): 9.8%us, 3.2%sy, 0.1%ni, 60.0%id, 26.2%wa, 0.0%hi, 0.6%si, 0.0%st 
Mem: 8048096k total, 7924168k used, 123928k free, 207920k buffers 
Swap: 4194300k total, 79820k used, 4114480k free, 1460356k cached 

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
1921 mysql  20 0 1653m 39m 3428 S 62.7 0.5 6:26.24 mysqld 
7944 apache 20 0 399m 29m 4236 S 6.6 0.4 0:10.13 httpd 
3201 apache 20 0 382m 11m 3880 S 2.3 0.1 0:00.50 httpd 
8030 apache 20 0 382m 10m 3872 S 2.0 0.1 0:00.39 httpd 
2837 apache 20 0 384m 13m 3916 S 1.3 0.2 0:00.37 httpd 
3160 apache 20 0 383m 11m 3908 S 1.3 0.2 0:00.55 httpd 
10555 apache 20 0 382m 11m 3884 S 1.3 0.1 0:00.48 httpd 
13626 apache 20 0 381m 10m 3828 S 1.3 0.1 0:00.05 httpd 
13668 apache 20 0 382m 11m 3760 S 1.3 0.1 0:00.16 httpd 
14284 apache 20 0 381m 10m 3712 S 1.3 0.1 0:00.06 httpd 
2848 apache 20 0 382m 11m 3876 S 1.0 0.2 0:00.49 httpd 
5254 apache 20 0 382m 11m 3852 S 1.0 0.1 0:00.25 httpd 
6085 apache 20 0 382m 10m 3768 S 1.0 0.1 0:00.26 httpd 
6257 apache 20 0 382m 11m 3876 S 1.0 0.1 0:00.50 httpd 
8067 apache 20 0 380m 9.8m 3732 S 1.0 0.1 0:00.18 httpd 
14314 apache 20 0 382m 10m 3768 S 1.0 0.1 0:00.09 httpd 
14328 apache 20 0 380m 9288 3800 S 1.0 0.1 0:00.16 httpd 

那么,什么是建议解决这个问题?

+0

那么,减少子进程的数量... – arkascha

+0

@arkascha如果MaxClients和ServerLimit小于1000,访问时该网站会很慢。长达20秒才能打开。 –

+0

如果是这样,那么很可能你的系统对负载来说不够强大。 – arkascha

回答

1

我刚刚回答了一个类似的问题Check this link。下面是我建议:

我有一个类似的问题在EC2实例和这里就是我所做的,并建议:

  1. 如果您使用的prefork,确保该模块通过键入加载这两个命令 httpd -lsudo httpd -M 如果您可以看到prefork模块加载到这两个命令中任何一个的结果中,然后直到下一步。否则,请确保首先加载它,否则你会改变配置为空。

  2. 运行此命令来查找平均内存每个httpd进程正在使用ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg)/NR;} END {print avg " MB";}'调用看重x

  3. 使用sudo service httpd restart重新启动Apache服务器,并记录你有多少可用内存有。我所做的是从该空闲内存中减去一个额外的​​垫子以备后用。称之为价值y

  4. 鸿沟的空闲内存y值超过存储每个进程x使用量,这将是的MaxRequestWorkers = y/x

  5. 价值至于MaxConnectionsPerChild的值,那么你可以调整它,直到你得到正确的配置。它会让它变得太大,然后这个过程会在被杀之前继续使用越来越多的内存。如果你做得太小,那么这个过程将会过快地死去,这会给你的系统带来开销。我通常将它保持在400010000之间。

  6. 其中一些步骤已从以下链接中的接受答案中提取:StackExchange: httpd memory usage其中一种解决方案还建议禁用某些模块(如果不需要它们)。

  7. 确保检查访问日志。可能有人正试图攻击你的网站!

我建议你先做1-5步,看看是否解决了你的问题!

祝你好运!