الكفاءة، المقارنة المعيارية، اختبار السرعة، الأداء
-
20-08-2019 - |
سؤال
أحاول أن أكتب نصًا أحاول قياس كفاءته.لدي بضعة أسئلة:-
- بالنسبة للتطبيقات الصغيرة، هل هذا النوع من ملفات التعريف مطلوب؟أم أنني أشعر بجنون العظمة؟(بافتراض أن معظم التعليمات البرمجية فعالة بشكل لائق/لا توجد حلقات لا نهائية)
- مقابل ما الذي يجب أن أقيسه؟ما الذي يجب أن أقارن به؟
- فيما يلي ناتج الكفاءة الذي حصلت عليه من ab.هل هذه الطريقة بعيدة جدًا؟هل أسير في الاتجاه الخاطئ عند تصميم هذا التطبيق؟هل هناك أي إشارات تحذيرية يجب أن أكون على علم بها؟
abs -n10000 -c100 http://localhost/testapp This is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: Apache/2.2.10 Server Hostname: localhost Server Port: 80 Document Path: /testapp Document Length: 525 bytes Concurrency Level: 100 Time taken for tests: 33.608 seconds Complete requests: 10000 Failed requests: 5179 (Connect: 0, Receive: 0, Length: 5179, Exceptions: 0) Write errors: 0 Total transferred: 6973890 bytes HTML transferred: 5253890 bytes Requests per second: 297.55 [#/sec] (mean) Time per request: 336.080 [ms] (mean) Time per request: 3.361 [ms] (mean, across all concurrent requests) Transfer rate: 202.64 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 1.5 0 109 Processing: 8 334 403.9 176 3556 Waiting: 7 334 403.9 176 3556 Total: 9 335 403.8 177 3556 Percentage of the requests served within a certain time (ms) 50% 177 66% 296 75% 415 80% 519 90% 842 95% 1141 98% 1615 99% 1966 100% 3556 (longest request)
أنا أستخدم PHP لكتابة البرنامج النصي.في مزيد من الاختبارات، وجدت أيضًا أن "الطلبات الفاشلة" تصبح 0 إذا قمت بالتعليق على جزء اتصال MySQL من برنامج PHP النصي الخاص بي.ما هو الخطأ؟كيف يمكنني تقليل معدل الفشل هذا؟
شكرا اليك
المحلول
هل تتوقع 100 طلب متزامن؟هل تتوقع تلقي 10 آلاف طلب خلال 30 ثانية؟
من الرائع أن تتمكن من تشغيل هذا المعيار، لكن اسأل نفسك عما يعنيه ذلك.فكر في المقدار الحقيقي لحركة المرور التي ستتلقاها.أنت حقًا بحاجة إلى سؤال لقياسه:
- أتوقع أن يضم موقعي 3000 مستخدم.
- أتوقع أنه أثناء ذروة الاستخدام، سيتم وصول 500 منهم إلى الصفحة
- الاستخدام عادةً هو 3 طلبات خلال دقيقة واحدة:
3 * 500 / 60 = ~ 25 req/sec
- هل يمكن لموقعي التعامل مع 25 طلبًا في الثانية ويكون سريع الاستجابة (أقل من 200 مللي ثانية لكل طلب)؟
ما لم تكن في أعلى نسبة قليلة من الويب، فلن ترى صفحتك 100 طلب متزامن في الحياة الواقعية.ليس من المنطقي ضبط موقعك ليناسب هذا المستوى من الزيارات.للوصول إلى هذه الأرقام، تحتاج إلى تقديم تنازلات في التصميم على مستوى البنية (استخدام قاعدة البيانات، وطرق التخزين المؤقت، وما إلى ذلك):ومن هنا عدد حالات الفشل عندما تكون قاعدة البيانات قيد التشغيل).
إذا كنت تحاول فقط إنشاء ملف تعريف للبرنامج النصي الخاص بك، فاستخدم com.xdebug للعثور على المكان الذي يقضي فيه الكود الخاص بك وقته.
نصائح أخرى
أعتقد أن هذا يبدو وكأنه عمل عظيم.بعيد جدا؟أود أن أقول أنها أعلى بكثير من القاعدة.
سؤال واحد هو ما هو الحمل على الخادم في الإنتاج.يقوم البرنامج النصي الخاص بك بإطلاق الطلبات على هذا الخادم، ولكن إذا كنت المستخدم الوحيد في مثيل التطوير، فلن ترى ما يحدث عندما تضغط على خادم الإنتاج أثناء معالجة حمل الإنتاج النموذجي.
إذا كان الأمر كذلك، فأنت بحاجة إلى مصدرين للطلب:أحدهما يمثل تطبيقك الجديد، والآخر لعمليات الإنتاج التي سيتنافس معها على الموارد.
هل يمكنك ضبط عدد المستخدمين المتزامنين في البرنامج المعياري؟هل يرسل هذا الاختبار 1000 طلب واحدًا تلو الآخر؟قد يكون وجود عدة مستخدمين يقرعون على الخادم في نفس الوقت أمرًا أكثر واقعية.
هل يمكنك جعل الفاصل الزمني للإرسال عشوائيًا؟قد يكون هذا تمثيلًا أفضل لوضعك الحقيقي.
هل يمكنك تغيير البيانات التي يستخدمها البرنامج النصي؟هل يمثل الظروف التي سيتم استخدامها بشكل جيد في ظلها؟
بخلاف ذلك، كل ما يمكنني تقديمه هو تهنئتي.يبدو أنك تتعامل معي بحذر شديد.
من المفترض ألا تتلقى أي طلبات فاشلة - تحتاج إلى التحقق من سجل الأخطاء الخاص بك لمعرفة سبب فشلها.
من المرجح أن تكون اتصالات MySQL قد نفدت، وفي هذه الحالة يمكنك ببساطة ضبط الخادم الخاص بك للسماح بمزيد من الاتصالات المتزامنة (إذا كنت تتوقع هذا القدر من حركة المرور).
جرب استخدام com.xdebug لملف التعريف الخاص بك التعليمات البرمجية.com.xdebug سيوفر لك أيضًا أخطاء أفضل على الشاشة وتتبعات المكدس.
ثم استخدام webgrind لعرض الملف الشخصي بتنسيق جميل.
يعد ~200 مللي ثانية لكل طلب رقمًا شائعًا إلى حد ما حيث تبدو الصفحة "سريعة" بالنسبة لغالبية المستخدمين.