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,这完全解决了网站的缓慢问题.即使我能够解决这个问题,它花了我比我想要的更长的时间,我仍然觉得我基本上猜测导致网站运行缓慢的原因.这一切都引出了我的问题......
在只有 1GB RAM 的服务器上托管大量站点。您的内存利用率接近 100%,并且您拥有的数字可能是“备用”数字。每个进程的 RAM 使用量在服务请求的过程中可能并且将会激增。立即,您需要向该实例添加更多 RAM,更好的是,将一些站点移至另一台服务器上。
至于你的问题:
您从哪里得到网站变得“不活动”并且 Gunicorn 必须再次加载该网站的想法?那是垃圾。只要 Gunicorn 进程正在运行(即没有手动终止或由于站点上的错误而终止),它就会保持完全初始化并准备就绪,无论是一个小时还是一个月。
你在这里砍掉叶子,而没有触及根部。每个 Gunicorn 进程的内存使用情况没有任何异常。它需要RAM 才能运行。您的问题是试图在功能严重不足的服务器上运行太多。任何优化都救不了你。您需要更多 RAM 或更多服务器。可能两者都有。
不需要。同样,问题已经确定。事实上,从你发布的数字来看,已经很清楚了。
没有办法可靠地知道哪些进程正在被交换。它每秒都会发生变化,具体取决于哪些正在积极运行并需要更多 RAM,哪些处于不活动或根本不那么活跃。当您的服务器资源如此紧张时,它会花费一半的时间来确定接下来要处理哪个进程,特别是当它们都处于活动状态并争夺资源时。
是的。Gunicorn推荐2*核心+1。因此,在双核系统上,该值为 5;在四核上,为 9。但是,您无法在同一系统上为每个站点运行 5 个工作进程。您甚至无法可靠地为每个工作人员运行 1 个工作人员。
这取决于“事情”。但是,当多个站点托管在同一台服务器上时,这些服务器在规格方面就很糟糕。在像您这样的小型 VPS 实例上,尤其是只有 1GB RAM 的情况下,一个站点几乎是您的极限。两个,也许吧。
| 归档时间: |
|
| 查看次数: |
9929 次 |
| 最近记录: |