Apache使用prefork模式,每个进程使用1000 MB内存

我目前正在使用在prefork内存模型上运行Apache的网站。 以下是httpd.conf的configuration

<IfModule prefork.c> StartServers 30 MinSpareServers 15 MaxSpareServers 30 MaxClients 96 ServerLimit 512 MaxRequestsPerChild 0 </IfModule> 

以下是从顶部的示例线

 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 29261 apache 15 0 1003m 231m 53m S 16.3 2.9 1:47.68 httpd 

以下是加载的Apache模块

 core prefork http_core mod_so mod_auth_basic mod_authn_file mod_authz_host mod_authz_user mod_include mod_log_config mod_logio mod_env mod_ext_filter mod_mime_magic mod_expires mod_deflate mod_headers mod_usertrack mod_setenvif mod_mime mod_status mod_autoindex mod_info mod_vhost_alias mod_negotiation mod_dir mod_actions mod_alias mod_rewrite mod_cgi mod_version mod_realip2 mod_php5 mod_ssl 

我不确定是否使用了所有这些模块。

以下是加载的PHP扩展

 date, libxml, openssl, pcre, zlib, bz2, calendar, ctype, curl, hash, filter, ftp, gettext, gmp, session, iconv, posix, Reflection, standard, shmop, SimpleXML, SPL, sockets, exif, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, apache2handler, memcache, uploadprogress, dbase, dom, eAccelerator, gd, json, mbstring, mcrypt, memcached, mongo, mysql, mysqli, newrelic, PDO, pdo_mysql, pdo_sqlite, xmlreader, xmlwriter, xsl, zip 

为什么apache会使用每个进程的内存? 是因为这些模块吗? 如果是的话,那里有记忆狗,我可以开始看看是否正在使用? 或者可能是因为php的扩展? 那里有什么记忆?

php内存限制设置为256MB。

Eacceleratorconfiguration有512MB内存。

服务器无法处理即使略高于平均负载,因为一旦stream量增加,交换使用开始,系统不响应。 该服务器总共有8GB的内存,它是一个专用的四核服务器。

提前感谢您解决此问题的任何帮助。

首先,关于确定内存使用情况。 VSS / VSIZE / VIRT不是程序实际使用的RAM(如@psusi所logging的那样)。 有一些工具可以计算实际的使用情况,其中一个是来自雅虎的Peter Willis非常有用的工具:

http://psydev.syw4e.info/new/misc/meminfo.pl

关于你的configuration的两个重要的笔记 使用以下方法通常不是一个好主意:

 MaxRequestsPerChild 0 

除非你自己编写应用程序。 存在内存泄漏是非常常见的,所以经过几百次(或数千次)的请求后,子内存使用率将会增长,并最终超过合理的水平。 你应该把它设置为200,看看他们在200次请求后使用了多less内存。 这必须与服务器产生的时间量来衡量。 如果需要几秒钟的时间和大量的资源来分岔新的孩子,你想增加值(如果它是轻量级,甚至减less)。

其次,除非特别使用线程不安全的模块,否则prefork并不是真正的首选,因为它使用更多的内存:

http://httpd.apache.org/docs/2.0/misc/perf-tuning.html#compiletime

prefork MPM使用多个subprocess,每个进程有一个线程。 每个进程一次处理一个连接。 在许多系统上,prefork在速度上与worker相当,但是它使用更多的内存。

最后,你可能会想要通过并消除不需要的模块。 据我所知,没有自定义模块来帮助你做到这一点,你通常最终试图删除尽可能多的,并validation系统仍然工作。 这基本上是猜测和检查,但值得花一两个小时的时间。

也有一个原因为什么ps说每个进程是这样​​的..它不是每个进程正在使用这么多的内存..请参阅以下有关ps和内存的一个很好的阅读

http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html