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