سؤال

كتبت للتو جزءا بسيطا من التعليمات البرمجية لقيادة اختبار Redis + Gevent لمعرفة كيف يساعد Async على perforamance وتفاجأ بإيجاد الأداء السيئ.هنا هو رمز بلدي.إذا تخلصت من السطرين الأولين إلى قرد التصحيح هذا الرمز، فسترى توقيت "التنفيذ العادي".

على أوبونتو 12.04 LTS VM، وأرى توقيت

بدون قرد التصحيح - 54 ثانية مع قرد التصحيح - 61 ثانية

هل هناك خطأ ما في الكود / النهج الخاص بي؟هل هناك مشكلة Perf هنا؟ giveacodicetagpre.

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

المحلول

هذا متوقع.

تقوم بتشغيل هذا المعيار على VM، والتي تكون فيها تكلفة مكالمات النظام أعلى من الأجهزة المادية. عند تنشيط GEVENT، تميل إلى توليد المزيد من مكالمات النظام (للتعامل مع جهاز Ecoll)، لذلك ينتهي بك الأمر بأداء أقل.

يمكنك بسهولة التحقق من هذه النقطة باستخدام ستراس على البرنامج النصي.

بدون GEVENT، يولد الحلقة الداخلية: giveacodicetagpre.

مع gevent، سيكون لديك حدوث: giveacodicetagpre.

عند حظر المكالمة RECVFROM (EAGIN)، تعود Gevent إلى حلقة الحدث، لذا تتم إجراء مكالمات إضافية لانتظار أحداث واصفات الملفات (EPOLL_WAIT).

يرجى ملاحظة أن هذا النوع من المعيار هو أسوأ الحالات لأي نظام حلقة حدث، لأنك لا تملك فقط واصف ملف واحد، لذلك لا يمكن تعامل عمليات الانتظار في العديد من الواصفات. علاوة على ذلك، لا يستطيع ASYNC I / OS تحسين أي شيء هنا لأن كل شيء متزامن.

هو أيضا حالة أسوأ ل Redis لأن:

  • تولد العديد من الرطوبة إلى الخادم

  • يتصل بشكل منهجي / قطع الاتصال (1000 مرة) لأنه تم إعلان المسبح في وظيفة UxDomainsocket.

    في الواقع معيارك لا يختبر GEVENT أو REDIS أو Redis-Py: تمارس القدرة على VM للحفاظ على لعبة Ping-Pong بين 2 عملية.

    إذا كنت ترغب في زيادة الأداء، فأنت بحاجة إلى:

    • استخدم خطوط الأنابيب لتقليل عدد دائرة التطويل

    • جعل المسبح المستمر عبر المعيار بأكمله

      على سبيل المثال، فكر في البرنامج النصي التالي: giveacodicetagpre.

      مع هذا البرنامج النصي، أحصل على أداء أفضل 3X وأددا تقريبا مع GEVENT.

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