首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >排除Nginx + Gunicorn + Django堆栈上的站点速度减慢故障

排除Nginx + Gunicorn + Django堆栈上的站点速度减慢故障
EN

Stack Overflow用户
提问于 2012-05-02 01:19:02
回答 3查看 12.6K关注 0票数 20

我遇到的问题

我遇到了一个问题,一些网站需要很长时间才能加载(“很长时间”,我指的是长达16秒)。有时它们可能会完全超时,这会生成一个Nginx 504错误。通常,当站点超时时,我可以重新加载该站点,它会加载得很快。我遇到问题的网站的访问量非常低。我正在通过加载Django管理索引页面来测试网站,以便尝试消除由于糟糕的代码可能导致的任何缓慢。还应该注意的是,这个特定的站点只使用Django管理员,因为它是仅供员工使用的内部网类型的站点。

主机设置

我托管的所有网站都在两个Rackspace云服务器上。第一个服务器是我的应用服务器,它有1024MB的RAM,第二个服务器是我的数据库服务器,它有2048MB的RAM。应用服务器使用Nginx为每个站点提供服务,Nginx为每个站点的Django Gunicorn工作者提供所有静态文件和代理所有其他内容。

当查看数据库服务器的RAM和CPU负载时,数据库服务器上似乎一切正常。

代码语言:javascript
复制
$ free -m
             total       used       free     shared    buffers     cached
Mem:          1999       1597        402          0        200       1007
-/+ buffers/cache:        389       1610
Swap:         4094          0       4094


Top shows a CPU load average of: 0.00, 0.01, 0.05

为了尝试解决问题,我编写了一个快速的小script,它打印出应用服务器上的内存使用情况。

将站点域匿名的示例打印出来:

代码语言:javascript
复制
Celery:     23 MB
Gunicorn:  566 MB
Nginx:       8 MB
Redis:     684 KB
Other:      73 MB

             total       used       free     shared    buffers     cached
Mem:           993        906         87          0         19         62
-/+ buffers/cache:        824        169
Swap:         2047        828       1218

Gunicorn memory usage by webste:
site01.example.com    31 MB
site02.example.com    19 MB
site03.example.com     7 MB
site04.example.com     9 MB
site05.example.com    47 MB
site06.example.com    25 MB
site07.example.com    14 MB
site08.example.com    18 MB
site09.example.com    27 MB
site10.example.com    15 MB
site11.example.com    14 MB
site12.example.com     7 MB
site13.example.com    18 MB
site14.example.com    18 MB
site15.example.com    10 MB
site16.example.com    25 MB
site17.example.com    13 MB
site18.example.com    18 MB
site19.example.com    37 MB
site20.example.com    30 MB
site21.example.com    23 MB
site22.example.com    28 MB
site23.example.com    80 MB
site24.example.com    15 MB
site25.example.com     5 MB

示例Gunicorn配置文件:

代码语言:javascript
复制
pidfile = '/var/run/gunicorn_example.com.pid'
proc_name = 'example.com'
workers = 1
bind = 'unix:/tmp/gunicorn_example.com.sock'

Nginx配置示例:

代码语言:javascript
复制
upstream example_app_server {
    server unix:/tmp/gunicorn_example.com.sock fail_timeout=0;
}

server {

    listen       80;
    server_name  example.com;
    access_log   /var/log/nginx/example.com.access.log;
    error_log    /var/log/nginx/example.com.error.log;

    location = /favicon.ico {
        return  404;
    }

    location  /static/ {
        root  /srv/sites/example/;
    }

    location  /media/ {
        root  /srv/sites/example/;
    }

    location  / {
        proxy_pass            http://example_app_server;
        proxy_redirect        off;
        proxy_set_header      Host             $host;
        proxy_set_header      X-Real-IP        $remote_addr;
        proxy_set_header      X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size  10m;
    }

}

正如你所看到的,有大量的内存被交换,所以为了解决我的问题,我升级了应用服务器上的ram,这完全解决了站点的缓慢问题。尽管我能够解决这个问题,但我花的时间比我想象的要长得多,我仍然觉得我基本上是在猜测是什么导致了网站速度变慢。所有这些都引出了我的问题……

问题

  1. 如何判断低流量站点上的站点速度缓慢不是由站点不活动引起的,站点不活动会导致Gunicorn在站点不活动后再次加载站点?是否有阻止站点变为非活动状态的设置?
  2. 我似乎有一些站点占用了太多内存。我可以使用哪些工具来减少站点的内存使用量?我应该使用一些Python分析工具吗? Gunicorn有哪些工具和步骤可以用来确定在堆栈的哪一层出现瓶颈呢? occurring?
  3. What是确定是你的Gunicorn进程被交换了,还是其他进程在获取我托管的站点的swapped?
  4. Most时没有获得大量的流量,所以我只使用了一个
  5. 。有没有更科学的方法来确定和调整一个站点上有多少个Gunicorn工作进程?
  6. 在同一台服务器上托管多个站点时,有没有办法将其配置为使用更少的内存?
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10401513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档