عند تطوير منتج ، نادراً ما يولون الاهتمام اللازم لأدائه مع كثافة عالية من الطلبات الواردة. لا تفعل هذا أو لا تفعله على الإطلاق - لا يوجد ما يكفي من الوقت ، المتخصصين ، أو يبررون أنفسهم بالعبارة النموذجية: "كل شيء يعمل بسرعة معنا على المنتج ، فلماذا تحقق من شيء آخر؟" في مثل هذه الحالات ، قد تأتي لحظة يسقط فيها إنتاج جيد الأداء فجأة بسبب التدفق المتزايد للزوار ، على سبيل المثال ، تحت تأثير Habraeffect. ثم يصبح من الواضح أن إجراء البحوث حول الإنتاجية أمر ضروري حقًا.
هذه المهمة محيرة للكثيرين بسبب الحاجة ، ولكن لا يوجد فهم واضح لما وكيفية قياس وكيفية تفسير النتيجة ، وأحيانًا لا توجد متطلبات غير وظيفية مشكلة. بعد ذلك ، سأتحدث عن مكان البدء إذا قررت السير في هذا الطريق ، وشرح المقاييس المهمة في أبحاث الأداء وكيفية استخدامها.
قليلا من الناحية النظرية
تخيل أن لدينا تطبيق كروي في فراغ - يتلقى الطلبات ويعطي إجابات عليها. من أجل البساطة ، يمكن أن تكون بمثابة خدمة مجهرية باستخدام طريقة واحدة لا تذهب إلى أي مكان ولا تعتمد على مكونات أو تطبيقات أخرى. في هذه الحالة ، لسنا مهتمين بما هو مكتوب عليه وكيف يعمل وبأي بيئة يتم تشغيله.
ماذا نريد أن نعرف عن الأداء بشكل عام؟ ربما يكون من الجيد معرفة الحد الأقصى لتدفق الطلبات الواردة التي تكون فيها الخدمة مستقرة ، وأدائها مع هذا التدفق والوقت الذي يستغرقه لإكمال طلب واحد. من الجيد جدًا تحديد الأسباب التي تحد من زيادة الإنتاجية.
من الواضح أنك تحتاج إلى قياس وقت الاستجابة للطلب ، على التوالي ، من خلال تدفق الطلبات الواردة أو شدتها ، سنعني عدد الطلبات لكل وحدة زمنية ، عادة في الثانية الواحدة ، والأداء - عدد الردود على نفس وحدة الوقت. يمكن أن تنتشر أوقات الاستجابة على نطاق واسع ، لذلك من المنطقي تقديمها كمتوسط في الثانية الواحدة.
بالإضافة إلى ذلك ، يمكن أن تنشأ المشاكل على مختلف المستويات: بدءًا من حقيقة أن الخدمة تستجيب لخطأ (ويكون جيدًا إذا كانت خمسمائة ، وليس "200 OK {" status ":" error "}" ، وتنتهي بحقيقة أنها توقف عن الاستجابة على الإطلاق أو تبدأ الإجابات في الضياع على مستوى الشبكة. يجب أن تكون الطلبات غير الناجحة قادرة على الالتقاط ، ومن المريح تقديمها كنسبة مئوية من الإجمالي. إن الرسم البياني للأداء ووقت الاستجابة ومعدل الخطأ مقابل الشدة شيء من هذا القبيل:

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

الوضع الطبيعي والحد الأقصى للأداء
يتم تحقيق الإنتاجية الطبيعية في الوقت الذي يبدأ فيه معدل النمو في الانخفاض ، والحد الأقصى - في الوقت الذي يصبح فيه معدل النمو صفرًا. فصل الأداء بين العادي والحد الأقصى مهم للغاية. بكثافة تتوافق مع الأداء العادي ، يجب أن يعمل التطبيق بشكل مستقر ، وتميز قيمة الأداء العادي العتبة التي يبدأ بعدها ظهور اختناق الخدمة ، مما يؤثر سلبًا على تشغيله. عند الوصول إلى الحد الأقصى من الأداء ، يبدأ عنق الزجاجة في الحد من النمو بشكل أكبر تمامًا ، وتكون الخدمة غير مستقرة ، وكقاعدة عامة ، في هذه اللحظة تبدأ خلفية صغيرة ولكنها مستقرة للأخطاء.
يمكن أن يكون سبب هذه المشكلة أسبابًا متعددة - يتم حظر قوائم الانتظار ، وليس هناك عدد كافٍ من مؤشرات الترابط ، وقد تم استنفاد المجموعة ، واستخدام وحدة المعالجة المركزية أو ذاكرة الوصول العشوائي بالكامل ، وعدم كفاية سرعة القراءة / الكتابة من القرص ، وما شابه ذلك. من المهم أن نفهم أن تصحيح عنق الزجاجة سيؤدي إلى الحد من الأداء بحلول التالي وما إلى ذلك. من المستحيل التخلص من عنق الزجاجة تمامًا ، فلا يمكن تحريكه إلا.
التجارب
بادئ ذي بدء ، من الضروري تحديد حجم الشدة التي تصل فيها الخدمة إلى الأداء الطبيعي والحد الأقصى ، ومتوسط وقت الاستجابة المقابل. للقيام بذلك ، في التجربة ، يكفي زيادة تدفق الطلبات الواردة ببساطة. من الصعب تحديد قيمة الحد الأقصى لشدة التجربة ووقتها.
يمكنك أن تبدأ من ما هو مكتوب في متطلبات غير وظيفية (إن وجدت) ، من الحد الأقصى لحمل المستخدم من البيع ، أو ببساطة تأخذ القيم من السقف. إذا لم تكن شدة الدفق الوارد كافية ، فلن يكون للخدمة وقت للوصول إلى التشبع وسيكون من الضروري تكرار التجربة. إذا كانت الكثافة عالية جدًا ، فستصل الخدمة بسرعة إلى التشبع ، ثم تصحيح الأخطاء. في مثل هذه الحالة ، من المريح إجراء مراقبة بحيث مع زيادة كبيرة في عدد الأخطاء ، يجب ألا تضيع الوقت دون جدوى وتوقف التجربة.
في تجاربنا ، نقوم بزيادة الشدة تدريجياً من 0 إلى 1000 طلب في الثانية لمدة 10 دقائق. هذا يكفي للوصول إلى التشبع ، ومن ثم ، إذا لزم الأمر ، نقوم بضبط الوقت والكثافة في التجربة التالية للحصول على نتيجة أكثر دقة. على الرسوم البيانية أعلاه ، كان كل شيء سلسًا وجميلًا ، ولكن في العالم الواقعي قد يكون من الصعب للوهلة الأولى تحديد قيمة الأداء الطبيعي.

الاعتماد الحقيقي لأداء الخدمة في الوقت المحدد
في هذه الحالة ، نأخذ 80-90 ٪ من الحد الأقصى للأداء العادي. إذا لاحظنا نموًا نشطًا للأخطاء بعد الوصول إلى التشبع ، فمن المنطقي أن نتحرى عنها ، لأنها ناتجة عن عنق الزجاجة ، فإن دراستها ستساعد في توطينها وتمريرها لتصحيحها.
لذلك ، يتم الحصول على النتائج الأولى. الآن نحن نعرف أداء التطبيق العادي والحد الأقصى ، وكذلك أوقات الاستجابة المقابلة لهم. هل هذا كل شيء؟ بالطبع لا! مع الأداء العادي ، يجب أن تعمل الخدمة بثبات ، مما يعني أنك بحاجة إلى التحقق من تشغيلها تحت الحمل العادي لفترة من الوقت. أي واحد؟ يمكنك مرة أخرى إلقاء نظرة على المتطلبات غير الوظيفية ، أو سؤال المحللين أو مراقبة مدة فترات النشاط الأقصى على المنتج. في تجاربنا ، نزيد الحمل خطيًا من 0 إلى عادي ونقف عليه لمدة 10-15 دقيقة. هذا يكفي إذا كان الحمل الأقصى للمستخدم أقل بكثير من المعتاد ، ولكن إذا كانت قابلة للمقارنة ، فيجب زيادة وقت التجربة.
لتقييم نتيجة التجربة بسرعة ، من المناسب تجميع البيانات التي تم الحصول عليها في شكل المقاييس التالية:
- متوسط زمن الاستجابة
- متوسط
- 90 ٪ المئويه
- أخطاء٪
- الأداء.
ومع ذلك ، ما هو متوسط وقت الاستجابة مفهوم ، ومع ذلك ، فإن المتوسط هو مقياس مناسب فقط في حالة التوزيع الطبيعي للعينة ، لأنه حساس للغاية لـ "القيم المتطرفة" - قيم كبيرة جدًا أو صغيرة جدًا تخرج بشدة عن الاتجاه العام. الوسيط هو منتصف العينة بأكملها من أوقات الاستجابة ، نصف القيم أقل منها ، والباقي أكبر. لماذا هو مطلوب؟
أولاً ، بناءً على تعريفه ، فإنه أقل حساسية للقيم المتطرفة ، أي أنه مقياس أكثر ملاءمة ، وثانياً ، بمقارنته بالمتوسط ، يمكن للمرء أن يقيّم بسرعة خصائص توزيع الاستجابة. في الحالة المثالية ، فهي متساوية - توزيع أوقات الاستجابة أمر طبيعي ، والخدمة جيدة!

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

توزيع أوقات الاستجابة مع "القيم المتطرفة" للإجابات الطويلة. بهذا التوزيع ، يكون المتوسط أكبر من المتوسط.
مثل هذه الحالات تتطلب تحليلا إضافيا. لتقدير حجم "الانبعاثات" ، تأتي الكميات أو النسب المئوية في عملية الإنقاذ.
الكمية ، في سياق العينة التي تم الحصول عليها ، هي قيمة وقت الاستجابة ، الذي يلائمه الجزء المقابل من جميع الطلبات. إذا كنت تستخدم٪ من الاستعلامات ، فهذه هي النسبة المئوية (بالمناسبة ، الوسيط هو 50٪ مئوية). من المناسب استخدام نسبة مئوية 90٪ لتقدير الانبعاثات. على سبيل المثال ، كنتيجة للتجربة ، تم الحصول على وسيطة قدرها 100 مللي ثانية ، ومتوسط - 250 مللي ثانية ، يتجاوز المتوسط بمقدار 2.5 مرة! من الواضح أن هذا ليس جيدًا تمامًا ، فنحن ننظر إلى 90٪ من الكمية ، وهناك 1000 مللي ثانية - تم إكمال ما يصل إلى 10٪ من جميع الطلبات الناجحة لأكثر من ثانية ، وهي فوضى ، تحتاج إلى معرفة ذلك. للبحث عن استعلامات طويلة ، يمكنك البحث في الملف بنتائج التجربة أو فورًا في سجلات الخدمة ، ولكن من الأفضل تقديم متوسط وقت الاستجابة في شكل رسم بياني مقابل الوقت ، وسيظهر على الفور وقت وطبيعة "القيم المتطرفة" المتاحة.
ملخص
لقد نجحت في إجراء التجارب وحصلت على النتائج. سواء أكان هذا جيدًا أم سيئًا ، فإنه يعتمد على متطلبات الخدمة ، ولكن ليس الأرقام التي تم الحصول عليها أكثر أهمية ، ولكن لماذا هذه الأرقام وفهم ما هو النمو الإضافي المحدود. إذا تمكنت من العثور على عنق الزجاجة - جيد جدًا ، إن لم يكن ، فستزيد من ذلك عاجلاً أم آجلاً زيادة الحاجة إلى الإنتاجية ، ولا يزال عليك البحث عنها ، لذلك يكون من السهل في بعض الأحيان تجنب الموقف.
في هذه المذكرة ، قدمت طريقة أساسية للبحث في الأداء من خلال الإجابة على الأسئلة التي كانت لدي في البداية. لا تخافوا للبحث عن الأداء ، فمن الضروري!
PS
تفضل بزيارة غرفة محادثة Telegram المريحة الخاصة بنا حيث يمكنك طرح الأسئلة والمساعدة في المشورة والتحدث فقط عن أبحاث الأداء.