সরাসরি পর্বে যান
পর্ব ০৩ · ৬৬-এর মধ্যে · মডিউল ১

Back-of-the-envelope হিসাব — QPS, storage, bandwidth আর latency-র সংখ্যা

Back-of-the-Envelope Estimation — QPS, Storage, Bandwidth & Latency Numbers

Taught in Bangla, this lesson teaches back-of-the-envelope estimation: powers of ten and two, bits versus bytes, seconds in a day, and a latency ladder from RAM to cross-continent round trips. Six formulas cover QPS, peak load, storage, bandwidth, cache memory and server count, applied in worked examples for a URL shortener, photo sharing, a chat app and server sizing with utilization and headroom, plus sanity checks and runnable calculators.

এই পর্বে যা শিখবেন

  • নকশার আগে কেন সংখ্যা দরকার — সম্ভাব্যতা, আকার আর দুর্বল জায়গা আগেভাগে খোঁজা
  • Power of 10 বনাম power of 2, bit বনাম byte, আর সময়ের এককে নিশ্চিন্তে হিসাব
  • Latency-র মই: cache, RAM, SSD, disk আর network-এর মোটামুটি মাত্রা
  • QPS, peak, storage, bandwidth, cache memory আর সার্ভারের সংখ্যার সূত্র — চারটি পূর্ণ উদাহরণসহ
  • নিজের বা AI-এর হিসাবে ভুল ধরার sanity check

১ · নকশার আগে সংখ্যা — খামের পেছনের হিসাব কেন

ধরুন একটি দল ছবি শেয়ারিং অ্যাপ বানাবে। একজন বললেন, “সব ছবি একটি ভালো সার্ভারের disk-এ রাখলেই চলবে।” আরেকজন বললেন, “শুরু থেকেই দশটি data center লাগবে।” তর্ক চলতে পারে ঘণ্টার পর ঘণ্টা — অথচ পাঁচ মিনিটের একটি হিসাব মীমাংসা করে দেয়। দিনে ২০ লাখ ছবি, প্রতিটি গড়ে ২ MB হলে প্রতিদিন নতুন ডেটা ৪ TB, বছরে প্রায় ১.৫ PB — ১০১৫ byte-এর মাত্রায়। একটি সার্ভারে এটা ধরে না। আবার ব্যবহারকারী মাত্র কয়েক হাজার হলে দশটি data center নিছক অপচয়।

এই ধরনের দ্রুত, মোটামুটি হিসাবকে বলে back-of-the-envelope estimation — যেন চায়ের দোকানে বসে খামের পেছনে কলম দিয়ে করা হিসাব। এর তিনটি কাজ:

  • সম্ভব কি না (feasibility): নকশাটি আদৌ দাঁড়ায় কি না — যেমন বছরে ১.৫ PB একটি মেশিনে ধরে কি না।
  • আকার ঠিক করা (sizing): কতগুলো সার্ভার, কত TB disk, কত Gbit/s network — আর খরচ কোন মাত্রার।
  • দুর্বল জায়গা আগেভাগে খোঁজা: কোন resource আগে ফুরাবে, সেই bottleneck চেনা। ছবির অ্যাপে সেটি বাইরে পাঠানো ডেটা, URL shortener-এ পড়ার (read) ভিড়, chat-এ লেখার (write) চাপ — তাই তিনটির নকশা তিন দিকে যায়।

বিয়েবাড়ির অভিজ্ঞ বাবুর্চিকে জিজ্ঞেস করুন, ৫০০ অতিথির জন্য কত চাল লাগবে। তিনি মুখে মুখে বলবেন: মাথাপিছু প্রায় ২০০ গ্রাম, তাই ১০০ কেজি; একসাথে বসেন দেড়শো জন, তাই রান্না ব্যাচে ব্যাচে; বড় ডেকচিতে একবারে ২৫ কেজি, তাই চারটি ডেকচি; আর হঠাৎ আসা অতিথির জন্য দশ ভাগ বাড়তি। এখানে system design-এর প্রতিটি উপাদান আছে: অতিথি × মাথাপিছু চাহিদা = মোট চাপ; একসাথে কত জন = peak; একটি ডেকচির ক্ষমতা = একটি সার্ভারের ক্ষমতা; দশ ভাগ বাড়তি = headroom. বাবুর্চির হিসাব ১০০-র জায়গায় ১১০ কেজি হলে ক্ষতি নেই; ১০ কেজি হলে বিপদ।

মূল ধারণা

খামের পেছনের হিসাবের তিন নিয়ম: (১) প্রতিটি ধরে নেওয়া মান আলাদা করে লিখুন, যেমন “ধরা যাক দিনে ১ কোটি নতুন link”; (২) সংখ্যাকে গোল করুন, যাতে মাথায় গুণ-ভাগ করা যায়; (৩) প্রতিটি সংখ্যার সাথে একক রাখুন। উত্তর আসল মানের দুই-তিন গুণের মধ্যে থাকলেই সাধারণত যথেষ্ট, কারণ নকশার সিদ্ধান্ত বদলায় দশ গুণের, অর্থাৎ এক order of magnitude-এর পার্থক্যে।

এই অভ্যাসের সবচেয়ে বিখ্যাত গল্পটি পদার্থবিদ Enrico Fermi-র। ১৯৪৫ সালের জুলাইয়ে প্রথম পারমাণবিক পরীক্ষার (Trinity) সময় তিনি কয়েক টুকরো কাগজ ছেড়ে দেখেন বিস্ফোরণের ধাক্কায় সেগুলো কতদূর সরে, আর তা থেকে শক্তির মোটামুটি হিসাব দেন — প্রায় ১০ কিলোটন TNT. পরে মাপা মান ছিল প্রায় দ্বিগুণ, কিন্তু মাত্রা ঠিক। এ ধরনের হিসাবকে আজ বলা হয় Fermi estimation. সফটওয়্যারে অভ্যাসটি জনপ্রিয় করেন Google-এর প্রকৌশলী Jeff Dean: ২০০৯ সালের দিকের কয়েকটি বক্তৃতায় (যেমন LADIS কর্মশালার keynote) তিনি “Numbers Everyone Should Know” নামে latency-র একটি তালিকা দেখান আর নকশার আগে খামের পেছনে হিসাবের পরামর্শ দেন। তালিকাটি পরে “Latency Numbers Every Programmer Should Know” নামে ছড়িয়ে পড়ে; সংখ্যাগুলো সেই সময়ের hardware-এর, আজকের মাত্রা অংশ ৪-এ।

Requirement (পর্ব ২) জানায় কত ব্যবহারকারী, কত দ্রুত উত্তর চাই, কত দিন ডেটা রাখতে হবে; estimation সেগুলোকে সংখ্যায় বদলায়। পূর্ণ নকশার পথ আসবে পর্ব ৬-এ; আজ শুধু সংখ্যার অংশ, এই ছয় ধাপে:

Estimation-এর ছয় ধাপ

Assumptions → traffic → storage → bandwidth → cache & servers → sanity check

  1. ধরে নেওয়া মানDAU, আকারস্পষ্ট লিখুন
  2. QPSগড়, peak÷ ৮৬,৪০০
  3. Storage× দিন × কপিoverhead-সহ
  4. Bandwidthingress, egress× ৮ = bit
  5. Cache, সার্ভারutilizationheadroom-সহ
  6. যাচাইএকক, মাত্রাদ্বিতীয় পথে
ছবি ৩.১ — প্রতিটি ধাপ আগের ধাপের সংখ্যা ব্যবহার করে; শেষ ধাপে পুরো হিসাব আরেক পথে মিলিয়ে দেখা হয়।

২ · সংখ্যার ভাষা — power of 10, power of 2, bit আর byte

System design-এর সংখ্যাগুলো বিশাল — হাজার, লাখ, কোটি, তারপর আরও বড়। এগুলো সামলানোর সহজ উপায় হলো ১০-এর ঘাতে (power of 10) লেখা: ৩ কোটি = ৩ × ১০৭। ইংরেজি এককের নাম তিন শূন্য পরপর বাড়ে, আর আমাদের লাখ-কোটি বাড়ে অন্য ছন্দে — তাই দুটির একটি সেতু মনে রাখা কাজের:

১০-এর ঘাতইংরেজি নাম আর prefixবাংলায়
১০৩thousand · kilo (K)এক হাজার
১০৫hundred thousandএক লাখ — প্রায় এক দিনের সেকেন্ড!
১০৬million · mega (M)দশ লাখ
১০৭ten millionএক কোটি
১০৯billion · giga (G)একশো কোটি
১০১২trillion · tera (T)এক লাখ কোটি
১০১৫quadrillion · peta (P)এক হাজার লাখ কোটি (১০-এর ঘাতই সহজ)

Bit আর byte — ৮ গুণের ফাঁদ। ৮টি bit মিলে একটি byte. ফাইল, disk আর memory মাপা হয় byte-এ, লেখা হয় বড় হাতের B দিয়ে, যেমন MB বা GB-তে। কিন্তু network-এর গতি মাপা হয় bit-এ, ছোট হাতের b দিয়ে — Mbps বা Mbit/s মানে প্রতি সেকেন্ডে মেগাবিট। তাই ১০০ Mbit/s ইন্টারনেট লাইনে সর্বোচ্চ ১২.৫ MB/s নামে, ১০০ MB/s নয়। ২০ Mbit/s লাইনে ১ GB-এর একটি ফাইল নামাতে লাগে ৮,০০০ Mbit ÷ ২০ = ৪০০ সেকেন্ড, প্রায় ৭ মিনিট — ৫০ সেকেন্ড নয়।

KB নাকি KiB? Computer memory স্বাভাবিকভাবে ২-এর ঘাতে বাড়ে, তাই বহু বছর “1 KB” বলতে কখনো ১,০০০ আর কখনো ১,০২৪ byte বোঝানো হতো। বিভ্রান্তি দূর করতে IEC (International Electrotechnical Commission) ১৯৯৮ সালে আলাদা নাম চালু করে — binary prefix: KiB (kibibyte) = ২১০ = ১,০২৪ byte, MiB = ২২০, GiB = ২৩০। আর KB, MB, GB থাকল দশমিক অর্থে: ১০৩, ১০৬, ১০৯। বাস্তবে disk নির্মাতা আর network দশমিক একক ব্যবহার করে, RAM-এর আকার আসলে binary (১৬ GB লেখা RAM আসলে ১৬ GiB), আর অপারেটিং সিস্টেমভেদে দেখানোর নিয়ম আলাদা।

দুটির ফারাক কত? k-তম prefix-এ binary মান ২১০k, দশমিক মান ১০৩k, তাই অনুপাত (১,০২৪ ÷ ১,০০০)k, অর্থাৎ ১.০২৪-এর k-তম ঘাত। ফারাক তাই প্রতি ধাপে মোটামুটি ২.৪% করে বাড়ে (আসলে গুণ হয়)। নিচের কোড হিসাবটি নিজে করে দেখায়:

// Decimal (SI) prefixes vs binary (IEC) prefixes: how far apart do they drift?
const pairs = [["KB", "KiB"], ["MB", "MiB"], ["GB", "GiB"], ["TB", "TiB"], ["PB", "PiB"]];
console.log("pair        decimal  binary (bytes)       binary is bigger by");
pairs.forEach(([d, b], i) => {
  const k = i + 1;                       // 1 = kilo, 2 = mega, 3 = giga ...
  const dec = 10 ** (3 * k), bin = 2 ** (10 * k);
  const err = (bin / dec - 1) * 100;     // equals (1.024^k - 1) * 100
  console.log((d + " vs " + b).padEnd(12) + ("10^" + 3 * k).padEnd(9) +
              String(bin).padEnd(21) + err.toFixed(1) + "%");
});
const disk = 1e12;                       // a "1 TB" disk, as the maker counts it
console.log("A 1 TB disk = " + (disk / 2 ** 30).toFixed(1) + " GiB (a GiB-based display shows ~" +
            Math.floor(disk / 2 ** 30) + ")");
console.log("A 100 Mbit/s link carries at most " + 100e6 / 8 / 1e6 + " MB/s (8 bits = 1 byte)");
console.log("1 PB vs 1 PiB differ by " + ((2 ** 50 - 1e15) / 1e12).toFixed(0) + " TB");

আউটপুট:

pair        decimal  binary (bytes)       binary is bigger by
KB vs KiB   10^3     1024                 2.4%
MB vs MiB   10^6     1048576              4.9%
GB vs GiB   10^9     1073741824           7.4%
TB vs TiB   10^12    1099511627776        10.0%
PB vs PiB   10^15    1125899906842624     12.6%
A 1 TB disk = 931.3 GiB (a GiB-based display shows ~931)
A 100 Mbit/s link carries at most 12.5 MB/s (8 bits = 1 byte)
1 PB vs 1 PiB differ by 126 TB

শতাংশের কলাম ১.০২৪-এর ঘাত থেকে আসে: ২.৪%, ৪.৯%, ৭.৪%, ১০%, ১২.৬%. একটি “1 TB” disk GiB-ভিত্তিক হিসাবে প্রায় ৯৩১ দেখায়; কিছু সিস্টেম এর পাশে “GB” লেখে, তাই মনে হয় জায়গা “হারিয়ে গেছে”। PB-তে ফারাক ১২৬ TB — বড় storage কেনায় এটি টাকার অঙ্কে বড়। কিন্তু estimation-এ ২–১০% সাধারণত উপেক্ষণীয়, কারণ ধরে নেওয়া মানগুলোর অনিশ্চয়তাই অনেক বেশি। যে গুণক কখনো উপেক্ষা করা যায় না, তা হলো bit-byte-এর ৮।

৩ · সময়ের হিসাব আর এক significant figure

QPS (queries per second, প্রতি সেকেন্ডে অনুরোধ) বের করতে প্রায় সবসময় একটি ভাগ লাগে: দিনের মোট অনুরোধ ÷ এক দিনের সেকেন্ড। এক দিনে ২৪ × ৬০ × ৬০ = ৮৬,৪০০ সেকেন্ড, যা প্রায় ১০৫ — প্রায় এক লাখ। এখান থেকে আমাদের জন্য চমৎকার একটি মনে রাখার কৌশল:

দিনে ১ লাখ অনুরোধ ≈ প্রতি সেকেন্ডে ১টি
দিনে ১ কোটি ≈ সেকেন্ডে ~১০০ (ঠিক হিসাবে ১১৬)
দিনে ১০০ কোটি ≈ সেকেন্ডে ~১০,০০০ (ঠিক হিসাবে ১১,৫৭৪)

১০৫ দিয়ে ভাগ করলে উত্তর আসল মানের ৮৬.৪% আসে, অর্থাৎ প্রায় ১৪% কম। মাথায় হিসাবের জন্য এটুকু চলে; চূড়ান্ত সংখ্যায় ৮৬,৪০০ ব্যবহার করুন, অথবা ১০৫-এর উত্তরকে ১.১৬ দিয়ে গুণ করুন। বড় সময়ের জন্য:

সময়সেকেন্ডমনে রাখার রূপ
১ ঘণ্টা৩,৬০০≈ ৪ × ১০৩
১ দিন৮৬,৪০০≈ ১০৫ (প্রায় ১ লাখ)
১ মাস (৩০ দিন)২৫,৯২,০০০≈ ২.৬ × ১০৬
১ বছর (৩৬৫ দিন)৩,১৫,৩৬,০০০≈ ৩ × ১০৭ — π × ১০৭-এর খুব কাছে

এক significant figure আর ১০-এর ঘাতে গুণ

মাথায় বড় গুণ করার কৌশল: প্রতিটি সংখ্যাকে a × ১০n রূপে লিখুন, a-কে এক বা দুই significant figure-এ গোল করুন, তারপর a-গুলো গুণ করুন আর ঘাতগুলো যোগ করুন। যেমন, দিনে ৪ TB নতুন ছবি হলে বছরে কত?

4 × 1012 B/day × 365 day ≈ 4 × 1012 × 4 × 102 = 16 × 1014 = 1.6 × 1015 B ≈ 1.6 PB

ঠিক উত্তর ১.৪৬ PB — ৩৬৫-কে ৪০০ ধরায় আমাদের উত্তর প্রায় ১০% বেশি। এক significant figure-এ গোল করলে একটি সংখ্যায় সর্বোচ্চ প্রায় ৩৩% ভুল হতে পারে (যেমন ১.৫ → ২)। কয়েকটি সংখ্যার কোনোটি ওপরে, কোনোটি নিচে গোল করলে ভুলগুলো অনেকটা কাটাকাটি হয়; সব একদিকে গোল করলে জমে যায় — তিনটিকেই ৩৩% বাড়ালে গুণফল (৪/৩)৩ ≈ ২.৪ গুণ বড় হয়। তখনো এক মাত্রার ভেতরে, কিন্তু সতর্ক থাকুন।

একক কখনো ফেলবেন না। (অনুরোধ/দিন) ÷ (সেকেন্ড/দিন) = অনুরোধ/সেকেন্ড — “দিন” কাটাকাটি হয়ে সঠিক একক বেরোল। একক না মিললে বুঝবেন সূত্রই ভুল। অংশ ৯-এ এই নীতিতেই একটি ছোট “একক পরীক্ষক” চালাব।

৪ · Latency-র মই — কোন কাজে মোটামুটি কত সময়

Storage আর bandwidth-এর পাশাপাশি তৃতীয় যে সংখ্যা নকশা বদলে দেয়, তা হলো latency — একটি কাজ শুরু থেকে শেষ হতে কত সময় লাগে। মানগুলো মুখস্থ নয়, মাত্রা হিসেবে মনে রাখুন; যন্ত্র, প্রজন্ম আর দূরত্বভেদে বদলায় বলে পরিসর দেওয়া হলো। শেষ কলামে সব সময়কে ১০০ কোটি গুণ বড় করে মানুষের মাপে আনা হয়েছে।

কাজমোটামুটি latency১ ns = ১ সেকেন্ড ধরলে
CPU-র L1 cache থেকে পড়া~১ ns (প্রায় ০.৫–১ ns)১ সেকেন্ড
RAM (main memory) থেকে পড়া~১০০ nsপ্রায় ১.৭ মিনিট
SSD থেকে একটি random readকয়েক দশ থেকে ~১৫০ µs (ধরুন ১০০ µs)প্রায় ১.২ দিন
একই data center-এ round trip (RTT)~০.১–০.৫ msপ্রায় ৫.৮ দিন (০.৫ ms ধরলে)
Hard disk-এর একটি seek~৫–১০ msপ্রায় ১১৬ দিন (১০ ms ধরলে)
মহাদেশ পেরিয়ে round trip~১০০–২৫০ ms (ধরুন ১৫০ ms)প্রায় ৪.৮ বছর

Memory-র দিকটা — RAM কেন cache-এর চেয়ে ধীর, আর locality কেন কাজ করে — বিস্তারিত আছে Computer Architecture কোর্সের মেমরি হায়ারার্কি পর্বে। System design-এর জন্য এই তালিকা থেকে তিনটি কাজের উপসংহার বেরোয়:

  • Memory থেকে পড়া disk বা network-এর চেয়ে অন্তত হাজার গুণ সস্তা। এজন্যই cache: যা বারবার লাগে, তার কপি RAM-এ।
  • একটি hard disk সেকেন্ডে মাত্র ~১০০–২০০টি random read পারে (১ ÷ ১০ ms = ১০০, ১ ÷ ৫ ms = ২০০)। এই মাপের নাম IOPS. হাজার হাজার random read চাইলে SSD বা memory লাগবে।
  • পরপর হওয়া network call গুনুন। একই data center-এ ১০০টি call একটির পর একটি হলে শুধু round trip-এই ৫০ ms; মহাদেশ পেরোনো ৬টি হলে ৯০০ ms — পাতা খুলতেই প্রায় এক সেকেন্ড।

আলোর গতি — যে সীমা কোনো প্রকৌশলে কমে না

মহাদেশ পেরোনো latency কেন এত বেশি, আর কেন কমানো যায় না? Optical fiber-এর ভেতরে আলো চলে শূন্যস্থানে আলোর গতির প্রায় দুই-তৃতীয়াংশে, প্রায় ২ × ১০৫ km/s — অর্থাৎ প্রতি ১,০০০ km-এ এক দিকে প্রায় ৫ ms. ঢাকা থেকে লন্ডনের সরাসরি দূরত্ব প্রায় ৮,০০০ km. তাই round trip-এর তাত্ত্বিক সর্বনিম্ন মান:

RTT ≥ 2 × 8,000 km ÷ 200,000 km/s = 0.08 s = 80 ms

বাস্তবে cable সোজা পথে যায় না, পথে router আর অপেক্ষা যোগ হয়, তাই মাপা মান বেশ বেশি। CPU যত দ্রুতই হোক, এই ৮০ ms কমবে না — উপায় একটাই, ডেটা ব্যবহারকারীর কাছে রাখা। এখান থেকেই CDN আর edge (পর্ব ১৭), আর একাধিক region-এ সিস্টেম চালানো (পর্ব ৫১)। Latency, throughput আর percentile-এর পূর্ণ আলোচনা পরের পর্বে, পর্ব ৪-এ।

আরও গভীরে: Jeff Dean-এর তালিকার আগেও Peter Norvig তাঁর প্রবন্ধ “Teach Yourself Programming in Ten Years”-এ সাধারণ PC-র কাজগুলোর মোটামুটি সময়ের একটি তালিকা দিয়েছিলেন। পরে কেউ কেউ hardware-এর উন্নতির প্রবণতা ধরে বছরভিত্তিক interactive সংস্করণও বানিয়েছেন — সেগুলোও অনুমান, মাপা মান নয়। বাস্তব capacity planning-এর চর্চা নিয়ে John Allspaw-এর বই “The Art of Capacity Planning” (২০০৮), আর queueing-এর গণিতে Leonard Kleinrock-এর “Queueing Systems” (১৯৭৫) ক্লাসিক হিসেবে পরিচিত।

৫ · ছয়টি সূত্র — অনুরোধ থেকে সার্ভার পর্যন্ত

এবার হাতিয়ারগুলো এক জায়গায়। প্রায় প্রতিটি estimation এই ছয়টি সূত্রের কোনো মিশ্রণ। প্রতিটির input আসে requirement থেকে, অথবা “ধরা যাক” বলে স্পষ্ট লেখা হয়।

কীসূত্রখেয়াল রাখুন
১. গড় QPSদিনের মোট অনুরোধ ÷ ৮৬,৪০০; দিনের অনুরোধ = DAU × প্রতি জনের অনুরোধRead আর write আলাদা; অনেক সেবায় read:write অনুপাত ১০:১ থেকে ১০০:১ বা বেশি
২. Peak QPSগড় QPS × peak factorধরে নেওয়া মান; সাধারণ দিনে প্রায়ই ২–৫ গুণ ধরা হয়, পরীক্ষার ফল বা ঈদের টিকিটের মতো ঘটনায় বহু গুণ
৩. Storageপ্রতিদিনের নতুন record × record-এর আকার × রাখার দিন × replication factorIndex, metadata, log আর ফাঁকা জায়গার জন্য overhead, প্রায়ই ২০–৫০% ধরা হয়
৪. BandwidthQPS × প্রতি অনুরোধে কত byte (payload)ভেতরে আসা (ingress) আর বাইরে যাওয়া (egress) আলাদা; network-এর সাথে মেলাতে × ৮ করে bit/s
৫. Cache memoryদিনে যত আলাদা জিনিস পড়া হয় × জনপ্রিয় অংশ (যেমন ২০%) × আকার“২০% জিনিসেই ৮০% read” একটি ৮০/২০ heuristic — নিয়ম নয়
৬. সার্ভার⌈peak QPS ÷ (একটি সার্ভারের ক্ষমতা × লক্ষ্য utilization)⌉একটির ক্ষমতা আসে load test থেকে; তারপর নষ্ট হওয়ার জন্য বাড়তি ১–২টি

Storage-এর সূত্রটি মুদি দোকানের বাকির খাতার মতো: প্রতিদিন কয়েক পাতা ভরে, খাতা ফুরালে নতুন খাতা। আগুন বা চুরির ভয়ে দোকানি যদি প্রতিটি পাতার ফটোকপি আরও দুই জায়গায় রাখেন, কাগজ লাগে তিন গুণ — এই ফটোকপিই replication.

Cache-এর সূত্রটি বুঝতে পাইকারি আড়ত আর পাড়ার খুচরা দোকানের কথা ভাবুন। আড়তে হাজার রকম মাল, কিন্তু বেশিরভাগ ক্রেতা চান চাল-ডাল-তেল-চিনির মতো অল্প কয়েকটি জিনিস। দোকানি সেগুলো হাতের কাছে রাখেন, বাকিগুলো দরকার হলে আড়ত থেকে আনান। Cache এই খুচরা দোকান, database হলো আড়ত, আর সবচেয়ে বেশি চাওয়া অংশটুকু — hot set — থাকে দ্রুত RAM-এ। কতটুকু রাখতে হবে, তার হিসাবই সূত্র ৫।

নিচের calculator ছয়টি সূত্র একসাথে চালায়। ধরে নেওয়া মানগুলো URL shortener-এর — যে উদাহরণ পরের অংশে ধাপে ধাপে করব। মান বদলে নিজের কোনো অ্যাপের হিসাব করে দেখুন।

// Back-of-the-envelope calculator. Every input is an ASSUMPTION: change it and run again.
const A = {
  name: "URL shortener",
  writesPerDay: 10e6,     // new short URLs per day
  readsPerDay: 1000e6,    // redirects per day (read:write = 100:1)
  recordBytes: 500,       // one stored record, incl. metadata
  responseBytes: 500,     // bytes sent back for one read
  peakFactor: 3,          // busiest second / average second
  years: 5, replication: 3,
  serverCapacity: 2000,   // req/s one server handled in a load test
  targetUtil: 0.6,        // run servers at 60% of that at peak
};
const DAY = 86400;
function si(x, unit) {    // 46296296 -> "46.3 Mbit/s" (powers of 10)
  const p = ["", "K", "M", "G", "T", "P", "E"]; let i = 0;
  while (x >= 1000 && i < p.length - 1) { x /= 1000; i++; }
  return (x >= 100 ? x.toFixed(0) : x >= 10 ? x.toFixed(1) : x.toFixed(2)) + " " + p[i] + unit;
}
const wQps = A.writesPerDay / DAY, rQps = A.readsPerDay / DAY;
const peak = (wQps + rQps) * A.peakFactor;
const perDay = A.writesPerDay * A.recordBytes;            // raw bytes per day
const perYear = perDay * 365 * A.replication;             // with all copies
const egress = rQps * A.responseBytes;                    // bytes per second
const servers = Math.ceil(peak / (A.serverCapacity * A.targetUtil));
console.log("Scenario: " + A.name + "  (every input is an assumption)");
console.log("avg QPS      write " + wQps.toFixed(1) + ", read " + rQps.toFixed(0));
console.log("peak QPS     " + peak.toFixed(0) + "  (x" + A.peakFactor + ")");
console.log("new data     " + si(perDay, "B") + "/day raw, " + si(perYear, "B") + "/year with x" + A.replication);
console.log(("in " + A.years + " yr").padEnd(13) + si(perYear * A.years, "B") + "  (x" + A.replication + ", before indexes)");
console.log("egress       avg " + si(egress * 8, "bit/s") + ", peak " + si(egress * 8 * A.peakFactor, "bit/s"));
console.log("servers      " + servers + " at peak, then add 1-2 spares");

আউটপুট:

Scenario: URL shortener  (every input is an assumption)
avg QPS      write 115.7, read 11574
peak QPS     35069  (x3)
new data     5.00 GB/day raw, 5.47 TB/year with x3
in 5 yr      27.4 TB  (x3, before indexes)
egress       avg 46.3 Mbit/s, peak 139 Mbit/s
servers      30 at peak, then add 1-2 spares

প্রতিটি লাইন একটি সূত্র। গড় write ১১৫.৭/s আর read ১১,৫৭৪/s (১০০ গুণ); peak = (১১৫.৭ + ১১,৫৭৪) × ৩ ≈ ৩৫,০৬৯/s. Storage দিনে ৫ GB raw, বছরে তিন কপিসহ ৫.৪৭৫ TB (কম্পিউটারে সংখ্যাটি ৫.৪৭৪৯৯… হিসেবে জমা থাকে বলে ৫.৪৭ ছাপা হয়), ৫ বছরে ২৭.৪ TB. Egress গড়ে ৪৬.৩ Mbit/s, peak-এ ১৩৯ Mbit/s; সার্ভার ৩০টি। si() ফাংশন ১০-এর ঘাতে একক বসায় (K = ১,০০০), কারণ network আর disk দশমিক একক ব্যবহার করে। peakFactor ৩ থেকে ১০ করে চালান — কোন লাইন বদলায়, কোনগুলো একই থাকে?

৬ · উদাহরণ ক — URL shortener, ধাপে ধাপে

URL shortener লম্বা একটি link-কে ছোট একটি code-এ বদলায় (যেমন s.example/x7Kp2Qa), আর কেউ ছোট link-এ গেলে তাঁকে আসল ঠিকানায় পাঠিয়ে (redirect) দেয়। পুরো নকশা আসবে পর্ব ৫৪-এ; এখানে শুধু সংখ্যা। ধরা যাক (সব মান কাল্পনিক):

  • দিনে ১ কোটি (১০৭) নতুন ছোট link তৈরি হয়।
  • প্রতিটি link গড়ে ১০০ বার খোলা হয় — read:write = ১০০:১, এটিও ধরে নেওয়া।
  • একটি record (ছোট code, আসল URL, সময়, মালিক, মেয়াদ) প্রায় ৫০০ byte; redirect-এর উত্তরও প্রায় ৫০০ byte.
  • ডেটা রাখতে হবে ৫ বছর, প্রতিটির ৩টি কপি; peak factor ৩।
  1. ধরে নেওয়া10^7/dayinput
  2. গড় QPS116 · 11.6Kwrite · read
  3. Peak35K/s× ৩
  4. Storage27 TB৫ বছর, ৩ কপি
  5. Bandwidth139 Mbit/speak egress
  6. Cache~100 GB৮০/২০
হিসাবের খাতা
বিষয়
সূত্র
মান
  1. ধাপ ১ — ধরে নেওয়া মান লিখে ফেলা। Input-গুলো আগে খাতায় স্পষ্ট লিখুন। ইন্টারভিউতে প্রায়ই সংখ্যা দেওয়া হয় না; তখন যুক্তিসহ নিজে একটি মান ধরে নিন আর মুখে বলে দিন। কোনো মান পরে বদলালে কোন ফল বদলাবে, তা এই তালিকা থেকেই বোঝা যায়।
  2. ধাপ ২ — গড় write QPS. ১০৭ ÷ ৮৬,৪০০ ≈ ১১৫.৭টি write প্রতি সেকেন্ডে। মাথায় হিসাব: ১ কোটি ÷ ১ লাখ = ১০০ — ১৪% কম, কিন্তু মাত্রা ঠিক। Write খুব কম; নকশার চাপ এদিকে নয়।
  3. ধাপ ৩ — read আর peak. প্রতিটি write-এর বিপরীতে ১০০ read, তাই গড়ে ১১,৫৭৪ read/s. সবচেয়ে ব্যস্ত সময়ে ৩ গুণ: প্রায় ৩৪,৭২২ read/s; write যোগ করলে মোট ≈ ৩৫,০৬৯/s. এই সংখ্যাটিই সার্ভার আর cache-এর আকার ঠিক করবে।
  4. ধাপ ৪ — কতগুলো record জমবে। প্রতিদিন ১ কোটি, ৫ বছরে ১০৭ × ৩৬৫ × ৫ = ১.৮২৫ × ১০১০, অর্থাৎ ১,৮২৫ কোটি record. ৬২ রকম অক্ষরের (a–z, A–Z, 0–9) ৭ অক্ষরের code-এ প্রায় ৩.৫ লাখ কোটি সম্ভাবনা — যথেষ্ট।
  5. ধাপ ৫ — storage. ১.৮২৫ × ১০১০ × ৫০০ B = ৯.১২৫ × ১০১২ B ≈ ৯.১ TB raw ডেটা; তিন কপিতে ≈ ২৭.৪ TB. Index আর অন্যান্য overhead ধরলে আরও কিছু বেশি। একটি বড় database মেশিনে হয়তো ধরানো যায়, কিন্তু বৃদ্ধি আর backup মিলিয়ে ডেটা কয়েক মেশিনে ভাগ করার (sharding, পর্ব ২৩) কথা ভাবতে হবে।
  6. ধাপ ৬ — bandwidth. প্রতিটি redirect-এর উত্তর ৫০০ byte: ১১,৫৭৪ × ৫০০ ≈ ৫.৭৯ MB/s, × ৮ = ৪৬.৩ Mbit/s গড়ে, peak-এ ≈ ১৩৯ Mbit/s. ভেতরে আসা write-এর ডেটা মাত্র ≈ ০.৪৬ Mbit/s. এখানে network কোনো সমস্যা নয় — এটিও একটি কাজের উপসংহার।
  7. ধাপ ৭ — cache. দিনে ১০৯ read. ৮০/২০ heuristic অনুযায়ী জনপ্রিয় ২০%-কে RAM-এ রাখলে: ০.২ × ১০৯ × ৫০০ B = ১০১১ B = ১০০ GB. একই link বারবার পড়া হয় বলে আসল প্রয়োজন আরও কম — এটি উদার অনুমান। ১০০ GB কয়েকটি cache সার্ভারের RAM-এ সহজেই ধরে, আর আশা করা যায় বেশিরভাগ read database পর্যন্ত যাবে না।

এবার সংখ্যাগুলো নকশার ছবিতে বসাই — প্রতিটি হিসাব একটি বাক্সের আকার বা তীরের ভার ঠিক করে:

URL shortener — হিসাবের সংখ্যা নকশার কোথায় বসে

Peak QPS sizes the servers, hot reads size the cache, storage sizes the database

URL shortener-এর নকশায় estimation-এর সংখ্যা ব্যবহারকারী · clients browser, mobile app অনুরোধ, peak 35K req/s egress, peak 139 Mbit/s Load balancer অনুরোধ সার্ভারগুলোতে ভাগ প্রতিটিতে ≤ 1,200/s App servers × 30 (+2) ক্ষমতা 2,000/s · লক্ষ্য 60% read miss আর write Cache (RAM) hot set ~100 GB 80/20 heuristic Database 9.1 TB raw (5 y) × 3 copies = 27 TB write: গড় 116/s, peak 347/s ৫ বছরে ১,৮২৫ কোটি record
ছবি ৩.২ — Peak QPS থেকে সার্ভারের সংখ্যা, read-এর ভিড় থেকে cache-এর আকার, storage থেকে database-এর আকার। সব মান ধরে নেওয়া input থেকে হিসাব করা; দাগকাটা তীর ফেরত পথ।

উপসংহার: URL shortener-এর চাপ পড়ে read-এর পথে, তাই নকশার মূল প্রশ্ন cache আর দ্রুত খোঁজা; storage মাঝারি, network হালকা। সামনের load balancer অনুরোধ ভাগ করে, কিন্তু ভিড় সামলায় cache — পর্ব ৫৪-এর নকশার দিক এখানেই ঠিক হয়ে যায়।

৭ · উদাহরণ খ ও গ — ছবি শেয়ারিং আর chat অ্যাপ

এবার বড় ফাইলের সিস্টেম। একটি ছবি শেয়ারিং অ্যাপ (কাল্পনিক) — ধরা যাক:

  • দিনে ২০ লাখ (২ × ১০৬) ছবি upload হয়; মূল ছবি আর ছোট সংস্করণ মিলিয়ে গড়ে ২ MB.
  • দিনে ২০ কোটি (২ × ১০৮) বার ছবি দেখা হয়; ফোনে পাঠানো সংস্করণ গড়ে ২০০ KB.
  • প্রতিটি ছবির ৩টি কপি, ছবি কখনো মোছা হয় না, peak factor ২।
  1. Upload4 TB/dayনতুন ডেটা
  2. Storage4.38 PB/yr৩ কপিতে
  3. Ingress370 Mbit/sগড়
  4. Egress3.7 Gbit/sগড়
  5. CDNobject storageসিদ্ধান্ত
হিসাবের খাতা
বিষয়
সূত্র
মান
  1. ধাপ ১ — প্রতিদিন কত নতুন ডেটা। ২০ লাখ ছবি × ২ MB = ৪ × ১০১২ byte, অর্থাৎ প্রতিদিন ৪ TB. URL shortener-এর সারা বছরের ডেটা (তিন কপিসহ প্রায় ৫.৫ TB) এখানে আসে দেড় দিনেরও কম সময়ে।
  2. ধাপ ২ — বছরের storage. ৪ TB × ৩৬৫ = ১,৪৬০ TB ≈ ১.৪৬ PB raw; তিন কপিতে ≈ ৪.৩৮ PB — প্রতি বছর। ছবি কখনো মোছা হয় না বলে প্রতি বছর এটি যোগ হতেই থাকবে। এই মাত্রায় সাধারণ database নয়, লাগে object storage (পর্ব ২৬)।
  3. ধাপ ৩ — upload-এর bandwidth. ৪ TB ÷ ৮৬,৪০০ s ≈ ৪৬.৩ MB/s. Network-এর ভাষায় × ৮ = প্রায় ৩৭০ Mbit/s গড়ে, আর peak-এ (× ২) প্রায় ৭৪১ Mbit/s. এখানে MB/s আর Mbit/s গুলিয়ে ফেললে লাইন কেনায় ৮ গুণ ভুল হতো।
  4. ধাপ ৪ — দেখার bandwidth. ২০ কোটি × ২০০ KB = প্রতিদিন ৪০ TB বাইরে যায়। ভাগ করলে ≈ ৪৬৩ MB/s ≈ ৩.৭ Gbit/s গড়ে, peak-এ প্রায় ৭.৪ Gbit/s. অনেক cloud সেবায় বাইরে যাওয়া ডেটার জন্য আলাদা খরচ ধরা হয়, তাই এই সংখ্যা সরাসরি মাসিক বিলে যায়।
  5. ধাপ ৫ — অনুপাত দেখুন। Byte-এর হিসাবে egress ingress-এর ১০ গুণ; অনুরোধের সংখ্যায় ১০০ গুণ (প্রতি সেকেন্ডে ≈ ২৩টি upload-এর তুলনায় ≈ ২,৩১৫ বার দেখা)। পড়ার পথ লেখার পথের চেয়ে অনেক ভারী — এটাই নকশার দিক দেখায়।
  6. ধাপ ৬ — সিদ্ধান্ত। বিপুল egress বলছে ছবি পাঠাতে হবে ব্যবহারকারীর কাছের CDN থেকে (পর্ব ১৭)। বিশাল storage বলছে object storage, আর তিনটি পূর্ণ কপির বদলে erasure coding দিলে জায়গা প্রায় অর্ধেক: ×৩-এর জায়গায় ×১.৫, বছরে প্রায় ২.২ PB কম।

উদাহরণ গ — chat অ্যাপ: ছোট বার্তা, বিশাল সংখ্যা

এবার উল্টো চরিত্রের সিস্টেম — জিনিস ছোট, সংখ্যা অগণিত। ধরা যাক একটি chat অ্যাপ (কাল্পনিক): দৈনিক সক্রিয় ব্যবহারকারী ৫ কোটি, প্রত্যেকে দিনে ৪০টি বার্তা পাঠান, একটি বার্তা metadata-সহ ২০০ byte, peak factor ৫।

কীহিসাবফল
দিনে বার্তা৫ × ১০৭ × ৪০২ × ১০৯ (২০০ কোটি)
গড় বার্তা প্রতি সেকেন্ডে২ × ১০৯ ÷ ৮৬,৪০০≈ ২৩,১৪৮
Peak বার্তা প্রতি সেকেন্ডে২৩,১৪৮ × ৫≈ ১,১৫,৭৪১
দিনে storage২ × ১০৯ × ২০০ B৪০০ GB
বছরে storage৪০০ GB × ৩৬৫১৪৬ TB raw; তিন কপিতে ৪৩৮ TB

এখানে চাপ write-এর দিকে: peak-এ প্রতি সেকেন্ডে এক লাখের বেশি বার্তা লিখতে হবে। আর group chat-এ একটি বার্তা থেকে অনেকগুলো delivery তৈরি হয় — একে বলে fan-out, যা বাইরে যাওয়া বার্তার সংখ্যা কয়েক গুণ বাড়ায় (পর্ব ৫৫)। বার্তা ছোট বলে bandwidth মাঝারি: গড়ে প্রায় ৩৭ Mbit/s ভেতরে আসে।

কিন্তু একটি জিনিস এতক্ষণ ধরা হয়নি — বৃদ্ধি। সফল অ্যাপে প্রতি বছর ব্যবহার বাড়ে। নিচের কোড বছরে ৪০% বৃদ্ধি (ধরে নেওয়া), তিনটি কপি আর index-metadata-র জন্য ৩০% overhead নিয়ে ৫ বছরের হিসাব করে:

// Storage growth for a chat service. All inputs are assumptions: change them and run again.
const perDay0 = 400e9;    // year 1: 2 billion messages/day x 200 bytes = 400 GB new data per day
const growth = 0.40;      // new data per day grows 40% every year
const replication = 3;    // three copies of every byte
const overhead = 1.3;     // indexes, metadata, free space: +30%
const years = 5;
const TB = 1e12, f = (x) => x.toFixed(0);
const row = (a, b, c, d, e) => a.padEnd(5) + b.padStart(9) + c.padStart(13) + d.padStart(12) + e.padStart(14);
let total = 0, flat = 0;
console.log(row("year", "new/day", "added/year", "total raw", "provisioned"));
for (let y = 1; y <= years; y++) {
  const perDay = perDay0 * (1 + growth) ** (y - 1);
  const added = perDay * 365;
  total += added;
  flat += perDay0 * 365;                  // the same years with no growth
  console.log(row(String(y), f(perDay / 1e9) + " GB", f(added / TB) + " TB", f(total / TB) + " TB",
                  f(total * replication * overhead / TB) + " TB"));
}
console.log("provisioned = total raw x" + replication + " copies x" + overhead + " overhead");
console.log("No growth: " + f(flat / TB) + " TB raw after " + years + " years, not " + f(total / TB) + " TB");

আউটপুট:

year   new/day   added/year   total raw   provisioned
1       400 GB       146 TB      146 TB        569 TB
2       560 GB       204 TB      350 TB       1367 TB
3       784 GB       286 TB      637 TB       2483 TB
4      1098 GB       401 TB     1037 TB       4045 TB
5      1537 GB       561 TB     1598 TB       6232 TB
provisioned = total raw x3 copies x1.3 overhead
No growth: 730 TB raw after 5 years, not 1598 TB

প্রথম বছরে যোগ হয় ১৪৬ TB raw, পঞ্চম বছরে একাই ৫৬১ TB. পাঁচ বছরের raw মোট ১,৫৯৮ TB; বৃদ্ধি না ধরলে ৭৩০ TB — দ্বিগুণেরও বেশি তফাত। কপি আর overhead-সহ জোগাড় রাখতে হবে প্রায় ৬,২৩২ TB ≈ ৬.২ PB. বৃদ্ধিটি একটি geometric series: n বছরের মোট = প্রথম বছর × ((১ + g)n − ১) ÷ g. g = ০.৪ আর n = ৫ বসালে ১৪৬ × (১.৪৫ − ১) ÷ ০.৪ ≈ ১,৫৯৮ TB — কোডের সাথে মেলে। growth শূন্য করে চালালে শেষ লাইনের দুটি সংখ্যা সমান হবে।

৮ · উদাহরণ ঘ — কতগুলো সার্ভার: utilization আর headroom

URL shortener-এর peak ছিল প্রায় ৩৫,০৬৯ অনুরোধ/সেকেন্ড। কতগুলো সার্ভার লাগবে? সরল উত্তর — একটি সার্ভার যত সামলায়, তা দিয়ে ভাগ। কিন্তু আগে দুটি প্রশ্ন: একটি সার্ভার আসলে কত সামলায়, আর তাকে কতটা ব্যস্ত রাখা নিরাপদ?

প্রথম প্রশ্নের উত্তর আসে মাপ থেকে: load test-এ চাপ বাড়িয়ে দেখা হয় কোন চাপ পর্যন্ত latency, বিশেষ করে p99 (পর্ব ৪), গ্রহণযোগ্য থাকে। দ্বিতীয়টির উত্তর queueing-এর গণিতে।

ব্যাংকের একটি কাউন্টারের কথা ভাবুন। ক্যাশিয়ার দিনের অর্ধেক সময় ফাঁকা থাকলে টোকেন নিয়ে এলেই ডাক পড়ে। কিন্তু মাসের শুরুতে বেতনের দিনে তিনি প্রায় পুরো সময় ব্যস্ত — সেদিন সামান্য বাড়তি ভিড়েই টোকেনের সারি হলঘর ভরে ফেলে। কাজের গতি একই, অথচ অপেক্ষা বিস্ফোরিত।

এর গাণিতিক রূপ সবচেয়ে সরল queueing মডেল M/M/1-এ (এলোমেলো আগমন, একটি সার্ভার): একটি অনুরোধের গড় মোট সময় T = S ÷ (১ − ρ), যেখানে S হলো একটি অনুরোধের নিজের কাজের সময় আর ρ হলো utilization, অর্থাৎ সার্ভার সময়ের কত অংশ ব্যস্ত।

ρ = 0.5 → 2S · ρ = 0.6 → 2.5S · ρ = 0.8 → 5S · ρ = 0.9 → 10S · ρ = 0.99 → 100S

৬০% থেকে ৯০%-এ গেলে গড় সময় চার গুণ, ৯৯%-এ চল্লিশ গুণ। বাস্তব সিস্টেম এই মডেলের মতো সরল নয়, কিন্তু বক্ররেখার আকার একই — ১-এর কাছে গিয়ে খাড়া ওপরে ওঠে। Little-এর সূত্র আর queueing-এর পূর্ণ যুক্তি পর্ব ৪-এ, overload সামলানো পর্ব ১৮-এ। তাই peak-এ মোটামুটি ৫০–৭০% utilization একটি প্রচলিত লক্ষ্য; বাকিটুকু headroom.

  1. Peak35,069/sচাহিদা
  2. Load test2,000/sএকটির ক্ষমতা
  3. ৬০%1,200/sকার্যকর
  4. সার্ভার30ওপরে গোল
  5. N+232নষ্ট আর deploy
  6. Zone45 বা 60পুরো zone নষ্ট
M/M/1utilization বনাম গড় সময়
ρ      T ÷ S
0.50   2
0.60   2.5  ← লক্ষ্য
0.80   5
0.90   10
0.95   20
0.99   100  ← বিস্ফোরণ
হিসাবের খাতা
বিষয়
হিসাব
ফল
  1. ধাপ ১ — peak থেকে শুরু। গড় নয়, সবচেয়ে ব্যস্ত সময়ের চাপ দিয়ে হিসাব: (১১৫.৭ + ১১,৫৭৪) × ৩ ≈ ৩৫,০৬৯ অনুরোধ/সেকেন্ড। গড় (≈ ১১,৬৯০) দিয়ে হিসাব করলে সন্ধ্যার ভিড়ে সেবা বসে যেত।
  2. ধাপ ২ — একটি সার্ভার কত পারে। ধরা যাক load test-এ দেখা গেল, একটি সার্ভার ২,০০০ অনুরোধ/সেকেন্ড পর্যন্ত p99 latency লক্ষ্যের ভেতরে রাখে। এই সংখ্যা কখনো আন্দাজে বা AI-এর কথায় বসাবেন না — নিজের কোড আর নিজের hardware-এ মাপুন।
  3. ধাপ ৩ — কেন ১০০% নয়। M/M/1 মডেলে ρ = ০.৬ হলে গড় সময় ২.৫S, ρ = ০.৯ হলে ১০S. পুরো ২,০০০-এ চালালে সামান্য বাড়তি ভিড়েই latency লাফিয়ে উঠবে। তাই লক্ষ্য ৬০% utilization.
  4. ধাপ ৪ — কার্যকর ক্ষমতা। ২,০০০ × ০.৬ = ১,২০০ অনুরোধ/সেকেন্ড প্রতি সার্ভার। বাকি ৮০০ হলো headroom — হঠাৎ ঢেউ, ধীর কোনো query বা garbage collection-এর ধাক্কা সামলানোর জায়গা।
  5. ধাপ ৫ — ভাগ আর ওপরে গোল। ৩৫,০৬৯ ÷ ১,২০০ ≈ ২৯.২২; সার্ভার ভগ্নাংশে হয় না, আর নিচে গোল করলে ক্ষমতা কম পড়ে, তাই ওপরে গোল: ৩০টি।
  6. ধাপ ৬ — নষ্ট হওয়ার হিসাব। যেকোনো মুহূর্তে একটি সার্ভার নষ্ট থাকতে পারে, আরেকটি নতুন version বসানোর (deploy) জন্য বাইরে থাকতে পারে। তাই N+2: ৩২টি। একটি নষ্ট হলে বাকি ৩১টিতে peak-এ ব্যস্ততা ৩৫,০৬৯ ÷ (৩১ × ২,০০০) ≈ ৫৬.৬% — তখনো লক্ষ্যের ভেতরে। Redundancy-র গণিত পর্ব ৫-এ।
  7. ধাপ ৭ — পুরো zone নষ্ট হলে। সার্ভারগুলো যদি দুটি আলাদা data center-এ (zone) ভাগ থাকে আর একটি পুরো zone বসে যায়, অন্যটিকে একাই পুরো peak টানতে হবে — প্রতিটি zone-এ ৩০, মোট ৬০। তিনটি zone হলে একটি হারালে বাকি দুটি peak ভাগ করে নেয় — প্রতিটিতে ১৫, মোট ৪৫। বেশি zone মানে কম বাড়তি খরচ, কিন্তু বেশি জটিলতা — একটি সত্যিকারের trade-off.

শেষ একটি sanity check: ৩২টি সার্ভারের মোট ক্ষমতা ৬৪,০০০/s, অথচ গড় চাপ মাত্র ১১,৬৯০/s — দিনের গড়ে সার্ভারগুলো মাত্র প্রায় ১৮% ব্যস্ত থাকে। Peak-এর জন্য সারাদিন যন্ত্র ভাড়া রাখা দামি; এখান থেকেই চাপ অনুযায়ী সার্ভার বাড়ানো-কমানোর ধারণা, autoscaling (পর্ব ১৩)।

৯ · Sanity check আর সাধারণ ভুল

হিসাব শেষ — কিন্তু ঠিক তো? অভিজ্ঞ প্রকৌশলীরা উত্তর হাতে পেয়েই কয়েকটি প্রশ্ন করেন:

  • একক মিলছে কি? প্রতিটি সূত্রের দুই পাশের একক কাটাকাটি করে দেখুন।
  • প্রতি ব্যবহারকারীর হিসাবে যুক্তিসংগত কি? ছবির অ্যাপে ১ কোটি দৈনিক ব্যবহারকারী ধরলে দিনে ২০ লাখ upload মানে প্রতি পাঁচ জনে একজন দিনে একটি ছবি দেন — বিশ্বাসযোগ্য। প্রত্যেকে দিনে ৫০০টি এলে কোথাও ভুল আছে।
  • দুই পথে মিলছে কি? ওপর থেকে (ব্যবহারকারী × ব্যবহার) আর নিচ থেকে (একটি সার্ভার বা disk কত পারে) — দুই হিসাব একই মাত্রায় না এলে কোনো input ভুল।
  • পরিচিত সীমার সাথে তুলনা। একটি hard disk-এ সেকেন্ডে শখানেক random read, একটি লিংকে কয়েক Gbit/s — উত্তর এমন সীমা ছাড়ালে ভাগ করা বা cache লাগবে।
ভুলউদাহরণকত গুণ ভুল
Bit আর byte গুলিয়ে ফেলা৪৬৩ MB/s-কে ৪৬৩ Mbit/s ভাবা৮ গুণ
দিন আর সেকেন্ড গুলিয়ে ফেলাদিনের ৪০০ GB-কে সেকেন্ডের ৪০০ GB ভাবা; বা ৮৬,৪০০-এর বদলে ৩,৬০০ দিয়ে ভাগ৮৬,৪০০ গুণ; ২৪ গুণ
Replication ভুলে যাওয়াraw ৯.১ TB-কে চূড়ান্ত ধরাসাধারণত ৩ গুণ
Index আর overhead ভুলে যাওয়াশুধু ডেটার byte গোনামোটামুটি ১.২–২ গুণ (ধরে নেওয়া পরিসর)
Peak ভুলে যাওয়াগড় QPS দিয়ে সার্ভার গোনা২ থেকে ১০০ গুণ পর্যন্ত
KB আর KiB গুলিয়ে ফেলা১ TB-কে ১ TiB ধরা২–১৩% — সাধারণত উপেক্ষণীয়

এর মধ্যে এককের ভুলগুলো যন্ত্র দিয়েই ধরা যায়। নিচের ছোট “একক পরীক্ষক” প্রতিটি দাবির দুই পাশ bit আর সেকেন্ডে বদলে তুলনা করে, আর না মিললে অনুপাত দেখে সম্ভাব্য কারণ বলে:

// Units sanity checker: each claim says "left = right". Both sides are turned into base
// units (bits, requests, seconds); a mismatch is flagged with its most likely cause.
const SIZE = { bit: 1, Kbit: 1e3, Mbit: 1e6, Gbit: 1e9, B: 8, KB: 8e3, MB: 8e6, GB: 8e9, TB: 8e12, req: 1 };
const TIME = { s: 1, h: 3600, day: 86400 };
function base(v, unit) { const [s, t] = unit.split("/"); return v * SIZE[s] / (t ? TIME[t] : 1); }
const causes = [[8, "bits vs bytes"], [24, "divided by 3,600 not 86,400"],
                [86400, "per day vs per second"], [1000, "lost a x1000 prefix"]];
function guess(r) {
  const big = r > 1 ? r : 1 / r;
  for (const [f, why] of causes) if (Math.abs(big / f - 1) < 0.05) return why + " (x" + f + ")";
  return "off by x" + big.toFixed(1);
}
const claims = [
  ["photo egress", 463, "MB/s", 3.7, "Gbit/s"],
  ["photo egress", 463, "MB/s", 463, "Mbit/s"],
  ["photo ingest", 4, "TB/day", 46.3, "MB/s"],
  ["URL writes", 10e6, "req/day", 2778, "req/s"],
  ["chat storage", 400, "GB/day", 400, "GB/s"],
  ["5-year data", 27.4, "TB", 27400, "MB"],
  ["home link", 100, "Mbit/s", 12.5, "MB/s"],
];
for (const [what, a, ua, b, ub] of claims) {
  const r = base(a, ua) / base(b, ub);
  const ok = Math.abs(r - 1) < 0.02;
  console.log(what.padEnd(13) + (a + " " + ua + " = " + b + " " + ub).padEnd(32) +
              (ok ? "OK" : "WRONG: " + guess(r)));
}

আউটপুট:

photo egress 463 MB/s = 3.7 Gbit/s           OK
photo egress 463 MB/s = 463 Mbit/s           WRONG: bits vs bytes (x8)
photo ingest 4 TB/day = 46.3 MB/s            OK
URL writes   10000000 req/day = 2778 req/s   WRONG: divided by 3,600 not 86,400 (x24)
chat storage 400 GB/day = 400 GB/s           WRONG: per day vs per second (x86400)
5-year data  27.4 TB = 27400 MB              WRONG: lost a x1000 prefix (x1000)
home link    100 Mbit/s = 12.5 MB/s          OK

সাতটি দাবির তিনটি ঠিক। চারটি ভুল, আর অনুপাতই কারণ বলে দিচ্ছে: ৮ মানে bit-byte; ২৪ মানে কেউ ৮৬,৪০০-এর বদলে ৩,৬০০ দিয়ে ভাগ করেছেন; ৮৬,৪০০ মানে দিন আর সেকেন্ড; ১,০০০ মানে একটি prefix হারিয়েছে। তবে সীমাটাও মনে রাখুন: replication বা peak ভুলে গেলে এককে কোনো গরমিল হয় না — সেগুলো ধরতে লাগে ওপরের প্রশ্নগুলো আর আপনার নিজের বিচার।

পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এ ধরনের প্রশ্ন প্রায়ই আসে —

  • দিনে ১০ কোটি অনুরোধ — গড় QPS কত? ১০৮ ÷ ৮৬,৪০০ ≈ ১,১৫৭; মুখে ১০৮ ÷ ১০৫ = ১,০০০ বলে তারপর ঠিক মান বলুন।
  • ১ Gbit/s লিংকে সর্বোচ্চ কত MB/s? ৮ দিয়ে ভাগ করে ১২৫ MB/s; protocol-এর বাড়তি byte-এর জন্য বাস্তবে কিছু কম।
  • Replication factor ৩ হলে storage কত গুণ? তিন গুণ; erasure coding (যেমন ৬টি ডেটা আর ৩টি parity টুকরো) দিলে প্রায় দেড় গুণ।
  • সার্ভার ১০০% ব্যস্ত রেখে চালানো যায় না কেন? Utilization ১-এর কাছে গেলে অপেক্ষার সময় S ÷ (১ − ρ) অনুযায়ী লাফিয়ে বাড়ে; তাই peak-এ ৫০–৭০% লক্ষ্য রাখা হয়।

১০ · AI-এর যুগে estimation

AI-কে একটি chat অ্যাপের estimation করতে বললে কয়েক সেকেন্ডে সুন্দর সাজানো উত্তর আসে — টেবিল, সংখ্যা, সব। সমস্যা হলো, সুন্দর দেখানো আর ঠিক হওয়া এক জিনিস নয়। AI-এর লেখা estimation-এ বারবার যে ভুলগুলো দেখা যায়:

AI যা প্রায়ই করেউদাহরণকীভাবে যাচাই করবেন
গুণ-ভাগে ভুল৮৬,৪০০-এর বদলে ৩,৬০০ দিয়ে ভাগ, একটি ×১,০০০ হারানো, MB আর Mbit মেশানোপ্রতিটি ধাপ নিজে বা calculator-এ আবার করুন; একক মেলান
গৎবাঁধা নকশাসংখ্যা যা-ই হোক, “Kafka, Redis আর microservices যোগ করুন”যে উপাদানের প্রয়োজন সংখ্যায় প্রমাণ হয় না, তা বাদ দিন
বানানো limit আর দামউৎস ছাড়া “একটি সার্ভার ৫০,০০০ QPS সামলায়” বা “প্রতি GB-এর দাম এত”অফিসিয়াল documentation, নিজের load test আর সরবরাহকারীর বর্তমান দাম
ব্যর্থতা আর consistency উপেক্ষাতিন কপি ধরে, কিন্তু একটি নষ্ট হলে কী হবে বলে না; ACID-এর consistency (ডেটার নিয়ম ভাঙে না) আর CAP-এর consistency (সব কপি থেকে সর্বশেষ মান) এক করে ফেলেFailure-mode review: প্রতিটি বাক্স নষ্ট হলে কী হয়, লিখে দেখুন; সংজ্ঞা মিলিয়ে নিন (পর্ব ২৪ আর ৪০)
অতিরিক্ত নকশা (over-engineering)দিনে কয়েক হাজার অনুরোধের জন্য বহু-region-এর sharded clusterএকটি সার্ভারেই চললে সেটাই ভালো নকশা

AI-কে কাজে লাগানোর ভালো উপায় হলো তাকে দিয়ে হিসাবের খাতা বানানো, সিদ্ধান্ত নয় — আর প্রতিটি ধাপ যেন যাচাই করা যায়, এমনভাবে লিখতে বাধ্য করা:

একটি chat অ্যাপের back-of-the-envelope estimation করো। আমার ধরে নেওয়া মান: দৈনিক সক্রিয় ব্যবহারকারী ৫ কোটি, প্রতি জন দিনে ৪০টি বার্তা, প্রতিটি বার্তা metadata-সহ ২০০ byte, peak factor ৫, replication factor ৩, ডেটা রাখতে হবে ৫ বছর। নিয়ম: ১. প্রতিটি ধাপে সূত্র, একক আর হিসাব আলাদা লাইনে লেখো; বড় সংখ্যা ১০-এর ঘাতে লেখো। ২. Bit আর byte আলাদা রাখো; bandwidth দুই এককেই দাও। ৩. আমার দেওয়া মানের বাইরে কিছু ধরতে হলে "ধরে নিলাম" লিখে আলাদা তালিকায় রাখো। ৪. কোনো product-এর limit বা দাম বানিয়ে বলবে না; জানা না থাকলে "যাচাই করতে হবে" লেখো। ৫. শেষে দুটি sanity check দাও: একটি প্রতি ব্যবহারকারীর হিসাবে, একটি একক মিলিয়ে।

AI-এর estimation হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১Estimation-এর প্রতিটি সংখ্যাই আন্দাজ — তাহলে শেষ উত্তর কাজের হয় কীভাবে? Fermi-র প্রশ্নগুলো থেকে কী শেখার আছে?

বলা হয়, Enrico Fermi ছাত্রদের জিজ্ঞেস করতেন, “শিকাগো শহরে কতজন পিয়ানো টিউনার আছেন?” কেউ উত্তর জানে না, কিন্তু প্রশ্নটিকে ভাঙা যায়: শহরের জনসংখ্যা, প্রতি পরিবারে গড় মানুষ, কত ভাগ পরিবারে পিয়ানো, বছরে কতবার টিউন করা লাগে, একজন টিউনার বছরে কতগুলো পারেন। প্রতিটি অংশ আন্দাজ, তবু গুণফল প্রায়ই সঠিক মাত্রায় পৌঁছায়।

কেন? গুণফলের log হলো প্রতিটি factor-এর log-এর যোগফল। প্রতিটি factor-এর ভুল যদি স্বাধীন হয় আর কোনো একদিকে ঝুঁকে না থাকে, তাহলে log-এর ভুলগুলো এলোমেলো পদক্ষেপের মতো যোগ হয় — কিছু ওপরে, কিছু নিচে। মোট ছড়ানো তখন বাড়ে factor-সংখ্যার বর্গমূলের অনুপাতে, factor-সংখ্যার অনুপাতে নয়। ধরুন ৫টি factor, প্রতিটির সাধারণ ভুল ২ গুণের মতো। সবচেয়ে খারাপ ক্ষেত্রে ২৫ = ৩২ গুণ; কিন্তু দিক এলোমেলো হলে সাধারণ ভুল মোটামুটি ১০√৫ × log ২ ≈ ৪.৭ গুণের কাছাকাছি।

বিপদ কোথায়? ভুল যখন একদিকে ঝোঁকে। আশাবাদী দল প্রতিটি সংখ্যা একটু বাড়িয়ে ধরলে ভুল কাটাকাটি হয় না, জমে যায়। তাই ধরে নেওয়া মানগুলো আলাদা করে লেখা জরুরি — অন্য কেউ পড়ে বলতে পারেন কোনটি বাড়াবাড়ি। আর দ্বিতীয় একটি পথে হিসাব মিলিয়ে দেখলে ঝোঁক ধরা পড়ে।

মাত্রা কেন যথেষ্ট? নকশার সিদ্ধান্তগুলো সিঁড়ির মতো: একটি সার্ভার, দশটি না একশোটি; একটি database, না ভাগ করা database; CDN লাগবে, না লাগবে না। দুই গুণ ভুলে সিঁড়ির ধাপ খুব কমই বদলায়, দশ গুণ ভুলে বদলায়।

মূল উপলব্ধি: Estimation-এর মূল্য সংখ্যায় নয়, ভাঙার পদ্ধতিতে — বড় অজানাকে ছোট, যাচাইযোগ্য অনুমানে ভাগ করা, আর ভুল কোন দিকে ঝুঁকছে তা জানা।

প্র ০২Jeff Dean-এর পুরোনো latency তালিকার কোন সংখ্যাগুলো আজ বদলে গেছে, কোনগুলো বদলায়নি — আর এই পার্থক্য নকশায় কেন গুরুত্বপূর্ণ?

তালিকাটি জনপ্রিয় হয় ২০০৯ সালের দিকে। তার পর থেকে কিছু সংখ্যা নাটকীয়ভাবে বদলেছে, কিছু প্রায় একই আছে, আর একটি কখনো বদলাবে না।

  • অনেক বদলেছে — disk. তালিকায় disk seek ছিল প্রায় ১০ ms. আজ বেশিরভাগ সার্ভারে SSD, যেখানে একটি random read কয়েক দশ থেকে শখানেক µs — প্রায় শত গুণ দ্রুত। তাঁর বক্তৃতার একটি পরিচিত উদাহরণের ধাঁচে হিসাব করুন: ৩০টি ছোট ছবি (প্রতিটি ২৫৬ KB) disk থেকে একটির পর একটি পড়লে ৩০ × ১০ ms seek + ৩০ × ২৫৬ KB ÷ ৩০ MB/s ≈ ৩০০ + ২৫৬ ≈ ৫৫৬ ms; সমান্তরালে পড়লে প্রায় ১০ + ৮.৫ ≈ ১৯ ms. একটি SSD-তে (ধরুন ০.১ ms আর ৫০০ MB/s) একটির পর একটি পড়লেও লাগে প্রায় ৩ + ১৫ ≈ ১৮ ms — পুরোনো পরামর্শের গুরুত্ব অনেক কমে গেছে।
  • বদলেছে — data center-এর network. অনেক data center-এ সার্ভারের লিংক ১ থেকে ১০, ২৫ বা ১০০ Gbit/s-এ উঠেছে; ভেতরে ডেটা সরানো অনেক সস্তা হয়েছে।
  • প্রায় একই — RAM-এর latency. CPU অনেক দ্রুত হলেও memory থেকে একটি এলোমেলো পড়া কয়েক দশক ধরে মোটামুটি ১০০ ns-এর ঘরে। এজন্যই cache-এর গুরুত্ব কমেনি, বরং বেড়েছে।
  • কখনো বদলাবে না — আলোর গতি। ঢাকা থেকে লন্ডনের round trip তাত্ত্বিকভাবেই ৮০ ms-এর কম হতে পারে না। দূরত্বের latency কমানোর একমাত্র উপায় দূরত্ব কমানো — CDN, edge আর একাধিক region.

তাই প্রযুক্তির সংখ্যার ওপর দাঁড়ানো সিদ্ধান্ত (যেমন “disk ধীর, তাই সব সমান্তরাল”) কয়েক বছর পরপর আবার যাচাই করতে হয়; পদার্থবিদ্যার ওপর দাঁড়ানো সিদ্ধান্ত (যেমন দূরের ব্যবহারকারীর কাছে কপি রাখা) টিকে থাকে।

মূল উপলব্ধি: সংখ্যা মুখস্থ নয়, কোনটি প্রযুক্তির ওপর নির্ভর করে আর কোনটি পদার্থবিদ্যার ওপর, সেটা বুঝুন। প্রযুক্তির সংখ্যা নিজের যন্ত্রে নতুন করে মাপুন; পদার্থবিদ্যার সংখ্যার চারপাশে নকশা করুন।

প্র ০৩KB আর KiB-এর তফাত মাত্র কয়েক শতাংশ — তবু এ নিয়ে এত বিভ্রান্তি কেন, আর কখন এটি সত্যিই টাকার প্রশ্ন হয়ে ওঠে?

২১০ = ১,০২৪, যা ১,০০০-এর খুব কাছে, তাই প্রথম দিকের কম্পিউটার জগতে “kilo” বলতে অনানুষ্ঠানিকভাবে ১,০২৪ ধরা হতো। Memory chip-এর আকার স্বাভাবিকভাবেই ২-এর ঘাতে, তাই RAM-এ এটি মানিয়ে যেত। কিন্তু disk নির্মাতারা SI-এর দশমিক অর্থ, অর্থাৎ ১,০০০-কেই kilo ধরতেন, আর network-এর গতিও সবসময় দশমিক। ফলাফল: একই “GB” শব্দের দুই অর্থ।

১৯৯৮ সালে IEC আলাদা নাম চালু করে — KiB, MiB, GiB — কিন্তু সবাই তা মেনে নেয়নি। আজও দেখানোর নিয়ম সিস্টেমভেদে আলাদা: Windows-এর File Explorer binary হিসাবে গুনে পাশে “GB” লেখে, তাই “1 TB” disk দেখায় প্রায় ৯৩১ GB; macOS অনেক বছর ধরে দশমিক হিসাব দেখায়; আর Linux-এর অনেক টুলে দুই রকমই পাওয়া যায় (যেমন df -h ১,০২৪-ভিত্তিক, df -H ১,০০০-ভিত্তিক)। ২০০০-এর দশকে কোনো কোনো দেশে hard disk-এর ধারণক্ষমতা লেখার ধরন নিয়ে ক্রেতাদের মামলাও হয়েছিল বলে জানা যায়।

কখন টাকার প্রশ্ন? ফারাক প্রতি prefix-এ বাড়ে। PB-তে ১২.৬%: ১ PiB আর ১ PB-এর পার্থক্য প্রায় ১২৬ TB — বড় storage কেনা বা চুক্তিতে এটি সত্যিকারের টাকা। Cache-এর আকার ঠিক করার সময়ও: ১০০ GiB ডেটা রাখতে “১০০ GB” RAM কিনলে ৭.৪% কম পড়বে। কিছু cloud সেবা বিলে “GB” লিখে আসলে GiB বোঝায়, তাই documentation দেখে নেওয়া ভালো।

অন্যদিকে bit আর byte-এর গুলিয়ে ফেলা সবসময়ই গুরুতর — ৮ গুণ। ইন্টারনেট সংযোগের বিজ্ঞাপন Mbps-এ, আর ব্রাউজারের download গতি MB/s-এ; তাই “১০০ Mbps লাইনে ১০০ MB/s কেন পাচ্ছি না” প্রশ্নটি এত পরিচিত।

মূল উপলব্ধি: Estimation-এ ২–১০% ফারাক অনুমানের অনিশ্চয়তায় ঢাকা পড়ে, কিন্তু ৮ গুণ কখনো নয়। আর কেনাকাটা, চুক্তি বা বিলের সময় এককের পুরো নাম স্পষ্ট করুন — GB না GiB, Mbit না MB — সেটা লিখে রাখুন।

প্র ০৪পরীক্ষার ফল প্রকাশ বা ঈদের টিকিট ছাড়ার মুহূর্তে সাইট কেন বসে যায়? গড়ের হিসাব এখানে কোথায় ব্যর্থ, আর নকশা কী করতে পারে?

সাধারণ দিনে চাপ ধীরে ওঠানামা করে — সকালে কম, সন্ধ্যায় বেশি — তাই peak গড়ের দুই থেকে পাঁচ গুণের মতো ধরা চলে। কিন্তু যখন একটি নির্দিষ্ট সময় সবাই জানেন — “ফল দুপুর ২টায়”, “টিকিট সকাল ৮টায়” — তখন লাখো মানুষের আচরণ একই মিনিটে মিলে যায়। একে বলে flash crowd. একসময় জনপ্রিয় প্রযুক্তি-সংবাদ সাইট Slashdot-এ কোনো ছোট সাইটের link ছাপা হলেই সেটি বসে যেত — যা “Slashdot effect” নামে পরিচিত। পাবলিক পরীক্ষার ফল প্রকাশের দিনে ফল দেখার সাইট ধীর হয়ে যাওয়া আমাদের অনেকেরই চেনা অভিজ্ঞতা।

সংখ্যায় দেখুন (অনুশীলন ১-এর কাল্পনিক মান): ২০ লাখ পরীক্ষার্থী, প্রথম ঘণ্টায় ১ কোটি অনুরোধ, তার অর্ধেক প্রথম ১০ মিনিটে — peak ≈ ৮,৩৩৩/s. অথচ সারা দিনে ১.৫ কোটি অনুরোধের গড় মাত্র ≈ ১৭৪/s. Peak গড়ের ৪৮ গুণ। দিনের গড় দেখে একটি সার্ভার বসালে প্রথম মিনিটেই সব শেষ।

নকশা কী করতে পারে:

  • আগে তৈরি করে cache: ফল প্রকাশের পর বদলায় না। প্রতিটি ফল আগেই তৈরি করে CDN-এ রাখলে বেশিরভাগ অনুরোধ মূল সার্ভারে পৌঁছায়ই না।
  • চাপ ছড়িয়ে দেওয়া: SMS-এ ফল পাঠানো, ধাপে ধাপে প্রকাশ, বা অপেক্ষার সারি (waiting room) — ব্যাংকের টোকেনের মতো, সবাইকে একসাথে কাউন্টারে না ঢুকিয়ে।
  • মূল অংশ রক্ষা: rate limiting (পর্ব ৪৯), আর চাপ বেশি হলে কিছু অনুরোধ ভদ্রভাবে ফিরিয়ে দিয়ে বাকিদের সেবা চালু রাখা (পর্ব ১৮)।
  • আগেভাগে বাড়ানো: autoscaling চাপ দেখে প্রতিক্রিয়া দেয়, তাতে কয়েক মিনিট লাগে; জানা ঘটনার আগেই সার্ভার বাড়িয়ে রাখা নিরাপদ (পর্ব ১৩)।

মূল উপলব্ধি: নির্দিষ্ট সময়ে ঘটা ঘটনায় peak factor দশ বা শত গুণ হতে পারে। নকশা করুন peak-এর জন্য — আর সম্ভব হলে peak-কেই ছড়িয়ে দিন।

প্র ০৫Storage-এর হিসাবে replication factor ৩ এত প্রচলিত কেন? Erasure coding কীভাবে একই নিরাপত্তায় কম জায়গা নেয়, আর তার দাম কী?

Google-এর প্রকাশিত Google File System paper (২০০৩) অনুযায়ী সেখানে প্রতিটি ডেটা-খণ্ডের ডিফল্টভাবে তিনটি কপি রাখা হতো; open-source Hadoop-এর HDFS-এও ডিফল্ট replication factor ৩। তিন কেন? দুটি মেশিন একসাথে নষ্ট হলেও ডেটা থাকে; একটি কপি অন্য rack-এ রাখা যায়; আর একটি নষ্ট কপি নতুন করে বানানোর সময়েও বাকি দুটি পাহারায় থাকে। দাম সোজা: storage তিন গুণ।

Erasure coding-এর ধারণা: ডেটাকে k-টি টুকরোয় ভাগ করে তার থেকে m-টি বাড়তি parity টুকরো হিসাব করা হয়, এমনভাবে যে মোট k + m টুকরোর যেকোনো k-টি পেলেই পুরো ডেটা ফেরানো যায়। এর গাণিতিক ভিত্তি Reed–Solomon code (Irving Reed ও Gustave Solomon, ১৯৬০)। যেমন RS(৬, ৩): ৬টি ডেটা আর ৩টি parity টুকরো, জায়গা লাগে ৯ ÷ ৬ = ১.৫ গুণ, অথচ যেকোনো ৩টি টুকরো হারালেও ডেটা থাকে — তিন কপির (যা ২টি হারানো সয়) চেয়েও বেশি সহনশীল, অর্ধেক জায়গায়। Hadoop 3-এ (২০১৭ সালের দিকে) HDFS-এ erasure coding যোগ হয়, যার একটি প্রচলিত নীতি এই RS-6-3.

দাম কোথায়? একটি টুকরো হারালে বা নষ্ট মেশিনের ডেটা পড়তে হলে k-টি মেশিন থেকে টুকরো এনে হিসাব করতে হয় — বেশি network, বেশি CPU, বেশি latency. তাই সাধারণ চর্চা: ঘন ঘন ব্যবহৃত (hot) ডেটা পূর্ণ কপিতে, কম ব্যবহৃত (warm বা cold) ডেটা erasure coding-এ। Facebook-এর প্রকাশিত f4 paper (২০১৪) অনুযায়ী, কম ব্যবহৃত ছবির মতো ডেটা এভাবে সরিয়ে তারা কার্যকর replication factor উল্লেখযোগ্যভাবে কমিয়েছিল।

Estimation-এ প্রভাব: অংশ ৭-এর ছবির অ্যাপে বছরে ১.৪৬ PB raw. তিন কপিতে ৪.৩৮ PB, RS(৬, ৩)-এ ২.১৯ PB — প্রতি বছর প্রায় ২.২ PB কম।

মূল উপলব্ধি: Replication factor প্রকৃতির নিয়ম নয়, একটি নকশার সিদ্ধান্ত — নিরাপত্তা, গতি আর খরচের trade-off. Estimation-এ এটি একটি গুণক, তাই সংখ্যা লেখার সময়েই সিদ্ধান্তটি চোখের সামনে আসে। বিস্তারিত পর্ব ২৬-এ।

অনুশীলন

সব সংখ্যা কাল্পনিক। আগে খাতায় নিজে হিসাব করুন, তারপর উত্তর মিলিয়ে নিন।

  1. ফল প্রকাশের দিন (হিসাব): একটি পাবলিক পরীক্ষার ফল দেখার সাইট। ধরা যাক: পরীক্ষার্থী ২০ লাখ; ফল প্রকাশের প্রথম ঘণ্টায় প্রত্যেকের ফল গড়ে ৫ বার খোলা হয় (নিজে, পরিবার, বারবার reload); সেই ঘণ্টার অর্ধেক অনুরোধ আসে প্রথম ১০ মিনিটে; সারা দিনে মোট অনুরোধ ১.৫ কোটি; ফলের পাতা ৫০ KB; একটি সার্ভার ১,০০০ পাতা/সেকেন্ড পারে, লক্ষ্য utilization ৬০%. বের করুন: (ক) প্রথম ঘণ্টার গড় আর প্রথম ১০ মিনিটের peak QPS; (খ) peak দিনের গড়ের কত গুণ; (গ) peak egress; (ঘ) সার্ভারের সংখ্যা।

    (ক) প্রথম ঘণ্টায় ২০ লাখ × ৫ = ১ কোটি অনুরোধ; গড় ১০৭ ÷ ৩,৬০০ ≈ ২,৭৭৮/s. প্রথম ১০ মিনিটে ৫০ লাখ ÷ ৬০০ s ≈ ৮,৩৩৩/s — ঘণ্টার গড়ের ৩ গুণ।

    (খ) সারা দিনের গড় ১.৫ × ১০৭ ÷ ৮৬,৪০০ ≈ ১৭৪/s. Peak তার ৪৮ গুণ। দিনের গড় দিয়ে নকশা করলে একটি সার্ভারই যথেষ্ট মনে হতো।

    (গ) ৮,৩৩৩ × ৫০ KB ≈ ৪১৭ MB/s, × ৮ ≈ ৩.৩ Gbit/s.

    (ঘ) কার্যকর ক্ষমতা ১,০০০ × ০.৬ = ৬০০/s; ৮,৩৩৩ ÷ ৬০০ ≈ ১৩.৯ → ১৪টি, N+2 দিয়ে ১৬টি।

    নকশার শিক্ষা: ফল প্রকাশের পর বদলায় না, তাই আগেই তৈরি করে CDN-এ রাখা যায়। CDN ৯০% অনুরোধ মেটালে মূল সার্ভারে আসে ≈ ৮৩৩/s — ২টি সার্ভার (সাথে বাড়তি) যথেষ্ট।

  2. নির্বাচনের রাতে সংবাদ পোর্টাল (আউটপুট অনুমান): অংশ ৫-এর calculator-এ A-র মান এভাবে বদলানো হলো: name: "News portal, election night", writesPerDay: 5e3 (খবর আর হালনাগাদ), readsPerDay: 200e6 (২০ কোটি পাতা দেখা), recordBytes: 20e3, responseBytes: 100e3, peakFactor: 10, years: 1, serverCapacity: 500; বাকিগুলো আগের মতো। চালানোর আগে হাতে হিসাব করে বলুন: peak QPS, egress আর সার্ভারের লাইনে কী ছাপা হবে? তারপর চালিয়ে মিলিয়ে নিন।

    হাতে হিসাব: read ২ × ১০৮ ÷ ৮৬,৪০০ ≈ ২,৩১৫/s; write মাত্র ≈ ০.০৬/s. Peak = (২,৩১৪.৮ + ০.০৬) × ১০ ≈ ২৩,১৪৯/s. Egress = ২,৩১৫ × ১০০ KB ≈ ২৩১ MB/s ≈ ১.৮৫ Gbit/s, peak-এ ১৮.৫ Gbit/s. সার্ভার = ⌈২৩,১৪৯ ÷ (৫০০ × ০.৬)⌉ = ⌈৭৭.২⌉ = ৭৮। Calculator ঠিক এটাই ছাপে:

    Scenario: News portal, election night  (every input is an assumption)
    avg QPS      write 0.1, read 2315
    peak QPS     23149  (x10)
    new data     100 MB/day raw, 110 GB/year with x3
    in 1 yr      110 GB  (x3, before indexes)
    egress       avg 1.85 Gbit/s, peak 18.5 Gbit/s
    servers      78 at peak, then add 1-2 spares

    শিক্ষা: storage নগণ্য (বছরে ১১০ GB), কিন্তু egress আর সার্ভার বিশাল। প্রায় সব পাঠক একই কয়েকটি পাতা দেখেন, তাই CDN ৯৫% অনুরোধ মেটালে মূল সার্ভারে আসে ≈ ১,১৫৭/s — মাত্র ৪টি সার্ভার।

  3. ভুল খুঁজুন: ঈদের আগে একটি অনলাইন বাস-টিকিট সাইটের জন্য একজন সহকর্মী লিখলেন — “দিনে ৫০ লাখ search, তাই QPS = ৫০ লাখ ÷ ৩,৬০০ ≈ ১,৩৮৯। প্রতিটি search-এর উত্তর ২০ KB, তাই bandwidth = ১,৩৮৯ × ২০ KB ≈ ২৭.৮ MB/s, অর্থাৎ ২৭.৮ Mbps-এর লাইনই যথেষ্ট। দিনে ২ লাখ বুকিং × ১ KB = ২০০ MB, বছরে ৭৩ GB — একটি disk-এই হয়ে যাবে।” টিকিট ছাড়া হয় সকাল ৮টায়, আর প্রথম ১০ মিনিটে আসে দিনের ২০% search. অন্তত চারটি ভুল খুঁজে ঠিক হিসাব দিন।
    1. ভুল ভাজক: দিনের অনুরোধ ভাগ হবে ৮৬,৪০০ দিয়ে, ৩,৬০০ নয়। ঠিক গড় ৫০ লাখ ÷ ৮৬,৪০০ ≈ ৫৮/s — আগের সংখ্যা ২৪ গুণ বেশি ছিল।
    2. Peak নেই: প্রথম ১০ মিনিটে ১০ লাখ search ÷ ৬০০ s ≈ ১,৬৬৭/s — গড়ের প্রায় ২৯ গুণ। ভুল ভাজকের ১,৩৮৯ কাকতালীয়ভাবে peak-এর কাছে, কিন্তু দুটি ভুল মিলে ঠিকের কাছে আসা ঠিক যুক্তি নয় — অন্য সংখ্যায় এই ভাগ্য থাকবে না।
    3. Byte আর bit: ২৭.৮ MB/s মানে ২২২ Mbit/s, ২৭.৮ Mbit/s নয়। ঠিক peak egress: ১,৬৬৭ × ২০ KB ≈ ৩৩.৩ MB/s ≈ ২৬৭ Mbit/s — প্রস্তাবিত লাইনের প্রায় ১০ গুণ।
    4. কপি আর overhead নেই: ৭৩ GB raw; তিন কপি আর index-log-এর জন্য ৫০% overhead ধরলে ৭৩ × ৩ × ১.৫ ≈ ৩২৯ GB. পরিমাণ তবু ছোট, কিন্তু “একটি disk” মানে সেটি নষ্ট হলেই সব বুকিং হারানো — টাকার লেনদেনের ডেটায় যা চলে না।

    সংক্ষেপে: নকশার চাপ storage-এ নয়, সকাল ৮টার peak-এ — সেখানে অপেক্ষার সারি (waiting room) আর search ফলাফলের cache লাগবে।

  4. দশ বছরের লেনদেন-খাতা (হিসাব আর কোড): একটি mobile banking সেবা (কাল্পনিক) দিনে ১ কোটি লেনদেন করে; প্রতিটি record audit-তথ্যসহ ১ KB; নিয়মের কারণে ১০ বছর রাখতে হবে; লেনদেন প্রতি বছর ২০% বাড়ে; তিনটি কপি, আর index-এর জন্য ৫০% overhead. (ক) প্রথম বছরে raw কত? (খ) ১০ বছরের raw মোট কত — সূত্র দিয়ে? (গ) জোগাড় রাখতে হবে কত? (ঘ) অংশ ৭-এর storage-growth কোডে কোন মানগুলো বদলালে এই হিসাব হবে?

    (ক) ১০৭ × ১ KB × ৩৬৫ = ৩.৬৫ × ১০১২ B = ৩.৬৫ TB.

    (খ) Geometric series: ৩.৬৫ × (১.২১০ − ১) ÷ ০.২ = ৩.৬৫ × (৬.১৯২ − ১) ÷ ০.২ ≈ ৩.৬৫ × ২৫.৯৬ ≈ ৯৪.৭ TB. বৃদ্ধি না ধরলে মাত্র ৩৬.৫ TB — বৃদ্ধি হিসাবকে প্রায় ২.৬ গুণ করেছে।

    (গ) ৯৪.৭ × ৩ × ১.৫ ≈ ৪২৬ TB.

    (ঘ) perDay0 = 10e9 (১০৭ × ১,০০০ byte), growth = 0.20, overhead = 1.5, years = 10. আউটপুটের শেষ তিন লাইন:

    10       52 GB        19 TB       95 TB        426 TB
    provisioned = total raw x3 copies x1.5 overhead
    No growth: 37 TB raw after 10 years, not 95 TB

    কোড পূর্ণসংখ্যায় গোল করে (৯৪.৭ → ৯৫, ৩৬.৫ → ৩৭), তাই হাতের হিসাবের সাথে মেলে। গড় লেনদেন মাত্র ≈ ১১৬/s, কিন্তু এখানে প্রতিটি লেখার নির্ভুলতাই আসল চ্যালেঞ্জ (পর্ব ৬০)।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমসার্ভারের সংখ্যা বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 📝 ধরে নেওয়া মান লেখা — DAU আর প্রতি জনের দৈনিক অনুরোধ
  2. ⏱️ দিনের মোট অনুরোধ ÷ ৮৬,৪০০ = গড় QPS
  3. 📈 গড় × peak factor = peak QPS
  4. 🧮 Peak ÷ (একটি সার্ভারের ক্ষমতা × লক্ষ্য utilization), তারপর ওপরে গোল
  5. 🛟 নষ্ট হওয়া আর deploy-এর জন্য বাড়তি সার্ভার যোগ (N+2)
  6. ✅ Sanity check — একক আর মোট ক্ষমতা মিলিয়ে দেখা

একটি সেবায় দিনে ৮৬.৪ কোটি (৮.৬৪ × ১০৮) অনুরোধ আসে, সারা দিন সমানভাবে। গড় QPS কত?

  • ১,০০০
  • ১০,০০০
  • ২,৪০,০০০
  • ৮৬,৪০০

একটি সার্ভিস থেকে গড়ে ৫০ MB/s ডেটা বাইরে যায়, আর তার network লিংক ১০০ Mbit/s. লিংকটি কি যথেষ্ট?

  • হ্যাঁ — ৫০ < ১০০, লিংকের অর্ধেক খালি থাকে
  • না — ৫০ MB/s = ৪০০ Mbit/s, লিংকের প্রায় ৪ গুণ
  • হ্যাঁ — MB আর Mbit একই জিনিস
  • বলা যায় না, কারণ peak জানা নেই

একটি “1 TB” hard disk Windows-এ প্রায় ৯৩১ GB দেখায়। কেন?

  • Disk-এর কিছু অংশ কারখানাতেই নষ্ট থাকে
  • নির্মাতা ১০১২ byte গোনেন, আর Windows ২৩০ byte-কে এক “GB” ধরে ভাগ করে
  • File system-এর জন্য ৭% জায়গা আলাদা রাখা হয়
  • Bit আর byte-এর পার্থক্য

দিনে ১ কোটি নতুন record, প্রতিটি ১ KB, ৩ বছর রাখতে হবে, replication factor ৩। Index বাদে মোট storage মোটামুটি কত?

  • ~১১ TB
  • ~৩৩ TB
  • ~৩.৬৫ TB
  • ~৩৩০ TB

Peak-এ ৯,০০০ অনুরোধ/সেকেন্ড। Load test অনুযায়ী একটি সার্ভার ১,৫০০ অনুরোধ/সেকেন্ড পারে, আর লক্ষ্য utilization ৬০%. বাড়তি সার্ভার বাদে কমপক্ষে কতটি লাগবে?

  • ৬টি
  • ১০টি
  • ১৫টি
  • ৬০টি

একটি পাতা বানাতে সার্ভারকে অন্য মহাদেশের একটি সেবায় পরপর ৬টি অনুরোধ পাঠাতে হয় (একটির উত্তর পেলে তবে পরেরটি); প্রতিটির round trip প্রায় ১৫০ ms. শুধু network-এ মোটামুটি কত সময় যায়?

  • ০.৯ ms
  • ১৫০ ms
  • ৯০০ ms
  • ৯ সেকেন্ড

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Estimation-এর লক্ষ্য সঠিক মাত্রা: ধরে নেওয়া মান স্পষ্ট লিখুন, গোল করুন, একক রাখুন।
  2. দিনে ৮৬,৪০০ ≈ ১০৫ সেকেন্ড (দিনে ১ লাখ ≈ সেকেন্ডে ১); বছরে ≈ ৩ × ১০৭; ৮ bit = ১ byte; KiB আর KB-এর ফারাক ২.৪% থেকে প্রতি prefix-এ বাড়ে।
  3. Latency-র মই: RAM ~১০০ ns → SSD ~১০০ µs → data center-এ round trip ~০.৫ ms → disk seek ~১০ ms → মহাদেশ পেরোনো ~১৫০ ms; শেষটি আলোর গতিতে বাঁধা।
  4. ছয় সূত্র: QPS, peak, storage (× কপি × overhead), bandwidth (ingress-egress, × ৮), cache (৮০/২০ heuristic), সার্ভার (peak ÷ কার্যকর ক্ষমতা, তারপর বাড়তি দুটি)।
  5. উত্তর পেলেই থামবেন না: একক, প্রতি ব্যবহারকারী আর দ্বিতীয় পথে মিলিয়ে দেখুন — নিজের আর AI-এর, দুই হিসাবেই।

পরের পর্বে: আজ latency-কে একটি গড় সংখ্যা হিসেবে দেখলেন। কিন্তু ব্যবহারকারী গড় অনুভব করেন না — অনুভব করেন সবচেয়ে ধীর অনুরোধগুলো। পর্ব ৪-এ p99, tail latency আর Little-এর সূত্র।

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান