Vla*_*eev 6 linux memory apache-2.2
我维护了一个包含一些服务的 Gentoo 服务器,包括 Apache。它是相当低端的(2GB 内存和具有 2 个内核的低端 CPU)。我的问题是,尽管我尽了最大的努力,但过载的 Apache 还是会导致整个服务器崩溃。事实上,在这一点上,我几乎确信 Linux 是一个可怕的操作系统,不值得任何人花时间寻找负载下的稳定性。
我尝试过的事情:
只是强调一下:我不在乎 Apache 本身是否在负载下宕机,我只希望系统的其余部分保持稳定。当然,让 Apache 在短暂的密集负载后快速恢复会很棒,但一次一个步骤。
现在,我对人类如何能在这个时代设计一个操作系统而感到震惊(不允许一个系统组件使整个系统崩溃)实际上是不可能的 - 或者至少,非常难做。
请不要建议诸如 VM 或“购买更多 RAM”之类的东西。
在朋友的帮助下收集的更多信息: 当调用 cgroup oom 杀手时,进程挂起。这是调用跟踪:
[<ffffffff8104b94b>] ? prepare_to_wait+0x70/0x7b [<ffffffff810a9c73>] mem_cgroup_handle_oom+0xdf/0x180 [<ffffffff810a9559>] ? memcg_oom_wake_function+0x0/0x6d [<ffffffff810aa041>] __mem_cgroup_try_charge+0x32d/0x478 [<ffffffff810aac67>] mem_cgroup_charge_common+0x48/0x73 [<ffffffff81081c98>] ? __lru_cache_add+0x60/0x62 [<ffffffff810aadc3>] mem_cgroup_newpage_charge+0x3b/0x4a [<ffffffff8108ec38>] handle_mm_fault+0x305/0x8cf [<ffffffff813c6276>] ? 时间表+0x6ae/0x6fb [<ffffffff8101f568>] do_page_fault+0x214/0x22b [<ffffffff813c7e1f>] page_fault+0x1f/0x30
此时,apache memory cgroup 几乎死锁,并且在 syscalls 中烧 CPU(都有上面的调用跟踪)。这似乎是 cgroup 实现中的一个问题......
我不想这么说,但你似乎问错了问题。
这不是要阻止 Apache 关闭您的服务器,而是要让您的网络服务器每秒提供更多查询 - 足以让您没有问题。重新定义问题的一部分答案是限制 Apache,使其不会在高负载下崩溃。
对于第二部分,Apache 有一些你可以设置的限制——MaxClients是一个重要的配置。这限制了允许运行的孩子数量。如果您可以为长时间运行的进程(例如正在下载的大文件)减轻 Apache 的负载,那么这是 Apache 中能够为 PHP 提供服务的另一个插槽。如果文件下载必须由 PHP 层验证,他们仍然可以这样做,并将静态内容传回更优化的网络服务器,例如使用NginX sendfile
同时,在每次请求中分叉 Apache 以最慢的方式运行 PHP - 作为 CGI(无论您使用什么 apache MPM) - 也让机器花费大量时间不运行您的代码。mod_php 明显更加优化。
当 Apache 和 PHP 层得到适当优化时,PHP 可以处理大量流量。例如,昨天,即 2010 年 12 月 11 日,我运行的这对 PHP 服务器在 24 小时内完成了近 1900 万次点击,其中大部分是在上午 7 点到晚上 8 点的时间段内。
这里还有很多其他问题,以及其他关于优化 Apache 和 PHP 的文章,我认为您需要先阅读它们,然后再指责 Linux/Apache 和 PHP。
您可以尝试以下一些常规操作:
| 归档时间: |
|
| 查看次数: |
14528 次 |
| 最近记录: |