পাঠ ৩২ · ৫৭-এর মধ্যে · মডিউল ৮
Home / Courses / Software Testing & Quality Assurance / পারফরম্যান্স টেস্টিং

লোড, স্ট্রেস, সোক ও স্পাইক টেস্টিং

Load, stress, soak & spike testing
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • লোড, স্ট্রেস, সোক ও স্পাইক টেস্টিং-এর সংজ্ঞা এবং প্রতিটি কী নির্দিষ্ট প্রশ্নের উত্তর খোঁজে
  • কেন একটিমাত্র পারফরম্যান্স টেস্ট দিয়ে সবকিছু যাচাই করা যায় না
  • ক্যাপাসিটি ও রিকোয়েস্ট-রেট প্যাটার্ন থেকে ওভারলোড কম্পিউট করার একটি বাস্তব উদাহরণ
  • M8-এর বাকি পাঠগুলোতে (মেট্রিক্স, বটলনেক, ক্যাপাসিটি প্ল্যানিং) কীভাবে এগোনো হবে তার একটি পূর্বরূপ

১ · চারটি ধরনের পারফরম্যান্স টেস্ট

পারফরম্যান্স টেস্টিংPerformance Testingএকটি সিস্টেম নির্দিষ্ট লোডের অধীনে কতটা দ্রুত, স্থিতিশীল ও নির্ভরযোগ্যভাবে সাড়া দেয় তা যাচাই করার টেস্টিং শাখা। নিজেই একটি একক টেস্ট নয় — বরং একগুচ্ছ ভিন্ন ভিন্ন টেস্ট-কৌশলের ছাতা, যার প্রতিটি ভিন্ন একটি প্রশ্নের উত্তর খোঁজে।

লোড টেস্টিং
প্রত্যাশিত স্বাভাবিক ট্রাফিকের অধীনে সিস্টেম ঠিকঠাক কাজ করে কি না — "আজকের গড় ব্যবহারকারীর চাপ কি সামলাতে পারবে?"
স্ট্রেস টেস্টিং
লোড ধীরে ধীরে ক্ষমতার বাইরে নিয়ে গিয়ে সিস্টেম কোথায় ভেঙে পড়ে (breaking point) তা খুঁজে বের করা।
সোক/এন্ডুরেন্স টেস্টিং
মাঝারি লোড দীর্ঘ সময় ধরে টিকিয়ে রেখে মেমরি লিক, রিসোর্স-ফুরিয়ে-যাওয়া বা ধীরে-ধীরে পারফরম্যান্স-ডিগ্রেডেশন খোঁজা — সময়-নির্ভর সমস্যা, তীব্রতা-নির্ভর নয়।
স্পাইক টেস্টিং
হঠাৎ, স্বল্প সময়ের জন্য বিশাল ট্রাফিক-উত্থান (যেমন ফ্ল্যাশ সেল শুরু হওয়ার মুহূর্ত) সিস্টেম সামলাতে ও দ্রুত স্বাভাবিক অবস্থায় ফিরতে পারে কি না।
মূল পার্থক্য

স্ট্রেস আর স্পাইক দুটোই ক্যাপাসিটি ছাড়িয়ে যাওয়া নিয়ে কাজ করে, কিন্তু প্যাটার্ন ভিন্ন — স্ট্রেস ধীরে ধীরে বাড়তে থাকা লোড দিয়ে সিস্টেমের প্রকৃত সর্বোচ্চ ক্ষমতা খুঁজে বের করে, আর স্পাইক আকস্মিক, সংক্ষিপ্ত উত্থান দিয়ে সিস্টেমের প্রতিক্রিয়া গতি (যেমন অটো-স্কেলিং কত দ্রুত সাড়া দেয়) যাচাই করে। আর সোক টেস্টিং সম্পূর্ণ ভিন্ন মাত্রা নিয়ে কাজ করে — তীব্রতা নয়, সময়কাল।

২ · একটি সহজ ক্যাপাসিটি মডেল দিয়ে বাস্তবে দেখা

নিচের কোড সেলে একটি সার্ভারের সর্বোচ্চ থ্রুপুট ক্ষমতা (CAPACITY, প্রতি সেকেন্ডে রিকোয়েস্ট) এবং চারটি সিনারিওর জন্য একটি করে সিমুলেটেড রিকোয়েস্ট-রেট প্যাটার্ন (টাইম-স্টেপ অনুযায়ী তালিকা) দেওয়া আছে। কোডটি প্রতিটি টাইম-স্টেপে লোড ক্যাপাসিটি ছাড়িয়েছে কি না তা গণনা করে, সবচেয়ে বেশি কতগুলো পরপর স্টেপ ধরে ওভারলোড চলেছে তা বের করে, এবং সেই সংখ্যা থেকেই — কোনো হার্ডকোড করা লেবেল ছাড়াই — প্রতিটি সিনারিওর ফলাফল শ্রেণীবদ্ধ করে।

Python
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 == ..." নেই। ফলাফলের পার্থক্য সম্পূর্ণভাবে ইনপুট ডেটা থেকে আসে: লোড-সিনারিওতে কখনো ক্যাপাসিটি ছাড়ায় না, স্ট্রেস-সিনারিওতে ধীরে ধীরে বেড়ে ৯টি পরপর স্টেপ ধরে ক্যাপাসিটি ছাড়িয়ে যায় (ব্রেকিং পয়েন্ট), সোক-এ ২০টি স্টেপ ধরে স্থিতিশীল থাকে, আর স্পাইক-এ মাত্র ২টি পরপর স্টেপে হঠাৎ ক্যাপাসিটি ছাড়িয়ে আবার নিচে নেমে আসে।
মূল কথা · Key takeaway

একটি সংখ্যা (লোড ক্যাপাসিটির চেয়ে বেশি কি না) যথেষ্ট নয় — কতক্ষণ ধরে এবং কী প্যাটার্নে ক্যাপাসিটি ছাড়িয়েছে তা-ই নির্ধারণ করে এটি স্ট্রেস-স্টাইল ব্রেকিং পয়েন্ট, স্পাইক-স্টাইল স্বল্পমেয়াদী উত্থান, নাকি সম্পূর্ণ স্বাভাবিক আচরণ। M8-এর পরের পাঠগুলোতে (L33-L35) এই ধরনের টেস্ট থেকে পাওয়া রেসপন্স-টাইম ডেটা বিশ্লেষণ, বটলনেক শনাক্তকরণ ও ক্যাপাসিটি প্ল্যানিং শেখানো হবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ স্ট্রেস টেস্টিং আর স্পাইক টেস্টিং উভয়ই ক্যাপাসিটি ছাড়িয়ে যাওয়া নিয়ে কাজ করে — তাহলে দুটো আলাদা টেস্ট কেন দরকার?

কারণ তারা ভিন্ন প্যাটার্ন ও ভিন্ন প্রশ্ন যাচাই করে। স্ট্রেস টেস্টিং ধীরে ধীরে লোড বাড়িয়ে সিস্টেমের প্রকৃত সর্বোচ্চ ক্ষমতা ও কীভাবে সেটি ব্যর্থ হয় (gracefully, নাকি ক্র্যাশ করে) তা খুঁজে বের করে। স্পাইক টেস্টিং সম্পূর্ণ ভিন্ন প্রশ্ন করে — সিস্টেম কি একটি আকস্মিক, স্বল্প-স্থায়ী উত্থান সামলাতে পারে এবং তারপর দ্রুত স্বাভাবিক অবস্থায় ফিরে আসতে পারে (যেমন অটো-স্কেলিং সময়মতো সাড়া দেয় কি না)। একটিতে পাস করলে অন্যটিতে পাস করবে এমন নিশ্চয়তা নেই।

প্র ০২ সোক টেস্টিং-এ লোড খুব বেশি ক্যাপাসিটির কাছাকাছি রাখারও দরকার নেই, অথচ এটি এখনও গুরুত্বপূর্ণ কেন?

কারণ সোক টেস্টিং যা খুঁজছে তা তীব্রতা-নির্ভর নয়, সময়-নির্ভর। মেমরি লিক, ধীরে ধীরে জমতে থাকা কানেকশন-পুল, লগ ফাইল ফুরিয়ে ডিস্ক ভরে যাওয়া, বা ধীরে ধীরে ক্যাশ-ডিগ্রেডেশনের মতো সমস্যা একটি স্বল্প সময়ের স্ট্রেস টেস্টে ধরাই পড়ে না — এগুলো ফুটে ওঠে শুধু ঘণ্টার পর ঘণ্টা বা দিনের পর দিন সিস্টেম চালু রাখলে, এমনকি মাঝারি, সম্পূর্ণ স্বাভাবিক লোডেও।

প্র ০৩ কোড সেলের analyze() ফাংশন কীভাবে ঠিক করে কোনটি "স্ট্রেস-স্টাইল ব্রেকিং পয়েন্ট" আর কোনটি "স্পাইক-স্টাইল স্বল্পমেয়াদী ওভারলোড"?

এটি সম্পূর্ণভাবে longest_streak (সর্বোচ্চ কতগুলো পরপর টাইম-স্টেপ ধরে ক্যাপাসিটি ছাড়িয়েছে) এর উপর নির্ভর করে — ২ বা তার কম হলে স্বল্পমেয়াদী (স্পাইক-স্টাইল), তার বেশি হলে দীর্ঘস্থায়ী (স্ট্রেস-স্টাইল)। অর্থাৎ শুধু "ক্যাপাসিটি ছাড়িয়েছে কি না" যথেষ্ট নয় — কতক্ষণ ধরে ছাড়িয়েছে সেটাই আসল পার্থক্যকারী।

অনুশীলন

  1. চিন্তা করুন: যদি কোড সেলে CAPACITY-কে ২০০ থেকে বাড়িয়ে ৩০০ করা হয়, স্ট্রেস সিনারিওতে ওভারলোড ঠিক কোন টাইম-স্টেপ থেকে শুরু হবে?

    স্ট্রেস তালিকা [100, 140, 180, 220, 260, 300, 340, 380, 420, 460, 500, 540]-এ, ৩০০ ক্যাপাসিটির চেয়ে সরাসরি বেশি (>, শুধু সমান নয়) প্রথম মান হলো ইনডেক্স ৬-এ থাকা ৩৪০ (কারণ ইনডেক্স ৫-এর ৩০০ ক্যাপাসিটির সমান, বেশি নয়)। তাই ওভারলোড শুরু হবে সপ্তম টাইম-স্টেপ থেকে, এবং সেখান থেকে শেষ পর্যন্ত (৬টি স্টেপ) টানা চলবে।

  2. পরীক্ষা করুন: কোড সেলে 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 — সব এক জায়গায়।
আগের পাঠ
একটি মেইনটেইনেবল অটোমেশন স্যুট তৈরি করা