تركيز الطلبات في بعض العمليات

الظاهرة

أحيانًا عند استخدام الأمر php start.php status، نرى أن الطلبات تتم معالجتها بشكل مركز في عمليات معينة، بينما تبقى العمليات الأخرى خالية تمامًا.

آلية الاستحواذ

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

آلية الدوران

يمكن لـ Workerman تغيير طريقة الحصول على الاتصالات إلى دوران عن طريق تعيين $worker->reusePort = true;، حيث ستقوم النواة بتوزيع الاتصالات بشكل متقارب ومتساوي بين جميع العمليات، مما يعني أن جميع العمليات ستقوم بمعالجة الطلبات معًا.

المفاهيم الخاطئة

يعتقد العديد من المطورين أن مشاركة جميع العمليات في معالجة الطلبات يؤدي إلى تحسين الأداء، ولكن هذا ليس بالضرورة صحيحًا. عندما تكون الأعمال بسيطة كفاية، كلما اقترب عدد العمليات المشاركة في معالجة الطلبات من عدد أنوية وحدة المعالجة المركزية، زادت قدرة الخادم على التعامل مع الطلبات. على سبيل المثال، في خادم بأربعة أنوية، عندما يتم تعيين عدد العمليات إلى 4، فإن معدل طلبات الخدمة في الثانية (QPS) لبرنامج hello world سيكون عادةً هو الأعلى. إذا زاد عدد العمليات المشاركة في معالجة الطلبات بشكل كبير عن عدد أنوية وحدة المعالجة المركزية، فإن تكلفة سياق العملية ستزداد، مما يؤدي إلى أداء أسوأ. وعادةً ما يكون من الأفضل تعيين عدد العمليات عند ثلاثة إلى ستة أضعاف عدد أنوية وحدة المعالجة المركزية عندما تتعامل الأعمال مع قاعدة البيانات.