我在 1und1.de 租了一个小型虚拟服务器。(链接,但仅限德语)(2GB RAM 动态,至少 512MB,20 GB 硬盘)我选择运行 Ubuntu 8.04 LTS 作为操作系统(64 位)。我通过 Ubuntu 存储库和后来的 eAccelerator 安装了 apache2 + php5 + mysql。
我运行一些开发工作和一个生产站点。这个网站是一种目录,有几个访问者(每天 250 个)和很多页面(大约 7,5k)。每隔几天,服务器就会冻结。这意味着,它已启动,可以被 ping,但任何其他操作都会导致“服务器拒绝连接”。查看管理面板,它说我kmemsize
的值很高,而且还产生了很多 apache 进程。
对我来说,我的 apache 似乎消耗了我所有的资源(而且,如果 Google 或其他爬虫开始爬取页面,这些冻结似乎也开始了)。
然后我试图避免这种冻结:
- 我在 Apache 配置中降低了 MaxKeepAliveRequests 和 KeepAliveTimeout
- 我在 prefork 设置的设置中设置了 MaxRequestsPerChild,以保持 Apache 工作人员更频繁地清理。
这似乎改善了这种情况,但仍然发生冻结。
任何人都知道可以/应该改变什么?
解决方案。
弄清楚问题实际上是什么:
在您使用过类似 top 或 ps 命令来查看实际使用内存的内容之前,不要开始调整。它可以在堆栈中的任何位置(Mysql、PHP、Apache)。如果是阿帕奇...
切换到更轻量的 HTTP 守护程序:
您是否考虑过更轻量的 HTTP 守护程序,例如:
考虑使用 Apache 的不同 MPM:
在将其投入生产之前,我会对此进行大量测试,但您可能会考虑切换工作人员(而不是 perfork)多处理模块 (MPM)。 这篇文章说这是在 dealnews.com 上使用的,它有助于内存使用。我没有在 Ubuntu 上做过这个,但我认为它只是:
但是你可能想考虑从源代码构建 Apache,这样你就只有你需要的模块,虽然这可能是一个大项目。另外,从文章中请记住:
也调整 PHP:
这篇 IBM Developerworks 文章提供了一些 php 调整选项,它们也可能有助于减少内存。
Tune MySQL as well:
上述 IBM Lamp 调优文章中 的第三篇文章谈到了 MySQL 调优。这最终可能会使用相当多的内存。