6

我刚刚从 apache prefork 转移到 worker 并开始在守护进程模式下运行 mod_wsgi。到现在为止还挺好。我还没有遇到最大负载,但服务器似乎更加一致,我们没有看到随机请求需要 2 分钟等待 mod_wsgi 响应。内存占用已从 3.5G 变为 1G。这太棒了。我们在具有 6G 内存的单个 VPS 上运行。该服务器上运行着一个 Django 应用程序以及一个内存缓存实例,我们为其分配了 1G 内存。我们有一个单独的 MySql 服务器。

我们的应用程序很庞大,当然可以优化。我们现在正在使用 NewRelic 对一些运行速度较慢的页面进行故障排除。我已经阅读了很多关于优化 mod_wsgi/apache 的内容,但是和其他人一样,我仍然有一些问题。

我们的平均应用程序页面加载时间为 650-750 毫秒。我们的很多页面都在 200 毫秒范围内,但我们有一些狗需要 2-5 秒才能加载。我们在正常加载时间大约 15-20 个请求/秒,在可能持续 30-60 分钟的高峰时间获得 30-40 个请求/秒。

这是我的 apache 配置,正在运行 worker mpm。

StartServers        10
MaxClients         400
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

我开始使用默认值(StatServers=2 和 MaxClients=150),但我们的网站在最小负载下速度变慢了。我猜随着请求的到来,启动服务器需要很长时间。我们从 s3 提供 90% 的媒体。其他 10% 是通过我们的 https 页面上的 Apache 提供的,或者有人懒惰地指向我们的本地服务器。在标称负载下,最终创建了 15 个工作进程,所以我想我应该只设置 StartServers=15?使用这种配置,我假设我有 15 个工作进程正在运行(我可以用 NewRelic 确认),每个进程有 25 个线程(我不知道如何确认,猜测为 400/15)。

我的 apache/mod_wsgi 指令如下所示:

<VirtualHost *:80>
    # Some stuff
    WSGIDaemonProcess app1 user=http group=http processes=10 threads=20
    WSGIProcessGroup app1
    WSGIApplicationGroup app1
    WSGIScriptAlias / /path/to/django.wsgi
    WSGIImportScript /path/to/django.wsgi process-group=app1 application-group=app1    
    # Some more stuff    
</VirtualHost>

<VirtualHost *:443>
    # Some stuff
    WSGIDaemonProcess app1-ssl user=http group=http processes=2 threads=20
    WSGIProcessGroup app1-ssl
    WSGIApplicationGroup app1-ssl
    WSGIScriptAlias / /path/to/django.wsgi
    WSGIImportScript /path/to/django.wsgi process-group=app1-ssl application-group=app1-ssl
    # Some more stuff
</VirtualHost>

在我的网站的 ssl 端有一个不同的 WSGIDaemonProcess/WSGIProcessGroup,好吧,那感觉根本不对。我 100% 确定我在这里搞砸了一些东西。更重要的是,我为 mod_wsgi 分配了 200+40 个线程来处理来自 Apache 的请求,留下 160 个线程来处理需要传递的任何媒体(通过 ssl 或不指向 s3 的懒惰)。

因此,鉴于我们上面的应用程序负载,任何人都可以建议我可以提高网站性能的方法吗?我是否正确处理了 ssl/mod_wsgi 指令?格雷厄姆在哪里?;)

4

1 回答 1

1

见讨论:

https://groups.google.com/forum/?fromgroups=#!topic/modwsgi/Hakr6FjRVQM

于 2012-10-05T11:42:36.180 回答