通过 mod_wsgi 运行 Django 时,我应该在 WSGIDaemonProcess 中指定多少个进程?

通过 mod_wsgi 运行 Django 时,我应该在 WSGIDaemonProcess 中指定多少个进程?

假设我有 2 个站点(Superuser 和 Serverfault)在一台机器上从它们自己的 Apache 虚拟主机运行。这两个站点由 Django 提供支持,并在带有 mod-wsgi 的 Apache 上运行。其中一个站点的典型配置文件如下所示:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

主机是一台运行 Ubuntu 的 Linux 机器,具有 4GB RAM。有人能建议我应该为我的 2 个站点指定上述进程数吗?我们假设它们与实际的 Superuser 和 Serverfault 站点具有相同的流量。

答案1

那么,有多少流量实际的 Superuser 和 Serverfault 网站有吗?如果假设没有足够的信息来让答案变得更容易,那么假设就没有多大用处……

最坏情况下的进程数应该是您希望站点能够处理的每秒请求数的峰值,除以如果所有这些请求都针对最慢的操作(即该操作的处理时间的倒数),一个进程可以处理的每秒请求数。根据您的请求/秒和时间测量的置信区间,添加您认为合适的任何模糊因子。

平均案例数相同,但您要将请求数/秒除以每项操作每秒请求数的加权平均值(权重是您预计会命中该特定操作的请求百分比)。同样,模糊因子很有用。

您可以在机器上运行的进程数的实际上限取决于每个进程占用的内存上限;启动一个进程,然后使用真实数据集(如果您只是使用玩具数据集进行测试,例如 50 或 100 行,那么如果您的某个操作检索并操作表中的每一行,那么当该表增长到 10,000 行时,它将不是一个很好的测量方法)对其运行各种占用大量内存的操作(通常是检索和处理大量数据的操作),以查看内存使用量会膨胀到多少。您可以使用脚本人为地限制每个进程的内存使用量,该脚本会收集达到特定内存使用量阈值的工作人员,但如果您将该阈值设置得太低,则可能会导致严重问题。

获得内存使用量数字后,您可以扣除一些内存用于系统开销(我自己喜欢 512MB),如果在同一台机器上运行其他进程(如数据库),则再扣除一大堆,然后再扣除一些以确保不会耗尽磁盘缓存空间(取决于磁盘工作集​​大小,但我还是建议不少于 512MB)。这是您除以每个进程的内存使用量以获得上限的内存量。

如果服务峰值负载所需的进程数大于机器上可容纳的进程数,则需要更多机器(或者在最简单的情况下,将数据库移动到另一台机器)。

以上就是我将数年的网站扩展经验浓缩到这篇小而简单的 SF 文章中。

答案2

沃姆布尔的回答很棒,尽管对于没有经验的人来说有点难以理解和应用。我想给出一些经验数字,以及“简单内容”与“电子商务”应用的比较。

关于设置不同用例及其 mod_wsgi 的适当配置,没有太多资料,所以我希望在这里使用一点散文是可以的。

A) CMS 网站和微网站

我们运营着多个客户网站,其中大多数主要是内容网站或微型网站,托管 Django CMS、一些自定义表单,有时还会使用 Celery 执行计划的后台任务。这些网站对资源的需求并不大,其中几个网站在单个 4 核 Intel Xeon 处理器和 32 GB RAM 上并行运行良好。以下是我们针对每个此类网站使用的配置:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

我指的是一台服务器上大约 40 个站点,其中大多数站点的 Staging 站点处于待机状态。使用 2 个进程(默认情况下每个进程有 15 个线程),站点运行良好,尽管它们分配服务器资源的能力有限。这种设置足够的原因可以用 (CMS) 应用程序的简单性质来证明:任何请求都不会花费超过几毫秒的时间来完成。Apache 将始终保持轻松,CPU 负载也是如此。

B)电子商务网站

我们做的更复杂的网站的特点是本地操作仍然计算成本低廉,但外部依赖关系(例如提供预订数据的 Web 服务)在交易时间方面成本高昂。带有外部请求的操作占用线程的时间更长,因此您需要更多线程来满足相同数量的用户(与上面的简单 CMS 网站相比)。更糟糕的是,当外部服务无法立即响应请求时,线程有时会被阻塞,有时会持续几秒钟。这可能会导致令人不快的副作用,即向同一服务发出请求的线程排队,直到所有可用的 mod_wsgi 线程都用完并被阻塞等待。

对于那些我们尝试使用6流程而没有看到太大差异的场景,我们最终12看到了性能和操作稳定性的无与伦比的提升:

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

一些简单的负载测试,包括 150 和 250 个并行用户,网站可以轻松处理,并保持良好的响应速度(而2使用进程时,网站无法同时处理 50 个用户)。 2 CPU 6 核 Intel Xeon 搭配 32 GB RAM 在该负载下运行,CPU 使用率远低于 25%,RAM 使用率也几乎保持在 25% 以下。 请注意,我们在这里只为单个网站使用专用机器,因此我们不会窃取其他网站可能需要的资源。

结论

使用更多进程是允许 Apache 使用可用系统资源与否之间的权衡。如果您想在“攻击”条件下保持稳定的服务器系统(不是网站!),请将进程数保持在较低水平。如果您希望 Apache 在需要时使用系统资源(CPU、RAM)帮助您,请选择更高的进程数。您可以达到的最高进程数的计算方式与上面接受的答案中概述的类似,最终受可用 CPU 功率和 RAM 的限制。

(PS:我保留ConfigurationDirectives 部分我枕头下的 modwsgi 项目 wiki 是 Apache 类背景阅读资料。另外,一定要了解并监控你的Apache 服务器的打开连接

相关内容