লোড, স্ট্রেস, সোক ও স্পাইক টেস্টিং
এই পাঠে যা শিখবেন
- লোড, স্ট্রেস, সোক ও স্পাইক টেস্টিং-এর সংজ্ঞা এবং প্রতিটি কী নির্দিষ্ট প্রশ্নের উত্তর খোঁজে
- কেন একটিমাত্র পারফরম্যান্স টেস্ট দিয়ে সবকিছু যাচাই করা যায় না
- ক্যাপাসিটি ও রিকোয়েস্ট-রেট প্যাটার্ন থেকে ওভারলোড কম্পিউট করার একটি বাস্তব উদাহরণ
- M8-এর বাকি পাঠগুলোতে (মেট্রিক্স, বটলনেক, ক্যাপাসিটি প্ল্যানিং) কীভাবে এগোনো হবে তার একটি পূর্বরূপ
১ · চারটি ধরনের পারফরম্যান্স টেস্ট
পারফরম্যান্স টেস্টিংPerformance Testingএকটি সিস্টেম নির্দিষ্ট লোডের অধীনে কতটা দ্রুত, স্থিতিশীল ও নির্ভরযোগ্যভাবে সাড়া দেয় তা যাচাই করার টেস্টিং শাখা। নিজেই একটি একক টেস্ট নয় — বরং একগুচ্ছ ভিন্ন ভিন্ন টেস্ট-কৌশলের ছাতা, যার প্রতিটি ভিন্ন একটি প্রশ্নের উত্তর খোঁজে।
প্রত্যাশিত স্বাভাবিক ট্রাফিকের অধীনে সিস্টেম ঠিকঠাক কাজ করে কি না — "আজকের গড় ব্যবহারকারীর চাপ কি সামলাতে পারবে?"
লোড ধীরে ধীরে ক্ষমতার বাইরে নিয়ে গিয়ে সিস্টেম কোথায় ভেঙে পড়ে (breaking point) তা খুঁজে বের করা।
মাঝারি লোড দীর্ঘ সময় ধরে টিকিয়ে রেখে মেমরি লিক, রিসোর্স-ফুরিয়ে-যাওয়া বা ধীরে-ধীরে পারফরম্যান্স-ডিগ্রেডেশন খোঁজা — সময়-নির্ভর সমস্যা, তীব্রতা-নির্ভর নয়।
হঠাৎ, স্বল্প সময়ের জন্য বিশাল ট্রাফিক-উত্থান (যেমন ফ্ল্যাশ সেল শুরু হওয়ার মুহূর্ত) সিস্টেম সামলাতে ও দ্রুত স্বাভাবিক অবস্থায় ফিরতে পারে কি না।
স্ট্রেস আর স্পাইক দুটোই ক্যাপাসিটি ছাড়িয়ে যাওয়া নিয়ে কাজ করে, কিন্তু প্যাটার্ন ভিন্ন — স্ট্রেস ধীরে ধীরে বাড়তে থাকা লোড দিয়ে সিস্টেমের প্রকৃত সর্বোচ্চ ক্ষমতা খুঁজে বের করে, আর স্পাইক আকস্মিক, সংক্ষিপ্ত উত্থান দিয়ে সিস্টেমের প্রতিক্রিয়া গতি (যেমন অটো-স্কেলিং কত দ্রুত সাড়া দেয়) যাচাই করে। আর সোক টেস্টিং সম্পূর্ণ ভিন্ন মাত্রা নিয়ে কাজ করে — তীব্রতা নয়, সময়কাল।
২ · একটি সহজ ক্যাপাসিটি মডেল দিয়ে বাস্তবে দেখা
নিচের কোড সেলে একটি সার্ভারের সর্বোচ্চ থ্রুপুট ক্ষমতা (CAPACITY, প্রতি সেকেন্ডে রিকোয়েস্ট) এবং
চারটি সিনারিওর জন্য একটি করে সিমুলেটেড রিকোয়েস্ট-রেট প্যাটার্ন (টাইম-স্টেপ অনুযায়ী তালিকা) দেওয়া আছে। কোডটি
প্রতিটি টাইম-স্টেপে লোড ক্যাপাসিটি ছাড়িয়েছে কি না তা গণনা করে, সবচেয়ে বেশি কতগুলো পরপর স্টেপ ধরে
ওভারলোড চলেছে তা বের করে, এবং সেই সংখ্যা থেকেই — কোনো হার্ডকোড করা লেবেল ছাড়াই — প্রতিটি সিনারিওর ফলাফল
শ্রেণীবদ্ধ করে।
CAPACITY = 200 # সার্ভারের সর্বোচ্চ থ্রুপুট ক্ষমতা (req/s)
scenarios = {
"লোড (স্বাভাবিক)": [150, 160, 170, 165, 155, 160, 175, 168, 158, 162, 170, 160],
"স্ট্রেস (ক্রমবর্ধমান)": [100, 140, 180, 220, 260, 300, 340, 380, 420, 460, 500, 540],
"সোক (দীর্ঘস্থায়ী)": [185] * 20,
"স্পাইক (আকস্মিক উত্থান)": [150, 155, 160, 600, 620, 158, 152, 160, 157, 155, 150, 153],
}
def analyze(loads, capacity):
exceeded = [load > capacity for load in loads]
total_exceeded = sum(exceeded)
longest_streak = 0
current = 0
for e in exceeded:
if e:
current += 1
longest_streak = max(longest_streak, current)
else:
current = 0
if longest_streak == 0 and len(loads) >= 18:
label = "স্থিতিশীল — দীর্ঘ সময় ধরে ক্যাপাসিটির মধ্যেই আছে (সোক-স্টাইল ফলাফল)"
elif longest_streak == 0:
label = "ক্যাপাসিটির মধ্যেই আছে (কোনো ওভারলোড নেই)"
elif longest_streak <= 2:
label = "স্বল্পমেয়াদী ওভারলোড (স্পাইক-স্টাইল) — দ্রুত স্বাভাবিক অবস্থায় ফিরেছে"
else:
label = "দীর্ঘস্থায়ী ওভারলোড — ব্রেকিং পয়েন্ট পাওয়া গেছে (স্ট্রেস-স্টাইল)"
return total_exceeded, longest_streak, label
for name, loads in scenarios.items():
total_exceeded, longest_streak, label = analyze(loads, CAPACITY)
print(f"{name}:")
print(f" মোট টাইম-স্টেপ: {len(loads)} | ক্যাপাসিটি ছাড়িয়েছে: {total_exceeded} স্টেপ | সর্বোচ্চ পরপর ওভারলোড: {longest_streak} স্টেপ")
print(f" ফলাফল: {label}")
print()
analyze() ফাংশনটি প্রতিটি সিনারিওর জন্য একই লজিক চালায় — কোনো সিনারিও-নির্দিষ্ট
"if scenario == ..." নেই। ফলাফলের পার্থক্য সম্পূর্ণভাবে ইনপুট ডেটা থেকে আসে: লোড-সিনারিওতে কখনো ক্যাপাসিটি
ছাড়ায় না, স্ট্রেস-সিনারিওতে ধীরে ধীরে বেড়ে ৯টি পরপর স্টেপ ধরে ক্যাপাসিটি ছাড়িয়ে যায় (ব্রেকিং পয়েন্ট), সোক-এ
২০টি স্টেপ ধরে স্থিতিশীল থাকে, আর স্পাইক-এ মাত্র ২টি পরপর স্টেপে হঠাৎ ক্যাপাসিটি ছাড়িয়ে আবার নিচে নেমে আসে।
একটি সংখ্যা (লোড ক্যাপাসিটির চেয়ে বেশি কি না) যথেষ্ট নয় — কতক্ষণ ধরে এবং কী প্যাটার্নে ক্যাপাসিটি ছাড়িয়েছে তা-ই নির্ধারণ করে এটি স্ট্রেস-স্টাইল ব্রেকিং পয়েন্ট, স্পাইক-স্টাইল স্বল্পমেয়াদী উত্থান, নাকি সম্পূর্ণ স্বাভাবিক আচরণ। M8-এর পরের পাঠগুলোতে (L33-L35) এই ধরনের টেস্ট থেকে পাওয়া রেসপন্স-টাইম ডেটা বিশ্লেষণ, বটলনেক শনাক্তকরণ ও ক্যাপাসিটি প্ল্যানিং শেখানো হবে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ স্ট্রেস টেস্টিং আর স্পাইক টেস্টিং উভয়ই ক্যাপাসিটি ছাড়িয়ে যাওয়া নিয়ে কাজ করে — তাহলে দুটো আলাদা টেস্ট কেন দরকার?
কারণ তারা ভিন্ন প্যাটার্ন ও ভিন্ন প্রশ্ন যাচাই করে। স্ট্রেস টেস্টিং ধীরে ধীরে লোড বাড়িয়ে সিস্টেমের প্রকৃত সর্বোচ্চ ক্ষমতা ও কীভাবে সেটি ব্যর্থ হয় (gracefully, নাকি ক্র্যাশ করে) তা খুঁজে বের করে। স্পাইক টেস্টিং সম্পূর্ণ ভিন্ন প্রশ্ন করে — সিস্টেম কি একটি আকস্মিক, স্বল্প-স্থায়ী উত্থান সামলাতে পারে এবং তারপর দ্রুত স্বাভাবিক অবস্থায় ফিরে আসতে পারে (যেমন অটো-স্কেলিং সময়মতো সাড়া দেয় কি না)। একটিতে পাস করলে অন্যটিতে পাস করবে এমন নিশ্চয়তা নেই।
প্র ০২ সোক টেস্টিং-এ লোড খুব বেশি ক্যাপাসিটির কাছাকাছি রাখারও দরকার নেই, অথচ এটি এখনও গুরুত্বপূর্ণ কেন?
কারণ সোক টেস্টিং যা খুঁজছে তা তীব্রতা-নির্ভর নয়, সময়-নির্ভর। মেমরি লিক, ধীরে ধীরে জমতে থাকা কানেকশন-পুল, লগ ফাইল ফুরিয়ে ডিস্ক ভরে যাওয়া, বা ধীরে ধীরে ক্যাশ-ডিগ্রেডেশনের মতো সমস্যা একটি স্বল্প সময়ের স্ট্রেস টেস্টে ধরাই পড়ে না — এগুলো ফুটে ওঠে শুধু ঘণ্টার পর ঘণ্টা বা দিনের পর দিন সিস্টেম চালু রাখলে, এমনকি মাঝারি, সম্পূর্ণ স্বাভাবিক লোডেও।
প্র ০৩
কোড সেলের analyze() ফাংশন কীভাবে ঠিক করে কোনটি "স্ট্রেস-স্টাইল ব্রেকিং পয়েন্ট" আর কোনটি
"স্পাইক-স্টাইল স্বল্পমেয়াদী ওভারলোড"?
এটি সম্পূর্ণভাবে longest_streak (সর্বোচ্চ কতগুলো পরপর টাইম-স্টেপ ধরে ক্যাপাসিটি
ছাড়িয়েছে) এর উপর নির্ভর করে — ২ বা তার কম হলে স্বল্পমেয়াদী (স্পাইক-স্টাইল), তার বেশি হলে দীর্ঘস্থায়ী
(স্ট্রেস-স্টাইল)। অর্থাৎ শুধু "ক্যাপাসিটি ছাড়িয়েছে কি না" যথেষ্ট নয় — কতক্ষণ ধরে ছাড়িয়েছে সেটাই আসল
পার্থক্যকারী।
অনুশীলন
-
চিন্তা করুন: যদি কোড সেলে
CAPACITY-কে ২০০ থেকে বাড়িয়ে ৩০০ করা হয়, স্ট্রেস সিনারিওতে ওভারলোড ঠিক কোন টাইম-স্টেপ থেকে শুরু হবে?স্ট্রেস তালিকা
[100, 140, 180, 220, 260, 300, 340, 380, 420, 460, 500, 540]-এ, ৩০০ ক্যাপাসিটির চেয়ে সরাসরি বেশি (>, শুধু সমান নয়) প্রথম মান হলো ইনডেক্স ৬-এ থাকা ৩৪০ (কারণ ইনডেক্স ৫-এর ৩০০ ক্যাপাসিটির সমান, বেশি নয়)। তাই ওভারলোড শুরু হবে সপ্তম টাইম-স্টেপ থেকে, এবং সেখান থেকে শেষ পর্যন্ত (৬টি স্টেপ) টানা চলবে। -
পরীক্ষা করুন: কোড সেলে
CAPACITY = 200-কেCAPACITY = 700-এ পরিবর্তন করে Run চাপুন — স্পাইক সিনারিওর ফলাফল কী হয় দেখুন।স্পাইক তালিকার সর্বোচ্চ মান ৬২০, যা ৭০০-এর চেয়ে কম। ফলে
exceeded-এর সবগুলো মানFalseহয়ে যাবে,longest_streakহবে ০, এবং যেহেতু তালিকার দৈর্ঘ্য ১২ (১৮-এর কম), ফলাফল দেখাবে "ক্যাপাসিটির মধ্যেই আছে (কোনো ওভারলোড নেই)" — অর্থাৎ ৭০০ ক্যাপাসিটির সার্ভারের জন্য এই স্পাইকটি আসলে কোনো সমস্যাই নয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরের পাঠ L33 রেসপন্স টাইম, থ্রুপুট ও পার্সেন্টাইল — কেন গড়ের বদলে p95/p99 দিয়ে পারফরম্যান্স বিচার করা উচিত।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ টেস্ট ডিজাইন টেকনিক, ইউনিট টেস্টিং, টেস্ট ডাবলস, ইন্টিগ্রেশন টেস্টিং, কভারেজ, অটোমেশন, পারফরম্যান্স ও সিকিউরিটি টেস্টিং, অ্যাডভান্সড টেকনিক ও CI/CD ইন্টিগ্রেশন — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics, Full-Stack Web Frameworks, Mobile App Development, Ethics in Computing & AI Safety ও Software Testing & Quality Assurance — সব এক জায়গায়।