مقارنة أداء برنامج تشغيل الشبكة بعشر لغات برمجة

مجموعة باحثين من جامعات ألمانية опубликовала النتائج تجربة - قام بتجارب، تم خلالها تطوير 10 متغيرات لبرنامج تشغيل نموذجي لبطاقات شبكة Intel Ixgbe (X10xx) 5 جيجابت بلغات برمجة مختلفة. يعمل برنامج التشغيل في مساحة المستخدم ويتم تنفيذه في C و Rust و Go و C # و Java و OCaml و Haskell و Swift و JavaScript و Python. عند كتابة الكود ، كان التركيز على تحقيق أعلى أداء ممكن ، مع مراعاة خصائص كل لغة. من حيث الوظيفة ، جميع الخيارات متطابقة وتتألف من حوالي 1000 سطر من التعليمات البرمجية. إنجازات المشروع الانتشار تحت رخصة BSD.

كان إصدار برنامج التشغيل Rust قريبًا جدًا من أداء برنامج التشغيل المرجعي C. مع حمل مع إرسال واحد لكتل ​​مكونة من 32 حزمة ، تأخر برنامج تشغيل Rust قليلاً ، ولكن في الاختبارات التي تضم أكثر من 32 حزمة لكل كتلة ، لم يختلف عمليًا في السرعة عن برنامج التشغيل C وأظهر الأداء على مستوى المعالجة 28 مليون حزمة في الثانية على خادم مزود بوحدة معالجة مركزية Xeon CPU E3-1230 v2 3.3 جيجاهرتز.

مقارنة أداء برنامج تشغيل الشبكة بعشر لغات برمجة

احتل السائقين Go و C # المكانة التالية من حيث الأداء ، والتي أظهرت نتائج قريبة إلى حد ما (فاز سائق Go في الاختبارات مع الكتل التي تضمنت ما يصل إلى 16 حزمة ، وبدأ يخسر قليلاً في الاختبارات مع أكثر من 16 حزمة في a. حاجز). مع 256 حزمة لكل كتلة ، كان أقصى أداء لبرنامج التشغيل C # حوالي 28 ميجا بكسل ، ولسائقي Go ، حوالي 25 ميجا بكسل.

بعد ذلك ، مع نتائج قريبة إلى حد ما ، متبوعة بسائقي لـ
Java و OCaml و Haskell ، والتي كانت بالفعل وراء الخيارات التي تم النظر فيها سابقًا بشكل ملحوظ ولم تتمكن من التغلب على شريط 12 مليون حزمة في الثانية. أظهرت برامج التشغيل القائمة على Swift و JavaScript تراكمًا أكبر ، حيث تمكنت من معالجة التدفقات بمستوى 5 ملايين حزمة في الثانية.

أغلق السائق بلغة Python التصنيف ، والذي كان قادرًا على معالجة 0.14 مليون حزمة فقط في الثانية. تم استخدام تطبيق Python لتقييم سرعة المترجمين الفوريين بدون JIT وبدون تحسينات محددة (تم تشغيل الكود باستخدام CPython 3.7 ولم يكن متوافقًا مع PyPy ، ولكن لوحظ أن تحسين هياكل البيانات يمكن أن يحسن الأداء بحوالي 10 مرات).

بالإضافة إلى ذلك ، تم إجراء اختبارات زمن الوصول ، والتي أظهرت فعالية التخزين المؤقت وتأثير أداة تجميع القمامة. قام الاختبار بقياس زمن الانتقال بعد إعادة توجيه كل حزمة بواسطة السائق ، مقارنةً بوقت الإرسال المعروف. كان القادة لا يزالون سائقي C و Rust ، وكانت نتائجهم لا يمكن تمييزها تقريبًا لتدفق مليون رزمة في الثانية (حوالي 1 ميكرو ثانية). كان أداء السائق في لغة Go جيدًا ، والذي كان متأخرًا قليلاً فقط عن المتصدرين ، كما ظل عند مستوى 20 µs. أظهر سائق C # تأخيرات تبلغ حوالي 20 µs.
أظهرت برامج التشغيل القائمة على JavaScript و Java أكبر التأخيرات (تأخيرات تزيد عن 300 s).

مقارنة أداء برنامج تشغيل الشبكة بعشر لغات برمجة

أجريت الدراسة من أجل تقييم إمكانية تطوير برامج التشغيل ومكونات نظام التشغيل بلغات أعلى من C. حاليًا ، 39 من أصل 40 مشكلة في ذاكرة Linux مرتبطة ببرنامج التشغيل ، لذا فإن مشكلات تبني لغة أكثر أمانًا ونقل برامج التشغيل من النواة إلى مساحة المستخدم تظل ذات صلة ويقوم المصنعون بالفعل بإجراء تجارب نشطة في هذا الاتجاه (على سبيل المثال ، طورت Google حزمة TCP لنظام التشغيل فوشيا في Go ، CloudFlare خلقت تنفيذ بروتوكول QUIC في Rust ، نقلت Apple مكدس TCP على الأجهزة المحمولة إلى مساحة المستخدم).

في سياق العمل الذي تم تنفيذه ، تم استنتاج أن لغة Rust هي أفضل مرشح لتطوير السائق. تتيح لك الميزات التي يوفرها Rust التخلص من المشكلات التي تنشأ بسبب معالجة الذاكرة منخفضة المستوى ، على حساب غرامة أداء تبلغ حوالي 2٪ -10٪ مقارنة بمحركات لغة C. تم العثور على Go و C # أيضًا ليكونا مناسبين لبناء مكونات النظام في المواقف التي يكون فيها زمن انتقال أقل من ملي ثانية الناجم عن جامع القمامة مقبولاً.

المصدر: opennet.ru

إضافة تعليق