如何减少 Unix 网络服务器上的内存使用量

lim*_*ima 36 solaris unix memory web-server apache-2.2

我目前正在使用 Joyent Accelerator 来托管我的网络应用程序,它运行良好,但是我需要降低成本,因此我正在降级我当前的计划,这施加了一些新的内存限制(256M rss,512M 交换)。昨天我并没有超过他们,但是在今天重新启动 Apache 几次之后,我现在是 411M rss,721M 交换(prstat -Z -s cpu)。

在服务器故障中搜索只给了我很多方法和特定工具来监视服务器,但没有关于如何减少/优化它的内存使用的建议。我也看过这个问题,但我认为这对这种特殊(或者我可以说是通用的?)情况不利。

服务器在共享 CPU 上运行 Solaris,我使用的是 Apache + MySQL + PHP 堆栈。

我有兴趣了解可以采取哪些步骤来解决此问题并解决问题。但是,我也没有时间在当前结束之前降低我的内存足迹并降级计划,因此也欢迎任何可以创造奇迹并挽救一天的事情:)

lim*_*ima 23

谢谢大家的回答!按照您的建议,我已经能够将我的内存使用量减少到 195M SWAP 和 108M RSS,而无需触及我的代码(我肯定会很快对其进行优化,但这应该是让我快速摆脱困境的解决方案)。

这是我所做的事情的清单:

摆脱了 VirtualHost 条目中使用的通配符。我使用了服务器的真实 IP,而不是 *:80 和 *:443。

更改了 Apache 的 prefork MPM。这些是我最终使用的值:

启动服务器 1
最小备用服务器 1 
最大备用服务器 5 
服务器限制 16
最大客户 16
MaxRequestsPerChild 0
聆听积压 100

这些绝不是神奇的数字。我花了一些时间尝试不同的值和组合,然后根据我服务器的实际使用情况对它们进行测试,每个人都应该在他们的环境中做同样的事情。作为记录,我的服务器每月接收接近 200 万次 pvs,以常规速率提供动态页面和资产 - 没有挖掘效果。其目的再次是减少内存占用,而不是提高性能或 HA。

参考:

关闭 Apache 的 KeepAlive。通过设置KeepAliveTimeout为较低的值(在我的情况下为 2),我可以期望更少的服务器进程只是等待与可能不会请求更多内容的空闲客户端的连接。

参考:http : //httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

删除了 MySQL 未使用的模块。我添加skip-innodb到 MySQL 的 my.cnf。大量内存消耗减少。


还有一些我个人无法做到的非常好的建议:

  • 删除不需要的 PHP 模块。我服务器上的 PHP 已经编译了大多数 mod,我可能会在其他 VPS 上尝试我自己的最小 PHP。
  • 使用 php-fastcgi 切换到 nginx。这是我很快就会尝试的另一个好建议,但现在我不能冒险停机。


Kev*_*hal 6

在 Apache 和 MySQL 的低内存配置上找到了这篇文章

在布置低内存配置所需的配置更改时非常有用。我根据自己的情况对它们进行了调整,但它们应该为您提供找到最适合您的环境所需的工具