AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 21106
Accepted
lima
lima
Asked: 2009-06-07 04:27:30 +0800 CST2009-06-07 04:27:30 +0800 CST 2009-06-07 04:27:30 +0800 CST

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

  • 772

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

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

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

我很想知道可以采取哪些步骤来解决这个问题并解决问题。然而,我也没有时间在当前结束之前降低我的记忆足迹和降级计划,所以任何可以创造奇迹和拯救一天的东西也是受欢迎的 :)

apache-2.2 solaris unix memory web-server
  • 8 8 个回答
  • 46131 Views

8 个回答

  • Voted
  1. Best Answer
    lima
    2009-06-08T07:15:55+08:002009-06-08T07:15:55+08:00

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

    这是我做的事情的清单:

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

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

    启动服务器 1
    MinSpareServers 1
    MaxSpareServers 5
    服务器限制 16
    最大客户数 16
    MaxRequestsPerChild 0
    听积压 100
    

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

    参考:

    • http://httpd.apache.org/docs/2.0/misc/perf-tuning.html
    • http://httpd.apache.org/docs/2.2/mod/mpm_common.html

    关闭 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。这是我将很快尝试的另一个好建议,但现在我不能冒险停机。
    • 23
  2. Kevin Kuphal
    2009-06-07T13:34:11+08:002009-06-07T13:34:11+08:00

    我发现这篇关于 Apache 和 MySQL 的低内存配置的文章

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

    • 6
  3. Karl Katzke
    2009-06-07T13:15:09+08:002009-06-07T13:15:09+08:00

    您将需要限制正在运行的 apache 服务器进程的数量,并且尽可能接近限制,您将无法处理非常高峰的流量。拥有一个在正常使用情况下最大化的网络服务器通常是一个坏主意(tm),因为网络流量在大多数情况下都很好而且很低,直到你被点刺或挖掘或火球或其他任何事情。

    主要问题是在任何一点运行的 apache 进程的数量——假设这里是 prefork,因为我只部署了 PHP 应用程序,而 PHP 不是线程安全的。我没有测量工人 MPM 尺寸的经验。有些项目在共享内存中,有些项目在每个进程的内存中。

    您可以通过省去不需要的共享模块来减少总内存占用。基本上,Apache 是由大多数主机配置的,可以在阳光下做几乎所有事情。如果您没有使用 mod_userdir,则将其从您的 apache 配置中注释掉。请注意您删除了多少,因为您可能需要的某些东西或它们的依赖关系并不直观!所有模块都应记录在 apache.org 网站上。每个进程的占用空间更难变小;如今,大多数 apache 配置只附带四个基本模块。除了这四个模块之外,大部分内存使用来自泄漏或应用程序 RAM 没有有效地进行垃圾收集,这就是为什么您可能想要设置请求数量的原因每个进程处理的低。

    您确实希望将内存使用量保留在 RAM 本身中,而不是进行交换。交换意味着 I/O。I/O 很慢,并且会在等待某些东西从交换中洗牌时阻塞进程阻塞,从而使您的 CPU 使用率飙升。

    • 4
  4. yhager
    2009-06-07T06:05:15+08:002009-06-07T06:05:15+08:00

    对于 apache,请删除您不使用的模块,因为它们只是使用额外的内存。对于 MySQL,如果不使用 innodb/bbdb,请删除它们,并删除不需要的 PHP 模块。

    接下来你应该根据一个进程的大小和你想给 apache 的内存量来配置 apache MaxClients。MySQL 上的最大连接数也是如此(我推荐优秀的MySQL Tuning Primer Script。

    如果您可以控制您的 PHP 应用程序,请确保它不会使用太多内存(例如在变量中,尤其是静态变量中)。

    如果想更进一步,可以将 apache+mod_php 替换为 nginx+fcgi 设置,这样可能会导致内存进一步减少。

    最后一件事 - 您真的不想在 Web 服务器上进行交换。只是一点点,删除不需要的东西,但在网络服务器上定期交换将导致网站无响应。

    • 2
  5. rasjani
    2009-06-08T08:43:34+08:002009-06-08T08:43:34+08:00

    既然你已经达到了目标,这里有一些额外的:

    由于您删除了所有不必要的 php 模块,因此您可以对 apache 进行相同的操作。默认情况下(取决于您的安装)apache 加载了很多额外的模块,其中大多数对于日常使用来说并不是真正需要的。例如,有一堆总是加载的身份验证模块。除非您尝试限制带宽使用,否则通常不需要放气。自动索引和状态也值得怀疑。

    还有一个就是可以在php.ini中限制php可用的内存量:memory_limit=xxxM

    • 2
  6. Coops
    2009-06-07T04:51:05+08:002009-06-07T04:51:05+08:00

    您当然可以限制 apache 可以分叉的进程数量,但这只能作为对内存使用的 sudo 硬限制。从较低级别的角度来看,您可以使用plimit来限制进程可用的资源。我相信将此应用于继承的父进程和子进程。

    但是,从 Web 服务器配置的角度来看,它可以归结为您的代码如何真正运行!但请记住,像使用 .htaccess 文件这样的小事情比使用中央 apache 配置文件使用更多资源(因为每次请求进入时都会读取它们,从而导致更大的开销),这在大型网站中很重要。

    • 0
  7. D.F.
    2009-06-07T11:51:52+08:002009-06-07T11:51:52+08:00

    随着时间的推移,可能有助于内存增长的一件事是将 httpd keepalive 设置得较低,但我会仔细测试,以防您的应用程序需要更长寿命的进程。

    • 0
  8. Unknown
    2009-06-07T13:30:13+08:002009-06-07T13:30:13+08:00

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

    我没有使用 Solaris 的经验,但你能做的最好的事情就是不要使用 Apache/mod_php。

    • 使用 php-fastcgi 切换到 nginx。
    • 重新编译 php 以使用最少数量的插件。
    • 摆脱不必要的进程,如 ntpd(使用 ntpdate)、ftp(使用 scp)等......
    • 0

相关问题

  • 如何强制我的网址始终以 www 开头?

  • 笔记本电脑 - RAM 与磁盘的性能

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

  • 更改 PHP 的默认配置设置?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve