تحذيرات الاختيار / الاستطلاع مقابل المفاعلات encoll في الملتوية

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

سؤال

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

قراءة زوجين عشرات المقارنات بين الناقصات والبدائل تظهر أن النقص بوضوح للسرعة والتطوير، على وجه التحديد أن المقاييس في الأزياء الخطية التي هي رائعة. مما قال، ماذا عن المعالج واستخدام الذاكرة، هل لا يزال epoll البطل؟

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

المحلول

بالنسبة لأعداد صغيرة جدا من المقابس (تختلف اعتمادا على أجهزةك، بالطبع، لكننا نتحدث عن شيء ما على ترتيب 10 أو أقل)، فيمكن أن تغلب على encoll في استخدام الذاكرة وسرعة وقت التشغيل. بالطبع، لمثل هذه الأعداد الصغيرة من مآخذ، فإن كلا الآلين سريعين للغاية لا تهتم بهذا الاختلاف في الغالبية العظمى من الحالات.

توضيح واحد، رغم ذلك. كل من تحديد و encoll نطاق خطي. هناك اختلاف كبير، على الرغم من أن واجهات برمجة التطبيقات التي تواجهها المستثمرات لديها تعقيدات تستند إلى أشياء مختلفة. تكلفة select تستدعي المكالمة تقريبا بقيمة أفضل واصف الملفات المرقمة التي تمر بها. إذا قمت بتحديد On A FD واحدة، 100، فهذا يكلف تقريبا بمثابة اختيار على FD واحد، 50. إضافة المزيد من الأموال الموجودة أسفل الأعلى ليست حرة تماما، لذلك فهي أكثر تعقيدا قليلا من هذا في الممارسة العملية، ولكن هذا هو أول تقريب جيد لمعظم التطبيقات.

تكلفة النقص أقرب إلى عدد بيانات الملفات التي لديها فعلا الأحداث عليها. إذا كنت تقوم بمراقبة 200 واصفات ملف، ولكن 100 منهم فقط لديهم أحداث عليهم، فأنت (تقريبا تقريبا) يدفع فقط لتلك الواصفات 100 النشطة 100. هذا هو المكان الذي يميل فيه النقصة إلى تقديم واحدة من مزاياها الرئيسية. إذا كان لديك ألف عملاء في معظمهم من الخمول، فما عند استخدامه، ما زلت تدفع مقابل كل ألف منهم. ومع ذلك، مع encoll، فهو أنك حصلت على عدد قليل فقط - أنت فقط تدفع مقابل تلك التي تنشط في أي وقت معين.

كل هذا يعني أن encoll سيؤدي إلى استخدام وحدة المعالجة المركزية أقل لمعظم عبء العمل. بقدر ما يذهب استخدام الذاكرة، فهو قليل من إرم. select هل تمكن من تمثيل جميع المعلومات اللازمة بطريقة مدمجة للغاية (واحد واحد لكل واصف الملف). و FD_SETSIZE (عادة 1024) قيود على عدد واصفات الملفات التي يمكنك استخدامها select يعني أنك لن تنفق أبدا أكثر من 128 بايت لكل مجموعة من مجموعات FD الثلاثة التي يمكنك استخدامها select (قراءة، الكتابة، استثناء). مقارنة مع هؤلاء البايتات 384 ماكس، encoll هو نوع من الخنزير. يتم تمثيل كل واصف ملف بواسطة هيكل متعدد البايت. ومع ذلك، في المصطلحات المطلقة، ما زال لن تستخدم الكثير من الذاكرة. يمكنك تمثيل عدد كبير من واصفات الملفات في عدد قليل عشر سنوات (حوالي 20 كيلو بايت لكل 1000 واصفات الملف، وأعتقد). ويمكنك أيضا رمي في حقيقة أنه يجب عليك إنفاق كل 384 من تلك البايتات select إذا كنت ترغب فقط في مراقبة واصف ملف واحد، إلا أن قيمتها تحدث أن تكون 1024، فما إذا كنت تقضي 20 بايت فقط. ومع ذلك، فإن كل هذه الأرقام صغيرة جدا، لذلك لا تحدث فرقا كبيرا.

وهناك أيضا الاستفادة الأخرى من اليقص، والذي ربما كنت تعرف بالفعل، أنه لا يقتصر على FD_SETSIONSITE WAPPRIPTORS. يمكنك استخدامه لمراقبة العديد من واصفات الملفات كما لديك. وإذا كان لديك واصف ملف واحد فقط، ولكن قيمته أكبر من FD_SetSize، يعمل encoll مع ذلك أيضا، ولكن select لا.

عشوائيا، لقد اكتشفت مؤخرا عيب طفيف واحد epoll مقارنة ب select أو poll. وبعد في حين أن أي من هذه برامج الاختراعات برمجة التطبيقات الثلاثة تدعم الملفات العادية (أي الملفات على نظام الملفات)، select و poll قدم هذا الافتقار إلى الدعم على أنه الإبلاغ عن مثل هذه الواصفات كقراءة دائما وقابلة للكتابة دائما. هذا يجعلها غير مناسبة لأي نوع ذي مغزى من نظام الملفات غير المحظور I / O، وهو برنامج يستخدم select أو poll ويحدث أن يواجه واصف ملف من نظام الملفات سيستمر على الأقل في التشغيل (أو إذا فشل ذلك، فلن يكون ذلك بسبب select أو poll)، وإن كان ذلك ربما ليس بأفضل أداء.

من ناحية أخرى، epoll سوف تفشل بسرعة مع خطأ (EPERM, على ما يبدو) عندما يطلب منك مراقبة مثل هذا الواصف الملفات. بالتحدث بدقة، هذا بالكاد غير صحيح. إنها مجرد إشارة إلى عدم الدعم بطريقة واضحة. عادة ما أتمكن من شروط الفشل الصريحة، ولكن هذا واحد غير موثق (بقدر ما أستطيع أن أقول) ونتائج تطبيق مكسور تماما، بدلا من واحدة تعمل فقط مع أداء محتمل للتحلل.

في الممارسة العملية، المكان الوحيد الذي رأيته هذا يأتي هو عند التفاعل مع Stdio. قد يقوم المستخدم بإعادة توجيه StDin أو Stdout من / إلى ملف عادي. في حين أن Stdin و Stdout كان سابقا أن أنبوب - مدعوم من قبل encoll على ما يرام - يصبح بعد ذلك ملف عادي وفشل encoll بصوت عال، وكسر التطبيق.

نصائح أخرى

في الاختبارات في شركتي، حدثت مشكلة واحدة مع encoll ()، وبالتالي تكلفة واحدة مقارنة بالتحديد.

عند محاولة القراءة من الشبكة مع مهلة، قم بإنشاء EPOLL_FD (بدلا من FD_Set)، وإضافة FD إلى EPOLL_FD، أكثر تكلفة بكثير من إنشاء FD_Set (وهو malloc بسيط).

وفقا للإجابة السابقة، نظرا لأن عدد FDS في العملية يصبح كبيرا، يصبح تكلفة الاختيار () أعلى، ولكن في اختبارنا، حتى مع قيم FD في 10000، كان تحديد الفائز. هذه حالات حيث يوجد واحد فقط FD أن مؤشر ترابط ينتظر، وببساطة محاولة التغلب على حقيقة أن قراءة الشبكة، وكتابة الشبكة، لا يتم مهلة عند استخدام نموذج مؤشر ترابط حظر. بطبيعة الحال، حظر نماذج الخيط منخفضة الأداء مقارنة بأنظمة مفاعل غير حظر، ولكن هناك مناسبات حيث، للاندماج مع قاعدة كود إثارة معينة، فهي مطلوبة.

هذا النوع من استخدام حالة نادرة في تطبيقات عالية الأداء، لأن نموذج المفاعل لا يحتاج إلى إنشاء EPOLL_FD جديد في كل مرة. بالنسبة للنموذج الذي يكون فيه ECOLL_FD منذ فترة طويلة --- وهو ما يفضل بوضوح لأي تصميم خادم عالية الأداء --- encoll هو الفائز الواضح في كل شيء.

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