【问题标题】:Why Apache spawns too much processes?为什么 Apache 产生了太多的进程?
【发布时间】:2021-05-05 22:23:07
【问题描述】:

我的 LAMP 服务器上有一个 WordPress 博客。我必须在短时间内向 WordPress API 发出 20.000 个 POST 请求才能创建帖子(我从其他 CMS 迁移到 WordPress)。

为此,我运行了我的迁移脚本,它需要点击 https://example.com/wp-json/wp/v2/posts 端点 20.000 次。大约 1000 个请求后,我的服务器速度变慢,平均负载达到 15。当我检查top 时,我得到的是:

 5827 www-data  20   0  943612  73000  33424 S  4.7  3.6   0:24.62 apache2
 5828 www-data  20   0  943960  79112  38768 S  4.0  3.9   0:16.26 apache2
 5861 www-data  20   0  944280  86568  45968 S  4.0  4.3   0:06.47 apache2
 6047 www-data  20   0  943692  77288  37292 S  3.7  3.8   0:00.46 apache2
 5835 www-data  20   0  942212  85760  47096 S  3.3  4.2   0:05.01 apache2
27086 mysql     20   0 1208472 187212  21124 S  3.0  9.3  18:52.19 mysqld
 5863 www-data  20   0  944452 103896  64936 S  2.7  5.1   0:06.97 apache2
 5826 www-data  20   0  942604 102272  63264 S  2.0  5.1   0:06.66 apache2
 5854 www-data  20   0  944252  84776  46180 S  1.3  4.2   0:06.96 apache2
 5967 www-data  20   0  941856  82388  44128 S  1.3  4.1   0:03.98 apache2
 6046 www-data  20   0  943692  77476  37356 S  1.3  3.8   0:00.51 apache2
 5860 www-data  20   0  942224  84668  46048 S  0.7  4.2   0:06.93 apache2
 6059 www-data  20   0  941644  75192  37164 S  0.7  3.7   0:00.20 apache2

当我停止迁移脚本时,这些进程仍在运行并且高服务器负载保持在相同的值(大约15)。唯一有帮助的是sudo apachectl restart。但后来我重置了 apache2,再次运行迁移脚本,然后在 1000 个请求后负载再次变高。

【问题讨论】:

    标签: php wordpress apache apache2


    【解决方案1】:

    你有这么多进程,因为这就是 apache 被告知的行为方式。 @Inc0 提供的链接将为您提供一些如何限制使用量的线索。为了更快的恢复时间,您应该设置一个较低的 MaxSpareServers。

    平均负载达到 15

    如果您的负载高于 CPU 线程数,那么内核将开始抢占进程 - 这意味着您的吞吐量将下降。多少,我真的不能说。但是,如果这是一次性的练习,您准备花多少时间和精力让它运行得更快,而不仅仅是继续加载数据/降低效率?

    我运行我的迁移脚本

    这是多线程/使用 curl_multi-* 函数吗?我不希望单线程操作会导致如此多的持久负载。你会从 mod_status 中得到很多关于发生了什么的线索。无论如何,您似乎没有在您的客户端中使用keepalive(或在您的服务器上禁用它)。在两端启用此功能应该会对负载/性能产生重大影响。

    我从其他 CMS 迁移到 WordPress

    这就是 XY 问题。

    Wordpress 非常缓慢且资源繁重。您最大的胜利将来自绕过 Wordpress 并将数据直接写入数据库。第二个最好的方法是使用 Wordpress 中的内置批量导入功能(它也导出,因此您可以看到数据结构)。作为 Wordpress,还有一些第三方插件可以使用(但请在完成导入后卸载插件。

    【讨论】:

      【解决方案2】:

      Apache 生成进程来处理请求:假设您使用的是 MPM,您可以按照官方文档对其进行调整。(https://httpd.apache.org/docs/2.4/mod/mpm_common.html#maxrequestworkers) 访问日志和错误日志可能会帮助您了解发生了什么。

      问题可能出在其他地方,例如在数据库上:可能它没有调整为处理 WP 生成的负载以存储您要保存的信息以调用 API。

      此外,您可以尝试降低脚本调用 api 的频率,而不是调整 apache/mysql/mariadb/postgreSQL。 你可以试试调低

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2013-08-11
        • 2013-05-22
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多