পাঠ ৪৬ · ৫৭-এর মধ্যে · মডিউল ১১
Home / Courses / Cloud Computing & DevOps / কোল্ড স্টার্ট ও সার্ভারলেস পারফরম্যান্স

কোল্ড স্টার্ট ও সার্ভারলেস পারফরম্যান্স

Cold starts & serverless performance
৭ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • কোল্ড স্টার্ট ঠিক কী এবং কেন এটি ঘটে
  • কোল্ড বনাম ওয়ার্ম ইনভোকেশনের লেটেন্সি পার্থক্য এবং এটি কখন গুরুত্বপূর্ণ হয়ে ওঠে
  • প্রোভিশনড কনকারেন্সি ও অন্যান্য প্রশমন কৌশল, এবং তাদের নিজস্ব ট্রেড-অফ
  • Python দিয়ে কোল্ড বনাম ওয়ার্ম ইনভোকেশনের একটি লেটেন্সি সিমুলেশন চালিয়ে সরাসরি পার্থক্য দেখা

১ · কোল্ড স্টার্ট কী এবং কেন এটি ঘটে

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

কেন এটি L08-এর সিদ্ধান্ত-কাঠামোর সাথে সরাসরি সংযুক্ত

একটি সবসময়-চালু VM বা কন্টেইনারের এই পেনাল্টি নেই — এটি ইতিমধ্যে ওয়ার্ম এবং প্রস্তুত। তাই উচ্চ- ফ্রিকোয়েন্সি, লেটেন্সি-সংবেদনশীল ওয়ার্কলোডের (যেমন একটি রিয়েল-টাইম ট্রেডিং API) জন্য কোল্ড স্টার্টের অনিশ্চয়তা প্রায়ই গ্রহণযোগ্য নয় — এই কারণেই L08-এর সিদ্ধান্ত-কাঠামো সার্ভারলেসকে সবচেয়ে বেশি উপযুক্ত করে স্বল্প-সময়ের, স্পোরাডিক/ইভেন্ট-ড্রিভেন কাজের জন্য, ক্রমাগত উচ্চ-ট্রাফিক ওয়ার্কলোডের জন্য নয়।

২ · প্রশমন কৌশল

কোল্ড স্টার্টের প্রভাব সম্পূর্ণ দূর না করেও কমানো যায় —

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

লক্ষ্য করুন প্রোভিশনড কনকারেন্সি আসলে সার্ভারলেসের "স্কেল-টু-জিরো, শুধু-ব্যবহারের-জন্য-বিল" মডেলের বিপরীতে একটি সচেতন ট্রেড-অফ — আপনি লেটেন্সি প্রেডিক্টেবিলিটির জন্য কিছু "সবসময়-চালু" খরচ ফিরিয়ে আনছেন, যা সার্ভারলেসের মূল কস্ট-সেভিংস প্রস্তাবের একটি অংশ ছেড়ে দেয়।

Python
# কোল্ড বনাম ওয়ার্ম ইনভোকেশন লেটেন্সি সিমুলেশন
import random

warm_pool = {}       # function_name -> শেষবার কখন ইনভোক হয়েছিল (tick)
WARM_WINDOW = 5       # এই কয়েক টিকের মধ্যে আবার ডাকা হলে এনভায়রনমেন্ট এখনো "ওয়ার্ম" ধরা হয়
COLD_START_MS = 850
WARM_LATENCY_MS = 12

def invoke(function_name, current_tick, warm_pool):
    """function_name-কে current_tick-এ ইনভোক করে — cold/warm সিদ্ধান্ত ও প্রকৃত লেটেন্সি ফেরত দেয়।"""
    last_invoked = warm_pool.get(function_name)
    is_cold = (last_invoked is None) or (current_tick - last_invoked > WARM_WINDOW)
    latency_ms = COLD_START_MS if is_cold else WARM_LATENCY_MS
    warm_pool[function_name] = current_tick  # এখন এই ফাংশনটি সদ্য-ইনভোকড হিসেবে চিহ্নিত হলো
    return is_cold, latency_ms

random.seed(7)  # নির্ধারক ফলাফলের জন্য ফিক্সড সিড
functions = ["resize-image", "send-email", "resize-image", "cleanup-job"]

# একটি বার্স্ট ইনভোকেশন শিডিউল সিমুলেট করা — কিছু ফাংশন ঘনঘন, কিছু কালেভদ্রে ডাকা হয়
invocation_schedule = []
tick = 0
for _ in range(10):
    fn = random.choice(functions)
    invocation_schedule.append((tick, fn))
    tick += random.choice([1, 2, 8])   # কখনো কাছাকাছি সময়ে, কখনো বড় ফাঁক দিয়ে

print(f"{'টিক':>5}{'ফাংশন':18}{'অবস্থা':>8}{'লেটেন্সি(ms)':>16}")
total_cold, total_warm = 0, 0
for current_tick, fn in invocation_schedule:
    is_cold, latency_ms = invoke(fn, current_tick, warm_pool)
    state = "COLD" if is_cold else "WARM"
    if is_cold:
        total_cold += 1
    else:
        total_warm += 1
    print(f"{current_tick:>5}{fn:18}{state:>8}{latency_ms:>16}")

print(f"\nমোট cold invocation: {total_cold}, warm invocation: {total_warm}")

    
লক্ষ্য করুন প্রতিটি ফাংশনের প্রথম ইনভোকেশন সবসময় COLD (কারণ warm_pool-এ এখনো কোনো এন্ট্রি নেই), কিন্তু যদি একই ফাংশন WARM_WINDOW-এর মধ্যে আবার ডাকা হয়, সেটি WARM হয়ে যায় এবং লেটেন্সি প্রায় ৭০ ভাগ কমে যায় (৮৫০ms থেকে ১২ms)। যদি একটি ফাংশন দীর্ঘ বিরতির পর আবার ডাকা হয় (WARM_WINDOW-এর চেয়ে বেশি ব্যবধানে), এটি আবার COLD হয়ে যায় — এই প্যাটার্নই বাস্তব সার্ভারলেস প্ল্যাটফর্মে ঘটে।
মূল কথা · Key takeaway

কোল্ড স্টার্ট সার্ভারলেসের কোনো "বাগ" নয় — এটি স্কেল-টু-জিরো মডেলের একটি প্রত্যক্ষ, অনিবার্য ফলাফল। একটি টিমকে সচেতনভাবে সিদ্ধান্ত নিতে হয় এই লেটেন্সি ট্রেড-অফ গ্রহণযোগ্য কিনা, নাকি প্রোভিশনড কনকারেন্সির মতো প্রশমন কৌশলে বিনিয়োগ করা উচিত — M11-এর পরবর্তী পাঠগুলোতে (L47-L48) আমরা দেখব সার্ভারলেস সিস্টেমগুলো কীভাবে ইভেন্ট বাস ও নিজস্ব CI/CD টুলিং দিয়ে পুরোপুরি অপারেট করা হয়।

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

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

প্র ০১ একটি ফাংশন যদি প্রতি ৩০ সেকেন্ডে অন্তত একবার ইনভোক হয় (একটি "ওয়ার্মিং" শিডিউলড টিকের মাধ্যমে), তাহলে এর ব্যবহারকারীদের জন্য কী সুবিধা হবে, এবং এর সম্ভাব্য খরচ কী?

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

প্র ০২ প্রোভিশনড কনকারেন্সি ব্যবহার করা মানে কি সার্ভারলেসের সব সুবিধা হারানো এবং কার্যত একটি সবসময়-চালু VM-এ ফিরে যাওয়া?

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

প্র ০৩ একটি ব্যাকগ্রাউন্ড ব্যাচ জব (যেমন প্রতিদিন রাতে একবার চলা একটি রিপোর্ট তৈরি) কি কোল্ড স্টার্ট নিয়ে চিন্তিত হওয়া উচিত? কেন বা কেন নয়?

সাধারণত না — কোল্ড স্টার্টের কয়েকশ মিলিসেকেন্ড থেকে কয়েক সেকেন্ড পেনাল্টি একটি রিপোর্ট তৈরির মতো কাজের মোট রানটাইমের তুলনায় নগণ্য, এবং এর ব্যবহারকারী নেই যিনি সরাসরি সেই লেটেন্সি অনুভব করবেন। কোল্ড স্টার্ট মূলত ইন্টারেক্টিভ, ব্যবহারকারী-মুখী রিকোয়েস্টের জন্য গুরুত্বপূর্ণ, যেখানে একজন মানুষ সরাসরি প্রতিক্রিয়ার জন্য অপেক্ষা করছেন।

অনুশীলন

  1. চিন্তা করুন: উপরের কোডে WARM_WINDOW ৫ থেকে ২০-তে বাড়ালে সামগ্রিক cold/warm অনুপাতের উপর কী প্রভাব পড়বে বলে মনে হয়?

    বেশি ইনভোকেশন WARM হিসেবে গণ্য হবে, কারণ একই ফাংশনের দুটি কলের মধ্যে বেশি ব্যবধান থাকলেও এখন সেটি "এখনও ওয়ার্ম" ধরা হবে (২০ টিক পর্যন্ত)। এটি বাস্তব প্ল্যাটফর্মের আচরণের প্রতিফলন — বিভিন্ন প্রোভাইডার/কনফিগারেশনে ওয়ার্ম-রাখার উইন্ডো ভিন্ন হয়, এবং এই মানই cold-start ফ্রিকোয়েন্সি নির্ধারণ করে।

  2. পরীক্ষা করুন: কোডে একটি লাইন যোগ করুন যা মোট সিমুলেটেড সময় (সব ইনভোকেশনের লেটেন্সির যোগফল) প্রিন্ট করে, এবং সেটিকে যদি সবগুলো ইনভোকেশন COLD হতো তার তুলনায় দেখান।

    total_latency = sum of প্রতিটি latency_ms যোগ করে, এবং all_cold_latency = len(invocation_schedule) * COLD_START_MS-এর সাথে তুলনা করলে দেখা যাবে warm-reuse বাস্তব ব্যবহারে কতটা লেটেন্সি বাঁচিয়েছে — সাধারণত অর্ধেকের বেশি ইনভোকেশন WARM হলে মোট সময় উল্লেখযোগ্যভাবে কম আসবে, যা সরাসরি দেখায় কেন প্ল্যাটফর্মগুলো এনভায়রনমেন্ট পুনর্ব্যবহার করার চেষ্টা করে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
L45 · সার্ভারলেস আর্কিটেকচার গভীরভাবে