ما الذي يحدث فرقًا كبيرًا في الأداء بين الحدث والحدث؟

StackOverflow https://stackoverflow.com//questions/12669971

سؤال

تشترك هاتان المكتبتان في الفلسفة نفسها وقرارات التصميم المماثلة نتيجة لذلك.لكن هذا المعيار WSGI الشهير يقول eventlet هو وسيلة أبطأ من gevent.ما الذي يجعل أدائهم مختلفًا جدًا؟

وكما أعرف الاختلافات الرئيسية بينهما هي:

  • gevent يعتمد عمدا على ويقترن ب libev (libevent, ، سابقا) بينما eventlet يحدد واجهة مفاعل مستقلة وينفذ محولات معينة باستخدام select, epoll, والمفاعل الملتوي خلفه. هل تحقق واجهة المفاعل الإضافية نتائج حاسمة في الأداء؟

  • gevent هو مكتوب في الغالب في Cython بينما eventlet هو مكتوب في بيثون نقية. هل Cython الذي تم تجميعه أصلاً أسرع بكثير من Python النقي، بالنسبة للبرامج غير الحسابية ولكن المرتبطة بـ IO؟

  • البدائيات gevent محاكاة واجهات المكتبات القياسية أثناء eventletتختلف العناصر الأولية لـ عن القياسية وتوفر طبقة إضافية لمحاكاتها. هل تصنع طبقة مضاهاة إضافية eventlet أبطأ؟

  • هل يتم تنفيذ eventlet.wsgi فقط أسوأ من gevent.pywsgi?

أنا أتساءل حقًا، لأنهم بشكل عام يبدون متشابهين جدًا بالنسبة لي.

هل كانت مفيدة؟

المحلول

حسنًا، لم تتم كتابة gevent "في الغالب" بلغة Cython، على الرغم من أن بعض الأقسام الهامة مكتوبة أيضًا.

يُحدث سايثون فرقًا كبيرًا.تعمل تحسينات المعالج بشكل أفضل بكثير مع التعليمات البرمجية المجمعة.على سبيل المثال، ينهار التنبؤ بالفروع في الأنظمة المستندة إلى VM لأن الاتجاه غير المباشر للتفرع عند مستوى تنفيذ VM غير شفاف بالنسبة له.أصبحت مساحة ذاكرة التخزين المؤقت أكثر إحكامًا.تُحدث التعليمات البرمجية المجمعة فرقًا كبيرًا هنا، ويمكن أن يكون الإدخال/الإخراج حساسًا جدًا لوقت الاستجابة.

وعلى نفس المنوال، فإن libev سريع جدًا.نفس الأسباب.

لا يبدو أن Eventlet كان يجب أن يستخدم مركز التحديد (Python 2.6 عادةً ما يكون افتراضيًا على epoll).إذا كان عالقًا في التحديد، فهذا من شأنه أن ينجح حقًا بطيء (لأنه يتعين على Python تحويل التحديد fd_set ذهابًا وإيابًا إلى قائمة Python، لذلك يصبح الأمر قبيحًا عندما يكون في منتصف الحلقة).

لم أقم بأي تصنيف، لكنني سأكون على استعداد للمراهنة على أن libev / libevent بالإضافة إلى Cython يحدثان فرقًا كبيرًا.والجدير بالذكر أن بعض أساسيات الترابط موجودة في Cython في جيفنت.يعد هذا أمرًا مهمًا لأن الكثير من التعليمات البرمجية تمسها بشكل غير مباشر من خلال الإدخال / الإخراج وحتى المكتبة القياسية في بعض المواقع.

أما بالنسبة لطبقة المحاكاة الإضافية للحدث، فيبدو أن هناك الكثير من الارتداد.في هذه الحالة، يبدو أن مسار التعليمات البرمجية يقوم بإنشاء عمليات رد اتصال ويسمح للمركز باستدعاءها.يبدو أن Eventlet يقوم بالمزيد من عمليات مسك الدفاتر التي يقوم بها المركز في Gevent.مرة أخرى، رغم ذلك، لم أقم بتوصيفه.أما بالنسبة لرقعة القرود نفسها، فهي تبدو متشابهة إلى حد ما.

يعد خادم WSGI خادمًا صعبًا آخر.والجدير بالذكر أن تحليل الرأس في حدث تم تأجيله إلى المكتبة القياسية، بينما يقومون بتنفيذه بأنفسهم في حدث.لست متأكدًا مما إذا كان هذا تأثيرًا كبيرًا أم لا، ولكن لن يكون من المفاجئ إذا كان هناك شيء كامن هناك.الأمر الأكثر دلالة هو أن خادم Eventlet يعتمد على نسخة مصححة من المكتبة القياسية BaseHTTPServer.لا أستطيع أن أتخيل أن هذا هو الأمثل للغاية.يطبق Gevent خادمًا على دراية بالمحاكاة.

نصائح أخرى

آسف على الرد المتأخر.

هناك سببان رئيسيان للاختلاف الكبير في الأداء في ذلك المعيار:

  • كما ذكرنا سابقًا، تم تحسين المسارات الحرجة لـ Gevent بشكل كبير
  • هذا المعيار لا اختبار الإجهاد.لم يعد مرتبطًا بـ IO بعد الآن، لأنه يحاول جعل الآلة تقوم بتشغيل أكبر عدد ممكن من الطلبات.وهذا هو المكان الذي يتألق فيه كود Cythonized.

"في العالم الحقيقي" يحدث هذا فقط أثناء انفجارات حركة المرور "slashdot".وهو أمر مهم ويجب أن يكون الشخص جاهزًا، ولكن عندما يحدث ذلك، فإن رد فعلك هو إضافة المزيد من الخوادم أو تعطيل الميزات الثقيلة للموارد.لم أر معيارًا يضيف بالفعل المزيد من الخوادم عند زيادة التحميل.

من ناحية أخرى، إذا كان المعيار يحاكي تحميل "اليوم العادي" (والذي قد يختلف من موقع ويب إلى آخر) ولكن بشكل عام يمكن تقريبه للطلب والإيقاف المؤقت العشوائي والتكرار.كلما قل هذا التوقف - زادت حركة المرور التي نحاكيها.كما يجب على جانب العميل من المعيار محاكاة زمن الوصول.في نظام التشغيل Linux، يمكن القيام بذلك باستخدام netem[1] الرائع، وإلا عن طريق وضع تأخيرات صغيرة قبل مكالمات الاستقبال/الإرسال (وهو ما قد يكون صعبًا للغاية لأن المعايير تستخدم عادةً مكتبات ذات مستوى أعلى).

الآن، إذا تم استيفاء هذه الشروط، فسنقوم في الواقع بقياس المشكلات المرتبطة بـ IO.لكن النتائج لن تكون رائعة جدًا:نجح جميع المرشحين في تقديم 10 و50 وحتى 200 حمولة QPS.مملة، أليس كذلك؟لذا يمكننا قياس توزيع زمن الوصول، والوقت اللازم لخدمة 99% من الطلبات، وما إلى ذلك.سيظل Gevent يُظهر نتائج أفضل.لكن الفارق لن يكون مثيرا للإعجاب.

[1] محاكاة الحزم المتأخرة والمسقطة على نظام Linux

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top