Nginx + uWSGI + Django的性能卡在100rq / s

我已经在CentOS 6 x64(3.06GHz i3 540,4GB)上configuration了uWSGI和Django,它应该很容易处理2500 rq / s,但是当我运行abtesting(ab -n 1000 -c 100)时,性能在92-100 RQ /秒。

Nginx: user nginx; worker_processes 2; events { worker_connections 2048; use epoll; } uWSGI: Emperor /usr/sbin/uwsgi --master --no-orphans --pythonpath /var/python --emperor /var/python/*/uwsgi.ini [uwsgi] socket = 127.0.0.2:3031 master = true processes = 5 env = DJANGO_SETTINGS_MODULE=x.settings env = HTTPS=on module = django.core.handlers.wsgi:WSGIHandler() disable-logging = true catch-exceptions = false post-buffering = 8192 harakiri = 30 harakiri-verbose = true vacuum = true listen = 500 optimize = 2 sysclt changes: # Increase TCP max buffer size setable using setsockopt() net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_max_syn_backlog = 5000 net.ipv4.tcp_window_scaling = 1 net.core.somaxconn = 2048 # Avoid a smurf attack net.ipv4.icmp_echo_ignore_broadcasts = 1 # Optimization for port usefor LBs # Increase system file descriptor limit fs.file-max = 65535 

我做了sysctl -p来启用更改。

空闲服务器信息:

 top - 13:34:58 up 102 days, 18:35, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3983068k total, 2125088k used, 1857980k free, 262528k buffers Swap: 2104504k total, 0k used, 2104504k free, 606996k cached free -m total used free shared buffers cached Mem: 3889 2075 1814 0 256 592 -/+ buffers/cache: 1226 2663 Swap: 2055 0 2055 **During the test:** top - 13:45:21 up 102 days, 18:46, 1 user, load average: 3.73, 1.51, 0.58 Tasks: 122 total, 8 running, 114 sleeping, 0 stopped, 0 zombie Cpu(s): 93.5%us, 5.2%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.1%hi, 1.1%si, 0.0%st Mem: 3983068k total, 2127564k used, 1855504k free, 262580k buffers Swap: 2104504k total, 0k used, 2104504k free, 608760k cached free -m total used free shared buffers cached Mem: 3889 2125 1763 0 256 595 -/+ buffers/cache: 1274 2615 Swap: 2055 0 2055 iotop 30141 be/4 nginx 0.00 B/s 7.78 K/s 0.00 % 0.00 % nginx: wo~er process 

瓶颈在哪里? 或者我做错了什么?

显然,你使用的任何任务是CPU绑定。 你可能要考虑分析你的Django应用程序,以找出你的应用程序滞后的地方。 有几种针对Python WSGI应用程序的分析解决scheme(尽pipeDjango并不严格遵守WSGI,特别是对于中间件,所以YMMV):

  1. lineman (无耻的插件,这是我的项目!)
  2. keas.profile
  3. repoze.profile
  4. 推土机 (但你需要使用0.2 alpha)

这将使您能够确定应用程序中的瓶颈 – 即您的应用程序在哪些function上花费大部分时间?

另一个要检查的是,uwsgi / nginx需要多长时间才能提交请求? 请求正在排队吗? 平均请求从开始到结束需要多长时间? 另外,更重要的是,你的基准是什么? 尝试与1个并发用户运行相同的testing来找出这一点。 然后逐渐增加用户数量,直到用户数量达到峰值。

有了这些信息,就可以开始build立一个模式 – 这是加载testing的关键!

祝你好运!