排除Nginx + Gunicorn + Django堆栈上的站点缓慢

Bre*_*nor 19 django hosting nginx gunicorn

问题我有

我有一个问题,有些网站需要很长时间才能加载("长时间"我的意思是长达16秒).有时它们可​​能会完全超时,从而产生Nginx 504错误.通常,当网站超时时,我可以重新加载该网站,它会很快加载.我遇到问题的网站获得的流量非常低.我正在通过加载Django管理员索引页面来测试该站点,以便尝试消除因代码不佳而导致的任何缓慢.还应注意,此特定站点仅使用Django管理员,因为它只是员工的Intranet类型站点.

托管设置

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

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

$ 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
Run Code Online (Sandbox Code Playgroud)

为了尝试解决发生的事情,我写了一个快速的小脚本,打印出应用服务器上的内存使用情况.

示例打印出来的网站域名是匿名的:

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
Run Code Online (Sandbox Code Playgroud)

示例Gunicorn配置文件:

pidfile = '/var/run/gunicorn_example.com.pid'
proc_name = 'example.com'
workers = 1
bind = 'unix:/tmp/gunicorn_example.com.sock'
Run Code Online (Sandbox Code Playgroud)

示例Nginx配置:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,有很多内存被交换,所以为了解决我的问题,我在应用服务器上升级了ram,这完全解决了网站的缓慢问题.即使我能够解决这个问题,它花了我比我想要的更长的时间,我仍然觉得我基本上猜测导致网站运行缓慢的原因.这一切都引出了我的问题......

问题

  1. 如何判断低流量站点上的站点缓慢不是由于站点不活动导致站点变为非活动状态,导致Gunicorn必须在站点不活动后再次加载站点?是否有防止网站无效的设置?
  2. 好像我有些网站占用了太多内存.我可以使用哪些工具来减少网站使用的内存量?我应该使用一些Python分析工具吗?
  3. 为了确定堆栈中出现瓶颈的程度,需要采取哪些工具和步骤?
  4. 确定你的Gunicorn进程是否被交换或者是否有其他进程被交换的最佳方法是什么?
  5. 我托管的大多数网站都没有大量的流量,因此我只使用了一名Gunicorn工作人员.有没有更科学的方法来确定和调整你在一个网站上有多少Gunicorn工人?
  6. 在同一台服务器上托管多个站点时,有没有办法配置使用更少的内存?

Chr*_*att 4

在只有 1GB RAM 的服务器上托管大量站点。您的内存利用率接近 100%,并且您拥有的数字可能是“备用”数字。每个进程的 RAM 使用量在服务请求的过程中可能并且将会激增。立即,您需要向该实例添加更多 RAM,更好的是,将一些站点移至另一台服务器上。

至于你的问题:

  1. 您从哪里得到网站变得“不活动”并且 Gunicorn 必须再次加载该网站的想法?那是垃圾。只要 Gunicorn 进程正在运行(即没有手动终止或由于站点上的错误而终止),它就会保持完全初始化并准备就绪,无论是一个小时还是一个月。

  2. 你在这里砍掉叶子,而没有触及根部。每个 Gunicorn 进程的内存使用情况没有任何异常。它需要RAM 才能运行。您的问题是试图在功能严重不足的服务器上运行太多。任何优化都救不了你。您需要更多 RAM 或更多服务器。可能两者都有。

  3. 不需要。同样,问题已经确定。事实上,从你发布的数字来看,已经很清楚了。

  4. 没有办法可靠地知道哪些进程正在被交换。它每秒都会发生变化,具体取决于哪些正在积极运行并需要更多 RAM,哪些处于不活动或根本不那么活跃。当您的服务器资源如此紧张时,它会花费一半的时间来确定接下来要处理哪个进程,特别是当它们都处于活动状态并争夺资源时。

  5. 是的。Gunicorn推荐2*核心+1。因此,在双核系统上,该值为 5;在四核上,为 9。但是,您无法在同一系统上为每个站点运行 5 个工作进程。您甚至无法可靠地为每个工作人员运行 1 个工作人员。

  6. 这取决于“事情”。但是,当多个站点托管在同一台服务器上时,这些服务器在规格方面就很糟糕。在像您这样的小型 VPS 实例上,尤其是只有 1GB RAM 的情况下,一个站点几乎是您的极限。两个,也许吧。

  • 我猜你错过了这个......“尽管我能够解决这个问题,但我花了比我想要的更长的时间,而且我仍然觉得我基本上是在猜测是什么导致了网站缓慢。所有这引出了我的问题...“` 一般来说,我的问题是试图获取人们在解决 Django 堆栈缓慢问题时使用的步骤和工具的列表。关于你对5的回答,我认为Gunicorn的建议是多余的。我托管的网站只需一名工作人员即可正常运行,这取决于您的流量。我一直在寻找更科学的东西。 (2认同)