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 / 问题 / 133561
Accepted
Rodrigo Sieiro
Rodrigo Sieiro
Asked: 2010-04-19 09:06:17 +0800 CST2010-04-19 09:06:17 +0800 CST 2010-04-19 09:06:17 +0800 CST

Apache 到达 MaxClients 并锁定服务器

  • 772

我目前有一个 Apache2 服务器在 OpenVZ VPS 上运行,mpm-prefork具有mod_php512M 真实/1024M 可爆 RAM(无交换)。运行一些测试后,我发现 Apache 获得的最大进程大小是 23M,所以我设置MaxClients为 25(23M x 25 = 575 MB,对我来说还可以)。我决定在我的服务器上运行一些负载测试,结果让我很困惑。

我ab在我的台式机上使用从 wordpress 博客请求主页。

当我运行ab24 个并发连接时,一切似乎都很好。当然,CPU 上升,可用 RAM 下降,结果是每个请求大约需要 2-3 秒的响应时间。

但是如果我运行ab25 个并发连接(我的服务器限制),Apache 会在几秒钟后挂起。它开始处理请求,然后停止响应,CPU 回到 100% 空闲并ab超时。Apache 日志说它达到了MaxClients.

发生这种情况时,Apache 将自己锁定在 25 个正在运行的进程中(如果我检查服务器状态,它们都处于“W”状态)并且只有在TimeOut设置后进程开始终止并且服务器再次开始响应(在我的情况下它已设置至 45)。

我的问题:这是预期的行为吗?为什么 Apache 在到达时就死掉了MaxClients?如果它适用于 24 个连接,那么它不应该适用于 25 个连接,只是需要更多的时间来响应每个请求并将其余的排队?

ab对我来说,任何运行的孩子都可以通过设置与服务器的并发连接单独杀死网络服务器,这听起来有点奇怪MaxClients。

apache-2.2 timeout openvz mpm-prefork
  • 2 2 个回答
  • 14029 Views

2 个回答

  • Voted
  1. Best Answer
    Rodrigo Sieiro
    2010-04-19T12:49:50+08:002010-04-19T12:49:50+08:00

    哈!我终于自己发现了问题。它与编程比服务器管理员更相关,但我还是决定把答案放在这里,因为通过搜索谷歌我发现我不是唯一一个遇到这种问题的人(而且由于 Apache 挂起,第一个猜测是有问题与服务器)。

    问题不在于 Apache,而在于我的 Wordpress。更具体地说是我的主题。我正在使用一个名为 Lightworld 的主题,它支持将图像添加到博客标题。为此,它使用 PHP 的函数检查图像大小getimagesize()。由于此函数打开另一个与服务器的 http 连接以获取图像,因此每个请求ab都在 PHP 内部创建另一个请求。由于我正在使用我所有的服务器可用插槽,这些 PHP 请求被放入队列中,但 Apache 永远无法访问它们,因为它的所有进程都被原始请求锁定,等待一个插槽来完成 PHP 内部请求。

    基本上,PHP 将我的服务器置于死锁状态,而 Apache 只会在这些连接超时等待它们的“子”请求后才能开始正常工作。

    从我的主题中删除此功能后,现在我可以在ab我的服务器上使用我想要的任意数量的并发连接,并且 Apache 正在按预期对它们进行排队。

    • 18
  2. deleted
    2010-04-19T12:10:31+08:002010-04-19T12:10:31+08:00

    这里发生的是您有 25 个线程能够接受连接,并且您正在发送 26 个并发请求。最后一个请求位于套接字队列中,具体取决于积压的大小。

    第二个问题是,无论您运行什么需要 2-3 秒,都需要足够长的时间来响应 25 个并发连接正在减慢它。sleep(1) 可能有效,但是,在您从 mysql 进行文件锁定或表锁定的情况下,每个并行请求可能会在完成之前等待,直到它们达到 45 秒超时。

    对于加载了 mod_php 和任何模块的 apache 进程来说,23mb 听起来很小,因此,我怀疑您可能会看到这些 apache 进程在您的应用程序运行时占用更多内存。你不能真正用 MaxClients 和这样的内存来做数学......它会有点接近,但是,你永远不会知道。

    www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
    www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start
    

    有一台机器,56M和49M进程。

    另一台机器:

    www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
    www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start
    

    另一台机器:

    www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
    www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
    

    因此,内存使用非常依赖于任务、加载了哪些模块等。在最后两个中,我相信我们已经禁用了 pdo 和 pdo_mysql ,因为该应用程序不使用它们。

    真正的问题是,你在做什么需要 3 秒?在当今世界,这是永恒的,被认为是“阻塞”应用程序。Apache 通常不会死掉,但是会将这些线程留在积压队列中,直到它可以为它们提供服务或等待请求超时。我相信您的应用程序可能导致 apache 超时。在只包含 phpinfo(); 的页面上尝试 看看结果是否相同。

    • 2

相关问题

  • 在您分发的应用程序中使用 Apache HTTPD 运行 SSL 的最佳方式是什么?

  • 阿帕奇的替代品

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

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

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

    • 30 个回答
  • Marko Smith

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

    • 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
    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