Nginx

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

  • November 23, 2011

我在 CentOS 6 x64 (3.06GHz i3 540, 4GB) 上用 uWSGI 和 Django 配置了 Nginx,它應該可以輕鬆處理 2500 rq/s 但是當我執行 ab test (ab -n 1000 -c 100) 時性能停止在 92 - 100 rq/s。

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 應用程序有幾種分析解決方案(儘管 Django 並不嚴格符合 WSGI,尤其是中間件,所以 YMMV):

  1. 邊裁(不要臉的外掛,這是我的項目!)
  2. keas.profile
  3. 休息.profile
  4. 推土機(但你需要使用 0.2 alpha)

這將使您能夠辨識應用程序中的瓶頸——即,您的應用程序將大部分時間花在哪些功能上?

要檢查的另一件事是,uwsgi/nginx 需要多長時間才能收到請求?請求是否正在排隊?平均請求從開始到結束需要多長時間?另外,更重要的是,你的基線是什麼?嘗試對 1 個並髮使用者執行相同的測試以找出答案。然後,逐漸增加使用者數量,直到您可以確定使用者數量達到峰值的位置。

有了這些資訊,您就可以開始建立一個模式——這就是負載測試的關鍵!

祝你好運!

引用自:https://serverfault.com/questions/334026