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

الظاهرة

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

آلية الاستيلاء

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

آلية التوزيع الدوري

يمكن لـ workerman تغيير طريقة الحصول على الاتصالات إلى طريقة التوزيع الدوري من خلال ضبط $worker->reusePort = true;. بطريقة التوزيع الدوري، ستقوم النواة بتوزيع الاتصالات تقريبًا بالتساوي على جميع العمليات، وبهذه الطريقة ستتعاون جميع العمليات في معالجة الطلبات.

الافتراض الخاطئ

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