我遇到的问题
我遇到了一些网站需要很长时间才能加载的问题(“长时间”是指最多 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
为了尝试解决正在发生的事情,我编写了一个快速的小脚本,它可以打印出应用服务器上的内存使用情况。
使用匿名站点域打印的示例:
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 配置文件:
pidfile = '/var/run/gunicorn_example.com.pid'
proc_name = 'example.com'
workers = 1
bind = 'unix:/tmp/gunicorn_example.com.sock'
示例 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;
}
}
正如你所看到的,有很多内存被交换,所以为了解决我的问题,我升级了应用服务器上的内存,这完全解决了网站的缓慢问题。尽管我能够解决这个问题,但我花费的时间比我想要的要长得多,而且我仍然觉得我基本上是在猜测导致网站运行缓慢的原因。这一切都让我想到了我的问题......
问题
- 您如何判断低流量站点上的站点缓慢不是由于站点不活动导致站点变为不活动,然后导致 Gunicorn 在站点变为不活动后必须再次加载站点?是否有防止网站进入非活动状态的设置?
- 似乎我有一些网站占用了太多内存。我可以使用哪些工具来减少站点使用的内存量?我应该使用一些 Python 分析工具吗?
- 为了确定瓶颈发生在堆栈的哪个级别,需要采取哪些工具和步骤?
- 确定是您的 Gunicorn 进程正在被交换还是其他进程正在被交换的最佳方法是什么?
- 我托管的大多数网站都没有大量流量,所以我只使用了一个 Gunicorn 工作人员。是否有更科学的方法来确定和调整您在网站上拥有多少 Gunicorn 工人?
- 在同一台服务器上托管多个站点时,有没有办法配置东西以使用更少的内存?