تستضيف Google كل عام حدث Google Summer of Code ، حيث تجد مشاريع OpenSource الرائدة مطورين موهوبين جدد بين الطلاب. في عام 2019 ، لم يتمكن مشروع CRIU من اجتياز الجولة التأهيلية فحسب ، ولكن أيضًا لجذب العديد من المطورين الشباب مرة واحدة. حول سبب كل هذا ، وكيف استمر العمل على CRUI في إطار GSoC - اقرأ تحت القط.

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

بدأنا هذا المشروع في عام 2011. وعلى الرغم من حقيقة أن الأداة المساعدة تسببت في البداية في الكثير من الأسئلة ، واعتبر البعض تنفيذها مستحيلاً ، فقد تحولت وحدة CRIU تدريجياً إلى أداة ناضجة. حتى الآن ، تمكن أكثر من مائة ونصف مساهم من عشرات الشركات ، بما في ذلك عمالقة مثل Google و IBM ، من المشاركة فيها. على الرغم من هذا ، لا يزال البحث عن أعضاء جدد مستمرًا ، وفي هذا العام وصلنا أخيرًا إلى Google Summer of Code (GSoC).
GSoC هو حدث سنوي برعاية Google يهدف إلى جذب الطلاب إلى مشاريع مفتوحة المصدر مختلفة. من ناحية ، تسعى فرق من المشاريع المفتوحة إلى المشاركة في هذا الحدث ، ومن ناحية أخرى ، الطلاب الذين يرغبون في المساهمة في تطوير المجتمع وإثبات كفاءتهم المهنية في المشاريع الحقيقية.
لدخول فريق GSoC ، من الضروري تقديم طلب يحدد وصف المشروع والعديد من الموضوعات التي يمكن للطلاب العمل عليها وقائمة بما يسمى "الموجهين" - المشاركون النشطين في المشروع الذين سيساعدون الطالب في عمله الصعب. يتعين على الطلاب اختيار مشروع واحد أو أكثر وإرسال سيرهم الذاتية إلى الموجهين.
في منتصف العام الدراسي ، تدرس Google تطبيقات الفرق وتختار المشروعات التي ستشارك ، وأقرب من الإجازات الصيفية ، تختار الفرق الطلاب الذين هم على استعداد للعمل معهم ، وبعد ذلك تقوم Google بإجراء التصفية النهائية وتوزيع الطلاب وفقًا للفرق. في الصيف ، يبدأ العمل ، والذي يستمر ثلاثة أشهر. مرة واحدة كل 30 يومًا ، يقدم الطلاب تقارير مؤقتة ، ويقوم معلموه بتقييم النتائج وتقديم توصيات لاستمرار (أو إنهاء) العمل.
أمثلية الذاكرة وتنفيذ السجلات الثنائية
أعترف أنه في عام 2019 لم تكن محاولتنا الأولى لدخول GSoC. حتى هذه المرحلة ، لم نتمكن من اجتياز مرحلة اختيار المشاريع من Google. لكننا لم نستسلم (بشكل عام ، ليس من الصعب تقديم طلب) ، وأخيراً ، كل شيء تم تنفيذه - أدركت Google أن تطوير مشروعنا مهم وأصدر CRUI في GSoC.
كان لدينا الكثير من الموضوعات للطلاب ، واحد أكثر جمالا وأكثر تعقيدا. كانت المفاجأة السارة هي حقيقة أن كل واحد منهم في المجتمع كان هناك فنانين. كان هناك أشخاص يعرفون القضايا التي تم التعبير عنها وكانوا مستعدين للعمل كمعلم. في مرحلة تقديم الطلبات للطلاب ، تلقينا "مسابقة" كاملة - طالبان تقدموا بطلب لكل موضوع ، وكان جميعهم تقريباً يتمتعون ببيانات رائعة عن المدخلات. لقد أتاح لنا الاختيار النهائي الحصول على اثنين من الطلاب الذين تناولوا موضوعات تحسين رمز الحفاظ على الذاكرة من العملية الجارية ، بالإضافة إلى تنفيذ السجلات الثنائية.
نظرًا لأن CRIU هو نظام لترحيل التطبيق المباشر ، فإنه يحتوي على مثل هذا النمط من التشغيل عندما تتم قراءة وكتابة الذاكرة التي تستخدمها العملية إلى ملفات الصور بالتوازي مع تنفيذ العملية نفسها. نحن نسمي هذا "عملية القلب الحي" للعملية ، لأنها تستمر في العمل دون توقف. قبل جولة GSoC ، تم سحب كل الذاكرة إلى أنابيب باستخدام استدعاء نظام vmsplice ، مما تسبب في حدوث ضوضاء في وقت واحد ، ثم استمرت العملية في التنفيذ ، وألقيت CRIU هذه الذاكرة ببطء إلى ملفات (أو في قناة شبكة إذا كانت ترحيل مباشر). من حيث المبدأ ، هذه طريقة فعالة ، لكن المشكلة كانت أن الذاكرة الموجودة في الأنابيب مغلقة فعليًا (mlock) ولا يمكن للنواة إلغاء تحميلها على القرص (المبادلة) إذا لزم الأمر.
من وجهة نظر معمارية ، أردنا استبدال الأنابيب لنسخ الذاكرة في أجزاء صغيرة عن طريق استدعاء process_vm_readv. ظهر هذا الابتكار في نواة Linux منذ وقت ليس ببعيد (بالمناسبة ، تضم هذه الدعوة شقيقًا مزدوجًا يسمى process_vm_writev). ولكن في الوقت نفسه ، يسمح لك بتسهيل وتسريع العمل ، على سبيل المثال ، عمل الأداة المساعدة للإصلاح ووحدات تصحيح الأخطاء ، والتي يمكن الاستغناء عنها في ذاكرة العمليات لحل بعض المهام الأخرى.
كان العمل على التحسين معقدًا من خلال حقيقة أن رمز العمل مع ذاكرة العملية هو أحد الرموز المركزية في الأداة ، وبالتالي يجب أن يكون موثوقًا به تمامًا. يمكن أن يؤدي أي خطأ في حفظ الصفحات إلى عملية تلقي حالة غير متسقة من كائناتها الداخلية (والتي لا تعرف CRIU ، بطبيعة الحال ، أي شيء) وبعد سقوطها ستقع دون أي تشخيص واضح.
كانت الصعوبة الثانية لهذا التطور هي أن العمل مع الذاكرة يشارك في جميع ميزات CRIU تقريبًا. هذه هي إجراءات استعادة نقاط التفتيش المعتادة ، وهذه هي الإصدارات المختلفة المتنوعة ، على سبيل المثال ما قبل التفريغ أو الاستعادة البطيئة. مرة واحدة خلال أسبوع التقارير التالي ، اعتزمنا حتى "فصل" الطالب من المشروع ، لكن لحسن الحظ ، لم نفعل ذلك والآن لدينا التحسين الذي طال انتظاره في فرع التطوير لدينا.

كانت المهمة الثانية في إطار GSoC 2019 تطوير وتنفيذ ما يسمى السجلات الثنائية. إليك ما يلي: عندما تعمل CRIU ، تكتب الأداة رسائل عن عملها إلى ملف (أو إلى الشاشة ، ولكن لا يزال أفضل من ملف). أهمية هذه الوظائف ضخمة! إذا لم ينجح إجراء النسخ الاحتياطي أو الاستعادة لسبب ما ، فإن الطريقة الوحيدة لفهم السبب هي تحليل كل خطوة بأكبر قدر ممكن من التفاصيل ، ولهذا تحتاج إلى معلومات حول الأداة المساعدة. من الناحية المثالية ، تتطلب الإجراءات أكثر السجلات تفصيلا وملفات الصور ، إن وجدت. في الممارسة العملية ، من الصعب تلبية هذه المتطلبات.
للحصول على أكثر السجلات تفصيلا ، توفر CRIU الوضع المناسب ، ويقوم الغالبية العظمى من المستخدمين (وربما جميعهم) بتنشيطه دائمًا. لكن كمية المعلومات التي تولدها criu في هذه العملية هائلة لدرجة أن تسجيل الدخول في حد ذاته يبدأ في التأثير بشكل ملحوظ على سرعة النظام. لقد أظهر القليل من الأبحاث أننا نقضي 90٪ من وقتنا في تسجيل عمليات تنسيق الإخراج - أي على "نفس"٪ d و٪ 08s و٪ .2f وغيرها من المعدلات في مجموعة وظائف printf. يؤدي إيقاف تشغيل السجلات إلى تقليل وقت حفظ واستعادة العمليات من 10 إلى 30 في المائة ، اعتمادًا على حجم العمليات نفسها.

لإيقاف استخدام مثل هذا الكم من موارد النظام للتسجيل ، ولكن لترك السجلات مفيدة قدر الإمكان ، قررنا التخلص من التنسيق وحفظ البيانات الثنائية في ملفات السجل. بعد كل شيء ، يمكنك تنسيقها في وقت لاحق ، إذا لزم الأمر. تعامل الطالب الثاني مع هذه المهمة ، التي تم بالفعل قبول تصحيحاتها في فرع التطوير.
وليس فقط في GSoC
بالمناسبة ، هناك حقيقة أخرى مثيرة للاهتمام وهي المشاركة في GSoC وهي أن طالبًا ثالثًا جاء إلينا عبر عن رغبته في حل مشكلة إخفاء الهوية. بعد كل شيء ، غالبًا ما يكون من المستحيل الحصول على ملفات صور بسبب حقيقة أنها تحتوي على معلومات سرية لا يريد المستخدم من خلالها مشاركتها مع أي شخص - محتويات الذاكرة والملفات التي تعمل بها العملية ومحتويات قوائم الانتظار في اتصالات الشبكة وما إلى ذلك. لحل هذه المشكلة ، أرسلنا ميزة تسمى "إخفاء هوية الصور" في التطبيق ، لكن Google لم تقبلها.
ومع ذلك ، لم يفقد الموضوع أهميته ، وقرر الطالب الذي أراد التعامل معه في إطار GSoC ، في النهاية ، العمل على هذه القضية بشكل مستقل ، خارج حدث Google.

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