تحليل أداء خوادم WSGI: إعادة uWSGI إلى مكانه

في الأسبوع الماضي ، نُشرت ترجمة لمقال يبلغ من العمر عامين ، تحليل أداء خوادم WSGI: الجزء الثاني ، حيث حُرم uWSGI من الشهرة بشكل غير مستحق.


من الملح إعادة فحص الاختبارات!



الأهداف


لقد كنت أستخدم uWSGI لفترة طويلة ، وأريد أن أثبت أنه ليس سيئًا كما هو موضح في اختبارات 2016.
في البداية ، أردت فقط إعادة إنتاج الاختبارات ، ومعرفة ما هو الخطأ في uWSGI.
لا يحتوي الرمز على إصدارات من الحزم والوحدات المستخدمة.


لذلك ، لإجراء الاختبارات والحصول على نتائج مماثلة - لا يعمل.
التالي هو سعيي لإجراء الاختبارات ومقارنة النتائج على الرسوم البيانية.
بناء على طلب القراء ، تمت إضافة وحدة NginX.


خطوات


wrk 4.1.0


البحث عن المواصفات ، التصحيح ، جمع
تمت إضافة المعلومات إلى readme.rd.


إحصائيات عامل الميناء


لمدة عامين ، تغير ناتج الإحصائيات.


تمت إضافة عمود NAME ثانٍ ، مما أدى إلى كسر محلل الإحصائيات.


حتى لا نواجه مشكلة مماثلة خلال عامين ، سنستخدم المخرجات المنسقة:


 - docker stats > "$BASE/$1.$2.stats" & + docker stats --format "{{.CPUPerc}} {{.MemUsage}}" > "$BASE/$1.$2.stats" & 

وبناءً على ذلك ، سنبسط رمز المحلل اللغوي قليلاً.


ديبيان


الآن أحدث صورة دبيان هي الإصدار 9.5 ، اعرضها في ملف Dokerfile:


 - FROM debian + FROM debian:9.5 

في أبريل 2016 ، كان الإصدار الأخير 8.4


ومع ذلك ، ظل Apache كما هو تقريبًا: الآن إصدار Apache هو 2.4.25 ، وفي 2016 كان Apache 2.4.10.


الكرز اعصار üsgi gunicorn bjoern meinheld mod_wsgi


لا معنى للقول أن الوحدات قد تغيرت.
حدد الإصدار الحالي:


 - RUN pip install cherrypy tornado uwsgi gunicorn bjoern meinheld mod_wsgi + RUN pip install cherrypy==17.4.0 \ + uwsgi==2.0.17.1 \ + gunicorn==19.9.0 \ + bjoern=2.2.3 \ + meinheld==0.6.1 \ + mod_wsgi==4.6.5 

ماذا يفعل الإعصار هناك ، أين إطلاق ملف wsgi لإطلاق الإعصار؟ احذف القطعة الأثرية.
لن يكون من السيء وضع هذا في ملف متطلبات منفصل. لكن الآن دعنا نتركه بهذه الطريقة.


cherrypy -> cheroot.wsgi


كما هو موضح أعلاه ، الإصدار الحالي هو 17.4.0.
في أبريل 2016 ، ربما تم استخدام الإصدار v5.1.0.
وفي عام 2017 ، حدثت تغييرات في الإصدار 9.0 ، مما أثر على استيراد الخادم:


 - from cherrypy import wsgiserver - server = wsgiserver.CherryPyWSGIServer( + from cheroot.wsgi import Server as WSGIServer + server = WSGIServer( 

أخطاء مأخذ التوصيل: اقرأ 100500


بعد التغييرات الموضحة أعلاه ، تم إطلاق أول اختبار كامل.
كانت النتائج جيدة: üsgi لم تنتج 3 ... 200 ، ولكن 7500 ... 5000 طلب في الثانية.
ولكن بعد فحص مفصل للرسوم البيانية التي تم الحصول عليها ، اتضح أن wrk اكتشف جميع الإجابات كأخطاء في القراءة.


بعد التحقق من عشرات مفاتيح بدء التشغيل uwsgi ، اتضح أنه لم تكن هناك أخطاء عند تشغيل http1.1: --http-keepalive و --http11-socket .
علاوة على ذلك ، يعطي الأول 7500 ... 5000 استفسار في الثانية ، والثاني ثابت 29 ألف!


ما الذي تغير في uWSGI في الوقت الحالي


من المرجح أنه في أغسطس 2016 تم استخدام إصدار uWSGI 2.0.12 (20151230).
بعد مايو ، تم إصدار uWSGI 2.0.13 .


كان هذا حدثًا مهمًا ، لكنه لم يحل مشكلة الأداء وفقًا لإصدار wrk حتى 2018 ، مع إصدار uWSGI 2.0.16 :


دعم HTTP / 1.1 المنفذ الخلفي (--http11-socket) من 2.1

لهذا السبب تمت التوصية باستخدام UWSGI مع NginX ،
ولماذا هذا مهم في إطار المقال يمكن فهمه من تذكرة 2012 هذه.


فلماذا كانت هذه النتائج


جربت الإصدارات التالية:


  • 2.0.12 لدبيان 8.4 ، على التسعة لن يكون بسبب فتح جديد.
  • 2.0.13 ... 2.0.17 لدبيان 8.4 و 9.5

لكنني لم أستطع الحصول على نتائج سيئة مثل 3 ... 200 استفسار في الثانية.
تم لفت الانتباه إلى خط تشغيل التطبيق:


uwsgi --http: 9808 - python2plugin - wsgi-file app.py - عمليات ...

يشير تحديد مكون إضافي إلى تثبيت uwsgi من المستودع ، وليس نقطة.
قد يشير هذا إلى أن المؤلف ليس لديه الخبرة اللازمة مع هذا المكدس.


لذلك ، أعترف بالعديد من الاحتمالات:


  • تم اختبار كل خادم من خوادم uwsgi بشكل منفصل في أوقات مختلفة.
  • كان هناك بعض التضارب بين إصدار نظام uwsgi وتم تثبيته عبر النقطة.
  • نسخة wrk للمؤلف في عام 2016 ، لديها بعض الميزات للعمل على http1.0
  • بدأ uwsgi بمجموعة مختلفة من الخيارات
  • المادة المخصصة ، والأرقام من السقف.

ما هي النتائج الآن


uWSGI على الرسوم البيانية هي عدة:
تم تشغيل أول اثنين من uWSGI و uWSGIbase (الإصدار 2.0.17.1) في اختبار طويل ، مع منافسيهما ، بالمعلمات التالية:
--http11 :9808 --processes 5 --threads 2 --enable-threads .
--http11 :9808 --processes 5 .
كما أظهرت الممارسة ، لا يوجد فرق نوعي لاختبار تطبيق وهمي.


وبشكل منفصل ، إصدار uWSGI 2016:
uWSGI-v2.0.12th-old و uWSGI-v2.0.12nt-old - على التوالي v2.0.12 مع وبدون خيوط في حاوية دبيان 8.4.
--http :9808 --http-keepalive --processes 5 --threads 2 --enable-threads
--http :9808 --http-keepalive --processes 5


RPS 2018 ALL
تحتل uWSGI المركز الثاني ، دون تقليل النتائج مع زيادة الحمل.
في المركز الثالث هي وحدة NginX.


RPS 2018 LOW
في الجزء المنخفض ، فإن uWSGI-v2.0.12 هو الأفضل ، حتى مع زيادة الحمل.


LATENCIES 2018 ALL
هنا نرى كيف لم تظهر الوحدة أفضل جانب لها.


LATENCIES 2018 LOW
uWSGI و CherryPy فائزان بلا شك في الكمون.



هذه الصورة شبيهة بعام 2016.



هنا نرى كيف أكلت UWSGI القديمة الذاكرة مع زيادة الحمل.
كما تزيد الوحدة خطيًا من استهلاك الذاكرة.



و uWSGI الجديدة ، gunicorn ، mod_wsgi - بثقة "حافظوا على البار" ، وهذا يقول الكثير.



تبدأ UWSGIs القديمة في اكتساب الأخطاء بشكل حاد بعد 300 اتصال مفتوح.



الوحدة و CherryPy - لا توجد أخطاء!
يبدأ Bjoern بالتبرع بـ 1000 مركب.
ولكن مع غرابة uWSGI الجديدة ، بدءًا من 200 اتصال ، حصلنا على 50 خطأ ، ولم يعد الرقم يزيد. تتطلب هذه النقطة دراسة مفصلة.


يتم جمع جميع البيانات هنا.
يمكن رؤية جميع التغييرات في التعليمات البرمجية في RP .


الاستنتاجات


UWSGI ليست سيئة للغاية ، أو حتى جيدة جدًا!
إذا لم تعجبك نتائج اختبار WRK ، فحاول استخدام أدوات أخرى.

Source: https://habr.com/ru/post/ar428047/


All Articles