【问题标题】:Nginx scaling and bottleneck identification on an EC2 clusterEC2 集群上的 Nginx 扩展和瓶颈识别
【发布时间】:2012-01-30 14:16:55
【问题描述】:

我正在开发一个大型应用程序,我必须对其进行负载测试。它是一个基于 EC2 的集群,具有一个用于运行 PHP / NGinx 的应用程序的 HighCPU Ex.Large 实例。

这个应用程序负责从 Redis 服务器读取数据,该服务器持有一些 5k - 10k 键值,然后它做出响应并将数据记录到 mongoDB 服务器并回复给客户端。

每当我向应用服务器发送请求时,它会在大约 20 - 25 毫秒内完成所有计算,这太棒了。

我现在正在尝试做一些负载测试,并在我的笔记本电脑上运行一个基于 php 的应用程序来向服务器发送请求。成千上万的人在 20 - 30 秒内快速完成。在此加载期间,每当我在浏览器中打开应用程序 URL 时,它都会以大约 25 - 35 毫秒的执行时间进行回复,这再次很酷。所以我确信redis和mongo不会造成瓶颈。但是在加载过程中需要大约 25 秒才能得到响应。

高 CPU 前。大型实例具有 8 GB RAM 和 8 个内核。

此外,在负载测试期间,top 命令显示大约 4 - 6 个 php_cgi 进程消耗大约 15 - 20% 的 CPU。

我在 nginx 上有 50 个工作进程和 1024 个工作连接。

导致瓶颈的问题可能是什么?

如果这不起作用,我正在认真考虑迁移到带有嵌入式 Web 服务器和嵌入式缓存的整个 Java 应用程序。

更新 - 将 PHP_FCGI_CHILDREN 增加到 8 并将加载期间的响应时间减半

【问题讨论】:

    标签: php mongodb nginx amazon-ec2 redis


    【解决方案1】:

    50 个工作进程太多了,每个 CPU 核心只需要一个工作进程。使用更多的工作进程会调用进程间切换,会消耗很多时间。

    您现在可以做什么: 1. 将工作进程设置为最小值(每个 CPU 一个工作进程,例如,如果您有 4 个 cpu 单元,则为 4 个工作进程),但工作进程连接 - 设置为最大值(例如 10240)

    1. 通过 sysctl 调整 TCP 堆栈。如果您有很多连接,您可能会达到堆栈限制

    2. 从 nginx stub_status 模块获取统计信息(您可以使用 munin + nginx,它易于设置并为您提供了有关系统状态的足够信息)。

    3. 检查 nginx error.log 和系统消息日志是否有错误。

    4. 调整 nginx(减少连接时间和最大查询大小)。

    希望对你有帮助。

    【讨论】:

    • 谢谢,我刚刚将该工作进程编辑为 10。仍然没有太大的改进。我注意到的一件事是只有 5 个 php-cgi 进程在运行。 PHP_FCGI_CHILDREN 也设置为 5。您认为将其增加很多会有所帮助吗?考虑到我有 8 个核心
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2022-01-06
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多