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 / 问题 / 537588
Accepted
Halfgaar
Halfgaar
Asked: 2013-09-10 11:53:12 +0800 CST2013-09-10 11:53:12 +0800 CST 2013-09-10 11:53:12 +0800 CST

带有 nginx 代理的 Apache+mod_wsgi 上的 Python Django 站点:性能波动很大

  • 772

我有一个 Ubuntu 10.04 机器,使用 mod_wsgi 运行几十个 Python Django 站点(嵌入式模式;如果配置正确,则为更快的模式)。性能波动很大。有时很快,有时延迟几秒钟。吸烟图到处都是。

最近,我还为静态内容添加了一个 nginx 代理,希望它可以解决性能波动很大的问题。但是,即使它显着减少了 Apache 必须处理的请求数量,它也无助于解决主要问题。

在运行 htop 的同时点击网站时,可以看到有时请求几乎是即时的,而有时它会导致 Apache 在几秒钟内消耗 100% CPU。我真不明白这种波动是从哪里来的。

我已经为 Apache 配置了 mpm_worker,如下所示:

StartServers          1
MinSpareThreads      50
MaxSpareThreads      50
ThreadLimit          64
ThreadsPerChild      50
MaxClients           50
ServerLimit          1
MaxRequestsPerChild  0
MaxMemFree           2048

1 台服务器,50 个线程,最多 50 个客户端。穆宁和apache2ctl -t两者都显示出始终如一的工人存在;它们不会一直被破坏和创造。然而,它的行为就是这样。

这告诉我,一旦创建了子解释器,它应该保留在内存中,但似乎站点必须一直重新加载。

我还有一个 nginx+gunicorn 盒子,它的表现相当不错。我真的很想知道为什么 Apache 如此随机。

这是一个虚拟主机配置:

<VirtualHost *:81>
    ServerAdmin [email protected]
    ServerName example.com

    DocumentRoot /srv/http/site/bla

    Alias /static/ /srv/http/site/static
    Alias /media/ /srv/http/site/media
    WSGIScriptAlias / /srv/http/site/passenger_wsgi.py

    <Directory />
            AllowOverride None
    </Directory>

    <Directory /srv/http/site>
            Options -Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

  • Ubuntu 10.04
  • 阿帕奇 2.2.14
  • mod_wsgi 2.8
  • nginx 0.7.65

编辑:我在站点的 settings.py 文件中放置了一些代码,该站点在加载时将日期写入 tmp 文件。我现在可以看到该站点并非一直随机重新加载,因此 Apache 必须将其保存在内存中。所以,这很好,除了它不会让我更接近答案......

编辑:我刚刚发现一个可能也与此有关的错误:

  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)

  File "/usr/lib/python2.6/subprocess.py", line 1049, in _execute_child
    self.pid = os.fork()

OSError: [Errno 12] Cannot allocate memory

服务器有 600 个 2000 MB 可用空间,应该足够了。Apache 或 WSGI 的某个地方是否设置了限制?

apache-2.2
  • 2 2 个回答
  • 1040 Views

2 个回答

  • Voted
  1. Graham Dumpleton
    2013-09-10T16:41:28+08:002013-09-10T16:41:28+08:00

    您是否尝试过使用 New Relic 来尝试确定它是否是您的 Web 应用程序中的问题?提供免费层级和初始完整试用版。它可以为您提供的概述:

    • http://lanyrd.com/2012/pycon/spcdg/

    如果使用的后端服务的 Web 应用程序的特定问题没有作为问题突出,WSGI 服务器容量分析报告可能会显示一些内容,这会告诉您是否正在耗尽容量。它还可以告诉您是否过度配置和浪费资源,这实际上经常发生。

    • http://blog.newrelic.com/2012/09/11/introducing-capacity-analysis-for-python/

    顺便说一句,一般来说,我建议不要在一个进程中使用 50 个请求线程。你最好使用大约 5 个线程和多个进程。究竟什么是最好的确实取决于具体的应用程序,它是否在做大量的 CPU 密集型工作,以及它必须处理多少长时间运行的请求。是否通过同一个 Apache 提供大量静态文件也会对其产生影响,mod_wsgi 的守护进程模式甚至可能是一个更好的整体解决方案。

    您还使用了一个非常旧的 mod_wsgi 版本,尽管不相信这会导致问题。

    最后,为了避免 Python 的某些第三方 C 扩展模块出现问题,如果这是该服务器上唯一的 WSGI 应用程序,请设置:

    WSGIApplicationGroup %{GLOBAL}
    
    • 2
  2. Best Answer
    Halfgaar
    2013-09-13T03:42:16+08:002013-09-13T03:42:16+08:00

    我修好了它。我将所有生产站点转换为使用它们自己的进程(以及所有开发站点都在一个进程中),以守护程序模式。吸烟图现在好多了。性能稳定。

    这仍然让我对为什么嵌入式模式会出现这些问题一无所知,因为据我所知,我没有进程创建/销毁,但至少我有一个更好的运行服务器。

    编辑:

    作为 apache 站点配置的示例:

    WSGIDaemonProcess mysite12 processes=1 threads=10 display-name=%{GROUP}
    WSGIProcessGroup mysite12
    

    然后对于低优先级站点,我将其放入wsgi.conf:

    WSGIDaemonProcess developmentsites processes=1 threads=15 display-name=%{GROUP}
    

    然后在 apache conf 中:

    WSGIProcessGroup developmentsites
    

    看看区别(也是因为nginx代理):

    在此处输入图像描述

    • 2

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

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

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

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +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