সরাসরি পর্বে যান
পর্ব ৫৬ · ৬২-এর মধ্যে · মডিউল ৯

নেটওয়ার্ক পারফরম্যান্স — bandwidth-delay product, tuning আর মাপা

Network Performance — Measuring Throughput, Latency and Tails, the Bandwidth-Delay Product and Practical Tuning

Taught in Bangla, this lesson covers network performance: identifying which number is actually bad, distributions, percentiles, tail latency and Little's law, what a speed test measures, disciplined measurement, timing with curl and browser waterfalls, latency-bound versus bandwidth-bound transfers, tuning long fat paths with the bandwidth-delay product, reducing round trips and understanding queues, and bufferbloat tests and cost calculation.

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

  • পারফরম্যান্সের শব্দভান্ডার নিখুঁতভাবে — bit বনাম byte, percentile, tail latency আর Little's law
  • Speed test আসলে কী মাপে, আর অ্যাপের ডাউনলোড কেন আলাদা হয়
  • পদ্ধতি মেনে মাপা — iperf3, ping, mtr, ss -ti, curl -w আর ব্রাউজারের waterfall পড়া
  • BDP দিয়ে একটি long fat path ধাপে ধাপে tune করা, আর কখন tuning অর্থহীন
  • অ্যাপ আর সার্ভারের দিকের কৌশল, queueing-এর অন্তর্দৃষ্টি, capacity planning আর খরচের হিসাব

১ · “নেট স্লো” — আসলে কোন সংখ্যাটা খারাপ?

অফিসে কেউ বললেন “নেট স্লো”। কথাটা সত্যি হতে পারে, কিন্তু এটি কোনো মাপ নয়। হয়তো বড় ফাইল নামাতে দেরি হচ্ছে, হয়তো ভিডিও কল কেটে কেটে আসছে, হয়তো ওয়েবসাইট খুলতে প্রথম কয়েক সেকেন্ড সাদা পাতা থাকছে। তিনটির কারণ আলাদা, প্রতিকারও আলাদা। তাই পারফরম্যান্সের কাজ শুরু হয় শব্দ ঠিক করে। পর্ব ০৫-এ (Delay, loss আর throughput) চার রকম delay আর bottleneck-এর হিসাব করেছেন; এই পর্বে সেই ধারণাগুলো দিয়ে বাস্তবে মাপা আর ঠিক করা শিখবেন।

ঢাকা থেকে চট্টগ্রামে মাল পাঠানোর কথা ভাবুন। মহাসড়ক চার লেনের — এটা bandwidth, রাস্তা সর্বোচ্চ কতটা নিতে পারে। আজ আসলে ঘণ্টায় কত ট্রাক পৌঁছাল — এটা throughput. তার মধ্যে কতগুলো ট্রাকে সত্যিকারের মাল ছিল, খালি ফেরত বা একই মাল দ্বিতীয়বার পাঠানো বাদে — এটা goodput. একটি ট্রাক পৌঁছাতে কত ঘণ্টা লাগল — latency. কোনো দিন ছয় ঘণ্টা, কোনো দিন দশ ঘণ্টা — এই ওঠানামা jitter. আর পথে দুর্ঘটনায় কটি ট্রাক হারাল — loss. চার লেনের রাস্তাও একটি জ্যামের মোড়ে আটকে গেলে কোনো কাজে আসে না।

শব্দকী মাপেএককসাধারণ ভুল
BandwidthLink বা প্ল্যানের সর্বোচ্চ হারbit/s (Mbps, Gbps)এটিকেই “গতি” ভাবা
Throughputএই মুহূর্তে আসলে যত bit পৌঁছাচ্ছেbit/sকোন স্তরে মাপা হলো তা না বলা
Goodputঅ্যাপের কাছে পৌঁছানো কাজের ডেটা — header আর পুনঃপ্রেরণ বাদেbit/s বা byte/sGoodput = bandwidth ধরে নেওয়া
Latency (one-way)এক দিক থেকে অন্য দিকে পৌঁছানোর সময়msদুই যন্ত্রের ঘড়ি না মিলিয়ে মাপা
RTTযাওয়া আর উত্তর ফেরা মিলিয়ে সময়msping-এর RTT-কে one-way ভাবা
JitterDelay-এর ওঠানামাmsশুধু গড় RTT দেখে কল-এর মান বিচার
Lossহারানো packet-এর অনুপাত%১%-কে “সামান্য” ভাবা — TCP-র জন্য এটা বড়
Utilisationসময়ের কত ভাগ link বা সার্ভার ব্যস্ত% (ρ)৯৫% ব্যবহারকে “দক্ষতা” ভাবা — queue তখন লম্বা

One-way delay বনাম RTT

Ping আর TCP দুটোই RTT মাপে, কারণ একই ঘড়ি দিয়ে যাওয়া-আসার সময় মাপা সহজ। One-way delay মাপতে দুই প্রান্তের ঘড়ি খুব নিখুঁতভাবে মেলাতে হয় (যেমন GPS বা PTP দিয়ে), নইলে ঘড়ির পার্থক্যই ফলাফলে ঢুকে পড়ে। আর দুই দিকের পথ এক নাও হতে পারে — যাওয়া এক ISP দিয়ে, ফেরা আরেক দিয়ে — তাই RTT ÷ ২ সবসময় one-way delay নয়। ভয়েস আর গেমের মতো কাজে আসলে one-way delay গুরুত্বপূর্ণ; ITU-T G.114 সাধারণভাবে one-way ১৫০ ms-এর নিচে রাখার পরামর্শ দেয়।

Throughput থেকে goodput — header-এর দাম, হাতে হিসাব

একটি ১ Gbps Ethernet link-এ একটি TCP সংযোগ সর্বোচ্চ কত goodput পেতে পারে? প্রতিটি পূর্ণ frame-এ IP MTU ১,৫০০ byte. তার মধ্যে IPv4 header ২০, TCP header ২০, আর Linux-এ ডিফল্টে চালু TCP timestamp option ১২ byte — বাকি কাজের ডেটা (MSS-এর কার্যকর অংশ) ১,৪৪৮ byte. তারের ওপর frame-এর বাইরেও খরচ আছে: Ethernet header ১৪, FCS ৪, preamble ৮ আর frame-এর মাঝের বিরতি (inter-frame gap) ১২ byte. মোট ১,৫০০ + ৩৮ = ১,৫৩৮ byte-এর সময় খরচ করে ১,৪৪৮ byte কাজের ডেটা যায়।

সর্বোচ্চ goodput = ১ Gbps × ১,৪৪৮ ÷ ১,৫৩৮ ≈ ৯৪১ Mbps

এজন্যই ১ Gbps link-এ iperf3 সাধারণত ৯৩০–৯৪০ Mbps-এর আশেপাশে দেখায় — এটা ত্রুটি নয়, header-এর দাম। Jumbo frame (MTU ৯,০০০) হলে অনুপাত হয় ৮,৯৪৮ ÷ ৯,০৩৮ ≈ ৯৯%, কিন্তু পথের সব যন্ত্রকে তা সমর্থন করতে হয় (পর্ব ১২, Ethernet আর switch). Loss থাকলে goodput আরও কমে, কারণ হারানো অংশ আবার পাঠাতে হয়।

২ · গড় নয়, বণ্টন — percentile, tail latency আর Little's law

ধরুন একটি API-র গড় সময় ৩৪ ms. শুনতে ভালো। কিন্তু গড় একটি সংখ্যায় সব লুকিয়ে ফেলে। ১০০ জনের ৯৮ জন ২০ ms-এ উত্তর পেলেন আর ২ জন ৭০০ ms-এ — গড় হয় প্রায় ৩৪ ms, অথচ কেউই ৩৪ ms পাননি। তাই পারফরম্যান্স প্রকৌশলীরা percentile-এ কথা বলেন। সব মাপ ছোট থেকে বড় সাজালে p50 (median) হলো মাঝের মান — অর্ধেক অনুরোধ এর চেয়ে দ্রুত। p95 মানে ৯৫% অনুরোধ এর ভেতরে শেষ। p99 আর p99.9 হলো লেজ — সবচেয়ে ধীর ১% আর ০.১%. এই লেজকে বলে tail latency.

লেজ কেন গুরুত্বপূর্ণ? তিন কারণে। (১) যে ব্যবহারকারী বেশি ব্যবহার করেন, তিনি বেশিবার লেজে পড়েন — দিনে ২০০টি অনুরোধ করলে p99 তাঁর কাছে দিনে প্রায় দুবারের অভিজ্ঞতা। (২) একটি পাতা খুলতে অনেক অনুরোধ লাগে, আর পাতাটি তৈরি হয় সবচেয়ে ধীরটির পরে। (৩) বড় সিস্টেমে একটি ব্যবহারকারী-অনুরোধ ভেতরে অনেক সার্ভারে ভাগ হয় (fan-out) আর সবগুলোর উত্তরের অপেক্ষা করে। প্রতিটি সার্ভারের ১% সম্ভাবনা থাকলে লেজে পড়ার, n-টি সার্ভারের অন্তত একটি লেজে পড়ার সম্ভাবনা:

P(অন্তত একটি ধীর) = ১ − ০.৯৯n   ·   n = ১০০ হলে ≈ ৬৩.৪%

নিচের প্রোগ্রাম একটি কৃত্রিম কিন্তু বাস্তবসম্মত latency-নমুনা বানায় (নির্দিষ্ট seed, তাই প্রতিবার একই): বেশিরভাগ অনুরোধ ৮–৩০ ms, ২.৫% কোনো queue বা cache-miss-এ আটকে ৭০–২৯০ ms, আর ০.৫% একটি হারানো packet-এর timeout-এ ১–৩ সেকেন্ড। তারপর গড় আর percentile ছাপে, আর fan-out সূত্রটি simulation দিয়ে মিলিয়ে দেখে।

// Tail latency: mean vs percentiles on a seeded synthetic sample, then fan-out amplification.
let seed = 56;
const rand = () => { seed = (seed * 1103515245 + 12345) % 2147483648; return seed / 2147483648; };
function oneRequest() {                       // ms: usually fast, sometimes a slow path
  const base = 8 + 12 * rand() + 10 * rand();             // normal work: 8-30 ms
  const r = rand();
  if (r < 0.005) return base + 1000 + 2000 * rand();      // 0.5%: lost SYN/packet, retransmit timeout ~1-3 s
  if (r < 0.03) return base + 60 + 200 * rand();          // 2.5%: queueing, GC pause, cold cache
  return base;
}
const N = 20000, lat = Array.from({ length: N }, oneRequest);
const sorted = [...lat].sort((a, b) => a - b);
const pct = p => sorted[Math.ceil(p / 100 * N) - 1];      // nearest-rank percentile
const mean = lat.reduce((s, x) => s + x, 0) / N;
console.log(`requests ${N}`);
console.log(`mean   ${mean.toFixed(1).padStart(7)} ms   <- pulled up by a few slow requests`);
for (const p of [50, 90, 95, 99, 99.9]) console.log(`p${String(p).padEnd(5)}${pct(p).toFixed(1).padStart(7)} ms`);
console.log(`max    ${sorted[N - 1].toFixed(1).padStart(7)} ms`);
const p99 = pct(99);
console.log("fan-out: one user request waits for the slowest of n servers");
for (const n of [1, 10, 50, 100]) {
  const theory = 1 - 0.99 ** n;               // P(at least one of n calls is slower than p99)
  let hit = 0;
  for (let k = 0; k < 2000; k++) {
    let worst = 0;
    for (let j = 0; j < n; j++) worst = Math.max(worst, lat[Math.floor(rand() * N)]);
    if (worst > p99) hit++;
  }
  console.log(`n=${String(n).padEnd(4)} 1-0.99^n = ${(100 * theory).toFixed(1).padStart(5)}%   simulated ${(100 * hit / 2000).toFixed(1).padStart(5)}%`);
}

আউটপুট:

requests 20000
mean      33.4 ms   <- pulled up by a few slow requests
p50      19.0 ms
p90      25.6 ms
p95      27.6 ms
p99     245.0 ms
p99.9  2633.5 ms
max     3007.8 ms
fan-out: one user request waits for the slowest of n servers
n=1    1-0.99^n =   1.0%   simulated   0.9%
n=10   1-0.99^n =   9.6%   simulated   8.8%
n=50   1-0.99^n =  39.5%   simulated  38.8%
n=100  1-0.99^n =  63.4%   simulated  63.8%

গড় ৩৩.৪ ms, অথচ p95 মাত্র ২৭.৬ ms — অর্থাৎ ৯৫% মানুষ গড়ের চেয়ে ভালো সময় পেয়েছেন। ০.৫% খুব ধীর অনুরোধ (সেকেন্ডের ঘরে) গড়কে টেনে তুলেছে। তাই গড় দেখে না সাধারণ অভিজ্ঞতা বোঝা যায়, না খারাপ অভিজ্ঞতা। p50 = ১৯.০ ms সাধারণ অভিজ্ঞতা; p99 = ২৪৫ ms দেখায় queue বা cache-এর সমস্যা আছে; p99.9 = ২.৬ s দেখায় কোথাও retransmission timeout ঘটছে (পর্ব ৩০)। Fan-out: একটি সার্ভারে ১% লেজ, কিন্তু ১০০টি সার্ভার ছুঁয়ে আসা অনুরোধের প্রায় ৬৩% লেজে পড়ে — সূত্রের ৬৩.৪% আর simulation-এর ৬৩.৮% প্রায় মিলে যায় (simulation-এ ২,০০০টি নমুনা, তাই সামান্য পার্থক্য)। এজন্যই বড় সিস্টেম প্রতিটি অংশের p99, এমনকি p99.9, লক্ষ্য হিসেবে ধরে।

Little's law — কতজন একসাথে সিস্টেমে

Queueing তত্ত্বের সবচেয়ে সরল আর সবচেয়ে কাজের সূত্র Little's law: স্থিতিশীল যেকোনো সিস্টেমে গড়ে ভেতরে থাকা কাজের সংখ্যা L = আগমনের হার λ × প্রতিটির গড় সময় W. সূত্রটি আগমন বা সেবার বণ্টনের ওপর নির্ভর করে না — এটাই এর শক্তি।

সমাধান করা অঙ্ক — Little's law তিন জায়গায়
  • ওয়েব সার্ভার: সেকেন্ডে ২,০০০ অনুরোধ আসে, প্রতিটির গড় সময় ৫০ ms = ০.০৫ s. একসাথে চলমান অনুরোধ L = ২,০০০ × ০.০৫ = ১০০টি. প্রতি অনুরোধে একটি thread লাগলে অন্তত ১০০টি thread বা সংযোগ লাগবে; latency বেড়ে ২০০ ms হলে একই হারে লাগবে ৪০০টি।
  • TCP পাইপ: আগমনের হার = ১২.৫ MB/s (১০০ Mbps), প্রতিটি byte পথে থাকে এক RTT = ০.১ s. পথে থাকা byte = ১২.৫ × ০.১ = ১.২৫ MB — এটাই BDP. Bandwidth-delay product আসলে Little's law-এর একটি রূপ।
  • ব্যাংকের লাইন: ঘণ্টায় ৬০ জন গ্রাহক আসেন, প্রত্যেকে গড়ে ১০ মিনিট (১/৬ ঘণ্টা) থাকেন। ভেতরে গড়ে ৬০ × ১/৬ = ১০ জন.

৩ · Speed test আসলে কী মাপে — bit, byte আর পথ

আপনি একটি speed test সাইটে চাপ দিলেন, দেখাল ৪৮ Mbps download. এই সংখ্যার পেছনে কী ঘটল? সাধারণভাবে (পরিষেবাভেদে খুঁটিনাটি আলাদা): পরীক্ষাটি প্রথমে কাছের — কম ping-এর — একটি পরীক্ষা-সার্ভার বেছে নেয়, প্রায়ই আপনার ISP-র নিজের নেটওয়ার্কের ভেতরে বা কাছে। তারপর একসাথে কয়েকটি TCP সংযোগ খুলে কয়েক সেকেন্ড ধরে যত দ্রুত সম্ভব ডেটা নামায়, slow start-এর শুরুর অংশ অনেক সময় বাদ দিয়ে হিসাব করে। অনেক সংযোগে একটি সংযোগের window বা loss-এর সীমা ঢেকে যায়, তাই সংখ্যাটি মোটামুটি আপনার access link-এর ক্ষমতা দেখায়।

আপনার অ্যাপের ডাউনলোড প্রায়ই এর চেয়ে কম হয়, আর সেটা স্বাভাবিক:

  • সার্ভার দূরে: অ্যাপের সার্ভার হয়তো সিঙ্গাপুর বা ইউরোপে — RTT বেশি, পথে আরও অনেক link আর ভিড়।
  • একটি সংযোগ: বেশিরভাগ অ্যাপ একটি TCP বা QUIC সংযোগে নামায়; তার window, slow start আর loss সামলানোর ক্ষমতা সীমিত (পর্ব ৩২)।
  • সার্ভারের নিজের সীমা: সার্ভার হয়তো প্রতি ব্যবহারকারীকে নির্দিষ্ট হারের বেশি দেয় না, বা ব্যস্ত।
  • আপনার নিজের দিক: Wi-Fi-র সংকেত, পুরোনো router, ফোনের ব্যস্ত CPU, বা ধীর ডিস্কে লেখা (পর্ব ৩১-এর backpressure).

Mbps বনাম MB/s — ৮-এর ফাঁদ

ISP-র প্যাকেজ লেখা থাকে Mbps-এ — megabit per second (bps), আর ব্রাউজার বা download manager দেখায় MB/s — megabyte per second. ১ byte = ৮ bit. তাই ভাগ করতে হয় ৮ দিয়ে।

সমাধান করা অঙ্ক — ৫০ Mbps প্যাকেজ
  • তাত্ত্বিক সর্বোচ্চ = ৫০ ÷ ৮ = ৬.২৫ MB/s.
  • Header-এর দাম (~৯৪% goodput, অংশ ১) বাদে বাস্তবে ভালো অবস্থায় প্রায় ৫.৯ MB/s. Download manager ৫.৫–৫.৯ MB/s দেখালে প্যাকেজ ঠিকঠাক চলছে।
  • একটি ২ GB (২ × ১০৯ byte) ফাইল: ২ × ১০৯ × ৮ ÷ (৫০ × ১০৬) = ৩২০ s, প্রায় সাড়ে পাঁচ মিনিট — আদর্শ অবস্থায়।
  • আরও একটি ফাঁদ: অনেক সফটওয়্যার “MB” বলতে ১০,৪৮,৫৭৬ byte (MiB) বোঝায়, আর নেটওয়ার্কের “M” সবসময় ১০৬. পার্থক্য প্রায় ৫%.

বাংলাদেশে — BDIX বনাম আন্তর্জাতিক পথ

বাংলাদেশে অনেক ISP-র প্যাকেজে দেশের ভেতরের ট্রাফিক আর আন্তর্জাতিক ট্রাফিকের গতি আলাদা করে লেখা থাকে। কারণ দেশের ভেতরের ISP-রা BDIX-এর মতো exchange-এ সরাসরি ট্রাফিক বদল করে (পর্ব ০২, নেটওয়ার্কের ধরন; পর্ব ২৫, BGP আর IXP) — পথ ছোট, RTT কম, খরচও কম। আন্তর্জাতিক ট্রাফিক সমুদ্রের তলার cable আর ভাড়া করা ক্ষমতা দিয়ে বিদেশে যায়, যার খরচ বেশি আর সন্ধ্যার ভিড়ে চাপও বেশি হতে পারে। তাই একই সংযোগে দেশের একটি সার্ভারে speed test খুব ভালো আসতে পারে, অথচ বিদেশি একটি সাইট থেকে নামানো ধীর হতে পারে। কোন পথে কত গতি, তা ISP, এলাকা আর সময়ভেদে অনেক বদলায় — নিজের সংযোগে দুই রকম সার্ভারে, দিনের ভিন্ন সময়ে মেপে দেখাই নির্ভরযোগ্য উপায়।

ভালো speed test কী দেখায়: শুধু download আর upload নয়, idle latency (খালি অবস্থার ping) আর loaded latency (ডাউনলোড চলার সময়ের ping)ও। দুটির পার্থক্য বড় হলে আপনার router বা modem-এ bufferbloat আছে (অংশ ৯)। macOS-এর নতুন সংস্করণে networkQuality কমান্ড এই ধরনের “responsiveness” মাপে; কিছু ওয়েব পরীক্ষাও loaded latency দেখায়।

৪ · পদ্ধতি মেনে মাপা — প্রশ্ন, নিয়ন্ত্রণ আর পুনরাবৃত্তি

একবার একটি সংখ্যা দেখে সিদ্ধান্ত নেওয়া পারফরম্যান্সের সবচেয়ে সাধারণ ভুল। বিজ্ঞানের পরীক্ষার মতো এখানেও নিয়ম আছে:

  1. প্রশ্ন ঠিক করুন। “নেট স্লো” নয় — “অফিস থেকে সিঙ্গাপুরের সার্ভারে ১ GB ব্যাকআপ কেন ৪০ মিনিট নেয়?” বা “লগইন পাতার p95 কেন ২ সেকেন্ড?” প্রশ্নই ঠিক করে কী মাপবেন: throughput, latency, না দুটোই।
  2. চলক নিয়ন্ত্রণ করুন। একই যন্ত্র, একই পথ, একই সময়; একবারে একটি জিনিস বদলান। Wi-Fi-তে মাপলে তারের সংযোগেও মাপুন, যাতে বোঝা যায় সমস্যা Wi-Fi-তে কি না।
  3. কয়েকবার চালান, বণ্টন লিখুন। অন্তত ৫–১০ বার; median আর পরিসর (বা p95) লিখুন, একটি “সেরা” সংখ্যা নয়।
  4. Warm-up বাদ দিন — অথবা আলাদা করে মাপুন। প্রথম অনুরোধে DNS, TCP আর TLS handshake, ঠান্ডা cache আর slow start থাকে। “প্রথমবার খোলা” আর “চলমান অবস্থা” দুটো আলাদা প্রশ্ন।
  5. End-to-end আর প্রতি-hop আলাদা করুন। প্রথমে পুরো পথ মাপুন (ব্যবহারকারী যা দেখেন), তারপর ভাগ করে (LAN, ISP, দূরের সার্ভার) কোথায় সময় যাচ্ছে খুঁজুন।

টুলের বাক্স

iperf3 দুই প্রান্তে চালাতে হয় — একদিকে সার্ভার, অন্যদিকে client — আর এটি নিজে ডেটা বানিয়ে পাঠায়, তাই ডিস্ক বা অ্যাপের প্রভাব ছাড়াই শুধু নেটওয়ার্কের পথ মাপে। শুধু নিজের বা অনুমতি পাওয়া সার্ভারে চালাবেন; অন্যের নেটওয়ার্কে ভারী ট্রাফিক পাঠানো অনৈতিক আর অনেক জায়গায় নিষিদ্ধ। নিচের উদাহরণ একটি সাধারণ Linux মেশিনের (এই পাতার runner-এ নয়; ঠিকানা ডকুমেন্টেশনের জন্য সংরক্ষিত 203.0.113.0/24 থেকে):

iperf3 -s                                   # সার্ভারে: শুনতে থাকে (ডিফল্ট port 5201)
iperf3 -c 203.0.113.10 -t 30                # client: ৩০ সেকেন্ড TCP, client থেকে সার্ভারে
iperf3 -c 203.0.113.10 -t 30 -R             # -R: উল্টো দিক (সার্ভার পাঠায়) — download মাপা
iperf3 -c 203.0.113.10 -t 30 -P 4           # -P 4: একসাথে ৪টি TCP stream
iperf3 -c 203.0.113.10 -u -b 50M -t 10      # UDP, ঠিক 50 Mbit/s হারে — loss আর jitter দেখতে
$ iperf3 -c 203.0.113.10 -t 30          (উদাহরণ, সংক্ষেপিত)
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  1.09 GBytes   312 Mbits/sec    3             sender
[  5]   0.00-30.15  sec  1.09 GBytes   311 Mbits/sec                  receiver

$ iperf3 -c 203.0.113.10 -u -b 50M -t 10   (উদাহরণ, সংক্ষেপিত)
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec  59.6 MBytes  50.0 Mbits/sec  0.000 ms  0/42808 (0%)  sender
[  5]   0.00-10.04  sec  59.6 MBytes  49.8 Mbits/sec  0.412 ms  21/42808 (0.049%)  receiver

পড়ার কৌশল: TCP-তে Retr হলো retransmission-এর সংখ্যা — অনেক হলে পথে loss. ৩১২ Mbps × ৩০ s = ১১৭ কোটি byte ≈ ১.০৯ GiB — iperf3-এর “GBytes” আসলে 230-এর একক। UDP-তে প্রেরক হার ঠিক করে দেয়, তাই throughput নয়, প্রাপকের দিকের loss (২১/৪২,৮০৮ = ০.০৪৯%) আর jitter (০.৪১২ ms) আসল তথ্য — ভয়েস বা ভিডিওর পথ যাচাইয়ে এটাই দরকার। -P দিয়ে একাধিক stream-এ গতি অনেক বাড়লে বুঝবেন একটি সংযোগ window বা loss-এ আটকে আছে, link নয়।

ping আর mtr latency আর loss দেখায় — ping শেষ প্রান্ত পর্যন্ত, mtr প্রতিটি hop-এ (ভেতরের কাজ পর্ব ২০-এ, ICMP). মাঝের router নিজের কাছে আসা ICMP-র উত্তর কম অগ্রাধিকারে দেয়, তাই শুধু একটি মাঝের hop-এ loss কিন্তু পরের hop-গুলোতে নেই — এটা সাধারণত সমস্যা নয়। Windows-এ কাছাকাছি কাজের টুল pathping; iperf3 Windows আর macOS-এও পাওয়া যায়।

ss -ti (ss) Linux kernel-এর ভেতর থেকে চলমান প্রতিটি TCP সংযোগের হিসাব দেখায় — নেটওয়ার্কের “ড্যাশবোর্ড”। (বিস্তারিত পর্ব ৩২, TCP congestion control.)

$ ss -ti dst 203.0.113.10        (উদাহরণ, সংক্ষেপিত — iperf3 চলার সময়)
ESTAB 0 0 10.0.2.15:52814 203.0.113.10:5201
   cubic wscale:7,7 rto:356 rtt:152.4/0.8 mss:1448 pmtu:1500 cwnd:4300 send 327Mbps
   delivery_rate 312Mbps rwnd_limited:27900ms(93.0%) retrans:0/3

এখানে rtt:152.4 মানে মসৃণ করা RTT ১৫২.৪ ms; send 327Mbps হলো cwnd × mss × ৮ ÷ rtt = ৪,৩০০ × ১,৪৪৮ × ৮ ÷ ০.১৫২৪ ≈ ৩২৭ Mbps — cwnd যত পাঠাতে দিত। কিন্তু আসল delivery_rate ৩১২ Mbps, আর সবচেয়ে বড় সূত্র rwnd_limited ... (93.0%): সময়ের ৯৩% প্রেরক আটকে ছিল প্রাপকের window-এর জন্য — না congestion, না loss. অংশ ৭-এ ঠিক এই সংযোগটি tune করব।

নিজের হাতে একটি throughput পরীক্ষা — loopback-এ

iperf3-এর মূল ধারণাটি ছোট: একদিক যত দ্রুত পারে লেখে, অন্যদিক byte গোনে আর সময় মাপে। নিচের C প্রোগ্রাম ঠিক সেটি করে, একই মেশিনের loopback-এ (127.0.0.1). fork() করা child প্রেরক, parent প্রাপক। প্রথমবার kernel-এর ডিফল্ট buffer আর autotuning, দ্বিতীয়বার SO_RCVBUF/SO_SNDBUF দিয়ে buffer মাত্র ৪ KB চেয়ে নেওয়া (Linux তা দ্বিগুণ করে রাখে, পর্ব ৩১)।

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#define MB (1024L * 1024)                                  /* 1 MiB */
static char buf[64 * 1024];
static double now(void) { struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); return t.tv_sec + t.tv_nsec / 1e9; }
static void test(const char *label, int bsize, long total) {   /* bsize 0 = kernel defaults + autotuning */
    int L = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in a = { .sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_LOOPBACK) };
    socklen_t al = sizeof a;
    if (bsize) setsockopt(L, SOL_SOCKET, SO_RCVBUF, &bsize, sizeof bsize);   /* accept() inherits it */
    bind(L, (struct sockaddr *)&a, sizeof a); listen(L, 1); getsockname(L, (struct sockaddr *)&a, &al);
    fflush(stdout);
    if (fork() == 0) {                                     /* child = sender: write total bytes, then close */
        int c = socket(AF_INET, SOCK_STREAM, 0);
        if (bsize) setsockopt(c, SOL_SOCKET, SO_SNDBUF, &bsize, sizeof bsize);
        if (connect(c, (struct sockaddr *)&a, sizeof a) < 0) _exit(1);
        for (long sent = 0; sent < total; ) { ssize_t n = write(c, buf, sizeof buf); if (n <= 0) _exit(1); sent += n; }
        close(c); _exit(0);
    }
    double t0 = now();                                     /* parent = receiver: count bytes until EOF */
    int s = accept(L, NULL, NULL); long got = 0; ssize_t n;
    while ((n = read(s, buf, sizeof buf)) > 0) got += n;
    double dt = now() - t0;
    wait(NULL); close(s); close(L);
    printf("%-24s %4ld MiB in %5.2f s = about %5ld MiB/s = %4.1f Gbit/s\n",
           label, got / MB, dt, 10 * (long)(got / MB / dt / 10 + 0.5), got * 8 / dt / 1e9);
}
int main(void) {
    test("default buffers", 0, 1024 * MB);
    test("SO_RCVBUF/SNDBUF 4 KB", 4096, 64 * MB);
    return 0;
}

একটি রানের আউটপুট (অনলাইন runner-এ; প্রতিবার সংখ্যা বদলায়):

default buffers          1024 MiB in  0.55 s = about  1870 MiB/s = 15.7 Gbit/s
SO_RCVBUF/SNDBUF 4 KB      64 MiB in  0.45 s = about   140 MiB/s =  1.2 Gbit/s

প্রথম লাইন: ডিফল্ট buffer-এ ১,০২৪ MiB প্রায় আধা সেকেন্ডে — দশ Gbit/s-এর বেশি। এটা কোনো তারের গতি নয়: loopback-এ packet কোনো NIC-এ যায় না, kernel শুধু এক socket-এর buffer থেকে আরেক socket-এর buffer-এ memory copy করে। তাই সংখ্যাটি মূলত CPU আর memory-র গতি, আর একই প্রোগ্রাম কয়েকবার চালালে আমরা প্রায় ১৩ থেকে ১৭ Gbit/s-এর মতো ভিন্ন ভিন্ন ফল দেখেছি — এটাই অংশ ৪-এর “কয়েকবার চালান” নিয়মের জীবন্ত উদাহরণ। দ্বিতীয় লাইন: buffer ছোট করতেই গতি দশ গুণের বেশি কমল। কারণ প্রতিবার মাত্র কয়েক KB পাঠিয়েই প্রেরককে প্রাপকের পড়া আর window খোলার অপেক্ষা করতে হয় — প্রতি round-এ অনেক বেশি system call, context switch আর ACK. বাস্তব দূরপাল্লার পথে এই একই সীমা আরও কঠোর, কারণ প্রতি অপেক্ষা হয় পুরো এক RTT: throughput ≤ window ÷ RTT (পর্ব ৩১)। MB ম্যাক্রোটি এখানে ১০,৪৮,৫৭৬ byte, তাই একক MiB.

৫ · সময় কোথায় যায় — curl -w আর ব্রাউজারের waterfall

একটি ওয়েব অনুরোধ “ধীর” হলে প্রথম প্রশ্ন: কোন ধাপে? curl-এর -w (write-out) option অনুরোধ শেষে সময়ের হিসাব ছাপে। মূল চলকগুলো সবই শুরু থেকে ক্রমযোজিত (cumulative) সেকেন্ড — প্রতিটি ধাপের সময় পেতে পাশের দুটির বিয়োগ করতে হয়:

curl -o /dev/null -s -w 'dns %{time_namelookup}\ntcp %{time_connect}\ntls %{time_appconnect}\nttfb %{time_starttransfer}\ntotal %{time_total}\n' https://example.com/
চলক (শুরু থেকে)কখন শেষধাপের সময় = বিয়োগ
time_namelookupDNS উত্তর এলোDNS = namelookup
time_connectTCP handshake শেষTCP = connect − namelookup ≈ ১ RTT
time_appconnectTLS handshake শেষTLS = appconnect − connect (TLS 1.3 ≈ ১ RTT, 1.2 ≈ ২ RTT)
time_starttransferউত্তরের প্রথম byte এলোঅপেক্ষা = starttransfer − appconnect ≈ ১ RTT + সার্ভারের কাজ
time_totalশেষ byte এলোBody = total − starttransfer

শেষ দুটির মাঝেও একটি চলক আছে, time_pretransfer (অনুরোধ পাঠানোর ঠিক আগে); সাধারণত appconnect-এর প্রায় সমান। ব্রাউজার যে TTFB দেখায়, তার কাছাকাছি সংখ্যা time_starttransfer. এবার একটি বাস্তবসম্মত ফল ধাপে ধাপে পড়ি:

ক্রমযোজিত মান: namelookup 0.012 · connect 0.062 · appconnect 0.165 · starttransfer 0.410 · total 0.452 (s)
এই ধাপের হিসাব
ধাপ
RTT-র হিসাবে
সিদ্ধান্ত
  1. কাঁচা ফল। curl পাঁচটি সংখ্যা দিল, সবই অনুরোধ শুরুর মুহূর্ত থেকে গোনা। শেষটি (০.৪৫২ s) মোট সময়। ধাপের সময় পেতে পরপর দুটির বিয়োগ করতে হবে।
  2. DNS — ১২ ms. নাম থেকে ঠিকানা পেতে ১২ ms. Resolver কাছে, বা উত্তর cache-এ ছিল (পর্ব ৩৫)। এখানে কিছু করার নেই।
  3. TCP — ৫০ ms. Three-way handshake-এর জন্য client-কে এক RTT অপেক্ষা করতে হয়, তাই এই সংখ্যাই পথের RTT-র ভালো অনুমান: প্রায় ৫০ ms.
  4. TLS — ১০৩ ms. ১০৩ ÷ ৫০ ≈ ২ RTT. TLS 1.3-এর পূর্ণ handshake-এ লাগে ১ RTT, TLS 1.2-তে ২ RTT (পর্ব ৪৮)। সম্ভবত সার্ভার এখনো TLS 1.2-তে, বা session resumption কাজ করছে না — যাচাইয়ের বিষয়।
  5. অপেক্ষা — ২৪৫ ms. অনুরোধ পাঠিয়ে প্রথম byte আসতে ২৪৫ ms. এর এক RTT (৫০ ms) যাওয়া-আসায়, বাকি প্রায় ১৯৫ ms সার্ভার ভেবেছে — database, ধীর কোড বা পেছনের অন্য সার্ভিস। এটিই সবচেয়ে বড় অংশ।
  6. Body — ৪২ ms, আর রায়। উত্তর নামাতে মাত্র ৪২ ms — bandwidth সমস্যা নয়। মোট ৪৫২ ms-এর প্রায় ৪৩% সার্ভারের কাজ, তারপর বাড়তি এক RTT-র TLS. প্রথম কাজ সার্ভারের দিকে (profiling, cache), দ্বিতীয় TLS 1.3 চালু করা। Bandwidth বাড়িয়ে এখানে প্রায় কিছুই হবে না।

এই বিচার নিয়মে বেঁধে একটি ছোট interpreter বানানো যায়। নিচের প্রোগ্রামে পাঁচটি উদাহরণ — একটি সুস্থ, আর চারটিতে ভিন্ন ভিন্ন সমস্যা; কোনটি কী, প্রোগ্রাম নিজে বলবে:

// Reading curl -w timings. curl prints CUMULATIVE seconds from the start; subtract to get each phase.
const runs = [  // [label, namelookup, connect, appconnect, starttransfer, total]
  ["A healthy, nearby",  0.004, 0.012, 0.031, 0.058, 0.061],
  ["B",                  1.208, 1.216, 1.235, 1.262, 1.265],
  ["C",                  0.005, 0.255, 0.758, 1.012, 1.020],
  ["D",                  0.004, 0.012, 0.031, 1.874, 1.877],
  ["E",                  0.003, 0.011, 0.030, 0.056, 9.310],
];
const ms = s => (s * 1000).toFixed(0).padStart(5);
console.log("run (ms)".padEnd(20) + ["DNS", "TCP", "TLS", "wait", "xfer"].map(h => h.padStart(5)).join("") + "  -> diagnosis");
for (const [name, dnsEnd, tcpEnd, tlsEnd, firstByte, total] of runs) {
  const ph = { DNS: dnsEnd, TCP: tcpEnd - dnsEnd, TLS: tlsEnd - tcpEnd,
               wait: firstByte - tlsEnd, xfer: total - firstByte };
  const rtt = ph.TCP;                                   // a TCP handshake costs about 1 RTT
  let why;
  if (ph.DNS > 0.2) why = "DNS slow: resolver far/overloaded, or a retry after a timeout";
  else if (ph.xfer > total / 2) why = "body transfer dominates: big response, bandwidth-bound";
  else if (ph.wait > 4 * rtt + 0.1) why = `server slow: waited ${ms(ph.wait - rtt).trim()} ms beyond 1 RTT (TTFB)`;
  else if (rtt > 0.1) why = `far server: RTT ~${ms(rtt).trim()} ms, TLS = ${(ph.TLS / rtt).toFixed(1)} RTT` +
                           (ph.TLS > 1.5 * rtt ? " (TLS 1.2 or no resumption?)" : "");
  else why = "nothing stands out";
  console.log(`${name.padEnd(20)}${Object.values(ph).map(ms).join("")}  -> ${why}`);
}

আউটপুট:

run (ms)              DNS  TCP  TLS wait xfer  -> diagnosis
A healthy, nearby       4    8   19   27    3  -> nothing stands out
B                    1208    8   19   27    3  -> DNS slow: resolver far/overloaded, or a retry after a timeout
C                       5  250  503  254    8  -> far server: RTT ~250 ms, TLS = 2.0 RTT (TLS 1.2 or no resumption?)
D                       4    8   19 1843    3  -> server slow: waited 1835 ms beyond 1 RTT (TTFB)
E                       3    8   19   26 9254  -> body transfer dominates: big response, bandwidth-bound

B: শুধু DNS-এই ১,২০৮ ms, বাকি সব A-র মতো — resolver ধীর, বা প্রথম DNS প্রশ্নের উত্তর না পেয়ে timeout-এর পর আবার চেষ্টা (timeout-এর মান OS আর সেটিংভেদে আলাদা)। C: সব RTT-নির্ভর ধাপ বড় — TCP ২৫০ ms মানে RTT প্রায় ২৫০ ms, TLS ৫০৩ ms মানে ২ RTT, অপেক্ষা ২৫৪ ms মানে প্রায় ঠিক ১ RTT (সার্ভার আসলে দ্রুত)। সমাধান সার্ভারকে কাছে আনা (CDN), TLS 1.3 আর সংযোগ পুনর্ব্যবহার। D: সংযোগ দ্রুত, কিন্তু প্রথম byte-এর জন্য ১,৮৪৩ ms অপেক্ষা — সমস্যা নেটওয়ার্কে নয়, সার্ভারের ভেতরে। E: প্রথম byte ৫৬ ms-এ এসেছে, কিন্তু body নামাতে ৯.২৫ s — বড় ফাইল, এখানে bandwidth আর throughput-ই প্রশ্ন। খেয়াল করুন, প্রোগ্রাম TCP handshake-এর সময়কেই RTT-র মাপকাঠি ধরেছে; এই ধরনের নিয়ম সহায়ক অনুমান, প্রমাণ নয়।

ব্রাউজারের waterfall আর Core Web Vitals

ব্রাউজারের DevTools-এর Network ট্যাব প্রতিটি অনুরোধের জন্য এই একই ভাগ রঙিন দাগে দেখায় — DNS, Initial connection, SSL, “Waiting for server response” (TTFB), Content download — আর সব অনুরোধ সময়ের অক্ষে সাজিয়ে waterfall ছবি বানায়। সিঁড়ির মতো একটির পর একটি অনুরোধ মানে round trip-এর শিকল (যেমন HTML → CSS → font). পুরো পাতার অভিজ্ঞতা মাপতে Google Core Web Vitals নামে কয়েকটি মাপ প্রচার করে — বর্তমান নির্দেশিকায় LCP (প্রধান কনটেন্ট দেখা যাওয়া, ভালো ≤ ২.৫ s), INP (ক্লিকের সাড়া, ভালো ≤ ২০০ ms) আর CLS (লেআউটের নড়াচড়া, ভালো ≤ ০.১) — আর Lighthouse টুল এগুলোর ল্যাব-অনুমান দেয়। সংজ্ঞা আর সীমা সময়ের সাথে বদলায় (২০২৪ সালে FID-এর জায়গায় INP এসেছে), তাই বর্তমান ডকুমেন্টেশন দেখে নেবেন; আর এগুলোর অনেকটা নেটওয়ার্কের নয়, পাতার নকশার ব্যাপার।

৬ · Latency-bound বনাম bandwidth-bound — ছোট পাতার অঙ্ক

একটি HTTPS পাতা খুলতে কটি round trip লাগে? নতুন সংযোগে: DNS (১ RTT, যদি cache-এ না থাকে), TCP handshake (১ RTT), TLS (1.3-এ ১, 1.2-তে ২ RTT), তারপর HTTP অনুরোধ আর উত্তর। উত্তর বড় হলে TCP-র slow start প্রথম round-এ পাঠাতে দেয় মাত্র initial window — আধুনিক Linux-এ ১০টি segment, প্রায় ১৪.৬ KB — তারপর প্রতি RTT-তে দ্বিগুণ (পর্ব ৩২)। অর্থাৎ ছোট ফাইলে link যত দ্রুতই হোক, ডেটা যায় RTT-র ছন্দে। এমন কাজকে বলে latency-bound. বড় ফাইলে slow start দ্রুত শেষ হয়, তারপর সময় ঠিক করে link-এর হার — bandwidth-bound.

নিচের calculator একটি সরলীকৃত মডেলে হিসাব করে: DNS = TCP = ১ RTT, TLS ১ বা ২ RTT, আর HTTP-তে slow start-এর প্রতিটি round কমপক্ষে এক RTT, বা সেই round-এর ডেটা তারে তুলতে যত সময় লাগে তার বেশি হলে সেটি। Loss, সার্ভারের কাজের সময় আর DNS resolver-এর আলাদা দূরত্ব ধরা হয়নি।

// Page-load latency budget: DNS + TCP + TLS + HTTP (slow start, initial cwnd 10). Simplified model.
const MSS = 1460, IW = 10;
function transfer(bytes, rttMs, mbps) {     // request -> last byte, in ms
  let segs = Math.ceil(bytes / MSS), cwnd = IW, t = 0, rounds = 0;
  while (segs > 0) {
    const n = Math.min(cwnd, segs), tx = n * MSS * 8 / (mbps * 1000);   // ms to put n segments on the wire
    segs -= n; rounds++;
    t += segs > 0 ? Math.max(rttMs, tx) : rttMs + tx;   // wait for ACKs, unless the burst is longer than an RTT
    cwnd *= 2;                                          // slow start: cwnd doubles every round trip
  }
  return { t, rounds };
}
function page(name, rtt, mbps, bytes, tls13 = true) {
  const dns = rtt, tcp = rtt, tls = (tls13 ? 1 : 2) * rtt, h = transfer(bytes, rtt, mbps);
  const total = dns + tcp + tls + h.t;
  const f = x => x.toFixed(0).padStart(6);
  console.log(`${name.padEnd(24)}${f(dns)}${f(tcp)}${f(tls)}${f(h.t)} ${`(${h.rounds} rounds)`.padEnd(11)}${f(total)} ms`);
  return total;
}
const head = t => console.log(t.padEnd(24) + ["DNS", "TCP", "TLS", "HTTP"].map(h => h.padStart(6)).join("") + " rounds".padEnd(12) + " total");
head("100 KB page");
const base = page("RTT 100 ms, 10 Mbps", 100, 10, 100e3);
const bw2 = page("bandwidth x2 (20 Mbps)", 100, 20, 100e3);
const rtt2 = page("RTT / 2 (50 ms)", 50, 10, 100e3);
page("1 Gbps, RTT 100 ms", 100, 1000, 100e3);
page("same, TLS 1.2", 100, 1000, 100e3, false);
console.log(`gain: bandwidth x2 saves ${(base - bw2).toFixed(0)} ms, RTT / 2 saves ${(base - rtt2).toFixed(0)} ms`);
head("50 MB download");
const big = page("RTT 100 ms, 10 Mbps", 100, 10, 50e6);
const bigBw = page("bandwidth x2 (20 Mbps)", 100, 20, 50e6);
const bigRtt = page("RTT / 2 (50 ms)", 50, 10, 50e6);
console.log(`gain: bandwidth x2 saves ${(big - bigBw).toFixed(0)} ms, RTT / 2 saves ${(big - bigRtt).toFixed(0)} ms`);

আউটপুট:

100 KB page                DNS   TCP   TLS  HTTP rounds      total
RTT 100 ms, 10 Mbps        100   100   100   346 (3 rounds)    646 ms
bandwidth x2 (20 Mbps)     100   100   100   323 (3 rounds)    623 ms
RTT / 2 (50 ms)             50    50    50   196 (3 rounds)    346 ms
1 Gbps, RTT 100 ms         100   100   100   300 (3 rounds)    600 ms
same, TLS 1.2              100   100   200   300 (3 rounds)    700 ms
gain: bandwidth x2 saves 23 ms, RTT / 2 saves 300 ms
50 MB download             DNS   TCP   TLS  HTTP rounds      total
RTT 100 ms, 10 Mbps        100   100   100 40325 (12 rounds) 40625 ms
bandwidth x2 (20 Mbps)     100   100   100 20419 (12 rounds) 20719 ms
RTT / 2 (50 ms)             50    50    50 40119 (12 rounds) 40269 ms
gain: bandwidth x2 saves 19906 ms, RTT / 2 saves 357 ms

১০০ KB পাতা: ১০০,০০০ ÷ ১,৪৬০ = ৬৮.৫, অর্থাৎ ৬৯টি segment; slow start-এ ১০ + ২০ + ৪০ = ৭০ ≥ ৬৯, তাই ৩টি round. মোট ৬টি RTT (DNS, TCP, TLS আর ৩টি data round) = ৬০০ ms-এর ভিত্তি, আর bandwidth যোগ করে শুধু শেষ round-এর তারে তোলার সময়। তাই bandwidth দ্বিগুণ করলে বাঁচে মাত্র ২৩ ms, ১ Gbps করলেও মোট ৬০০ ms-এর নিচে নামে না — কিন্তু RTT অর্ধেক করলে বাঁচে ৩০০ ms. TLS 1.2-এর বাড়তি এক RTT একাই যোগ করে ১০০ ms. ৫০ MB ডাউনলোড: চিত্র উল্টো — ৫০ × ১০৬ × ৮ ÷ ১০৭ = ৪০ s শুধু তারে তোলা; bandwidth দ্বিগুণে বাঁচে প্রায় ২০ s, RTT অর্ধেকে মাত্র ০.৩৬ s. একই নেটওয়ার্ক, কাজভেদে সম্পূর্ণ ভিন্ন bottleneck.

ভিত্তি: RTT 100 ms, 10 Mbps, MSS 1460, initial cwnd 10, TLS 1.3 · সময় ms-এ
পরিস্থিতি
DNS + TCP + TLS
HTTP-র round
মোট
কে সীমা টানছে
  1. ভিত্তি। সংযোগ তৈরিতে তিনটি RTT — DNS, TCP, TLS 1.3 — মোট ৩০০ ms, আর HTTP-তে ৩৪৬ ms. সব মিলিয়ে ৬৪৬ ms. দেখা যাক এর কতটা bandwidth-এর জন্য।
  2. HTTP-র ভেতরে। প্রথম round-এ ১০টি segment (১৪,৬০০ byte) তারে তুলতে ১০ Mbps-এ লাগে ১১.৭ ms, দ্বিতীয়তে ২০টি ২৩.৪ ms — দুটিই RTT-র চেয়ে অনেক ছোট, তাই প্রেরক বাকি সময় ACK-এর অপেক্ষায় বসে থাকে: প্রতিটি round পুরো ১০০ ms. শেষ round-এ বাকি ৩৯টি segment, ১০০ + ৪৫.৬ ms. মোট ৩৪৫.৬ ≈ ৩৪৬ ms.
  3. Bandwidth দ্বিগুণ। শুধু তারে তোলার সময় অর্ধেক হলো: শেষ round ৪৫.৬ থেকে ২২.৮ ms. প্রথম দুই round তো আগেও ACK-এর অপেক্ষা করছিল — সেখানে কোনো লাভ নেই। মোট ৬২৩ ms, মাত্র ২৩ ms (৩.৫%) উন্নতি।
  4. Bandwidth ১০০ গুণ। ১ Gbps-এ শেষ round-এর ডেটা তোলা প্রায় ০.৫ ms. তবু মোট ৬০০ ms — ছয়টি RTT-র মেঝে কোনো bandwidth ভাঙতে পারে না। এটাই latency-bound কাজের সংজ্ঞা।
  5. RTT অর্ধেক। ছয়টি RTT-ই ৫০ ms হলো: ১৫০ + ৫০ + ৫০ + ৯৫.৬ = ৩৪৫.৬ ≈ ৩৪৬ ms — প্রায় অর্ধেক, ৩০০ ms বাঁচল। কাছের CDN edge বা কম round trip-এর protocol ঠিক এই লাভটি দেয়।
  6. বড় ফাইলে উল্টো। ৫০ MB-তে ৪০ সেকেন্ড শুধু ১০ Mbps-এ তারে তোলা। Bandwidth দ্বিগুণে মোট ৪০.৬ থেকে ২০.৭ s; RTT অর্ধেকে মাত্র ০.৩৬ s লাভ। তাই প্রশ্ন সবসময়: আমার কাজটি কোন জাতের — অল্প ডেটার অনেক round trip, না অনেক ডেটার স্রোত?

৭ · BDP দিয়ে tuning — long fat path-এর চেকলিস্ট

পর্ব ৩১-এ (TCP flow control) প্রমাণ করেছেন: throughput ≤ min(R, W ÷ RTT), তাই link পূর্ণ করতে window W ≥ R × RTT = BDP. Tuning-এর কাজ এই অসমতাকে চেকলিস্টে রূপ দেওয়া। উদাহরণ: ঢাকার একটি অফিস থেকে ইউরোপের একটি ডেটা সেন্টারে রাতের ব্যাকআপ, ১ Gbps পথ, RTT ১৫০ ms.

সমাধান করা অঙ্ক — ১ Gbps × ১৫০ ms
  • BDP = ১০৯ bit/s × ০.১৫ s = ১.৫ × ১০৮ bit = ১.৫ × ১০৮ ÷ ৮ = ১,৮৭,৫০,০০০ byte = ১৮.৭৫ MB.
  • প্রাপকের window যদি ৬ MiB (৬২,৯১,৪৫৬ byte) পর্যন্তই বাড়তে পারে: সর্বোচ্চ = ৬২,৯১,৪৫৬ × ৮ ÷ ০.১৫ ≈ ৩৩৫.৫ Mbps — link-এর এক-তৃতীয়াংশ।
  • ১৮.৭৫ MB window-এর জন্য window scale (পর্ব ৩১): ১,৮৭,৫০,০০০ ÷ ৬৫,৫৩৫ ≈ ২৮৬ গুণ, তাই কমপক্ষে shift ৯ (29 = ৫১২)।
  • Linux buffer-এর একটি অংশ kernel-এর হিসাবরক্ষণে খরচ করে, তাই buffer-এর সর্বোচ্চ সীমা সাধারণত BDP-র প্রায় দ্বিগুণ রাখা হয় — এখানে ৬৪ MiB একটি সহজ পছন্দ।
পথ: 1 Gbps, RTT 150 ms · লক্ষ্য: ব্যাকআপের throughput · সব সংখ্যা উদাহরণ
কাজ
কমান্ড বা সূত্র
ফল
সিদ্ধান্ত
  1. প্রশ্ন আর ভিত্তি। প্রশ্ন: “১ Gbps পথে ব্যাকআপ কেন ধীর?” iperf3 দিয়ে ৩০ সেকেন্ড করে পাঁচবার মাপা হলো; median ৩১২ Mbps, retransmission প্রায় নেই। সংখ্যাটি লিখে রাখা হলো — পরে তুলনার জন্য এটাই ভিত্তি।
  2. কোথায় আটকে। ping দেখাল RTT প্রায় ১৫২ ms. চলমান সংযোগে ss -ti দেখাল সময়ের ৯৩% rwnd_limited. অর্থাৎ পথ ফাঁকা, loss নেই — প্রেরক প্রাপকের window-এর জন্য বসে আছে।
  3. BDP হিসাব। ১০৯ × ০.১৫ ÷ ৮ = ১৮.৭৫ MB দরকার। প্রাপকের autotuning-এর সর্বোচ্চ ৬ MiB, যা দিয়ে সর্বোচ্চ ৬২,৯১,৪৫৬ × ৮ ÷ ০.১৫ ≈ ৩৩৫ Mbps — মাপা ৩১২-এর খুব কাছে। তত্ত্ব আর মাপ মিলে গেল: সমস্যা window.
  4. একটি জিনিস বদল। দুই প্রান্তেই net.ipv4.tcp_rmem আর tcp_wmem-এর সর্বোচ্চ ৬৪ MiB করা হলো (প্রাপকের দিক window-এর জন্য, প্রেরকের দিক send buffer-এর জন্য)। Congestion control বা MTU একই রাখা হলো, যাতে ফলের কারণ নিশ্চিত থাকে।
  5. আবার মাপা। একই পদ্ধতিতে পাঁচবার: ৯০৫, ৯২১, ৯২৮, ৯৩১, ৯৩৪ Mbps — median ৯২৮. Header-সহ সর্বোচ্চ goodput ৯৪১ Mbps (অংশ ১), তাই ৯৮.৬%. প্রায় তিন গুণ উন্নতি, শুধু একটি সীমা বদলে।
  6. পার্শ্বপ্রতিক্রিয়া। Retransmission কম আছে কি না, একই পথে ping-এর RTT বেড়েছে কি না (bufferbloat), আর সার্ভারের মেমরি দেখা হলো। Autotuning শুধু দরকারি সংযোগেই buffer বাড়ায়, তাই সাধারণ সংযোগের মেমরি বাড়ে না। শেষে পরিবর্তনটি sysctl ফাইলে স্থায়ী করে, আগে-পরের সংখ্যাসহ লিখে রাখা হলো।

এই ধরনের বদল সাধারণত /etc/sysctl.d/-এ একটি ফাইলে লেখা হয়। নিচের মানগুলো উদাহরণ — উপরের ১৮.৭৫ MB BDP-র পথের জন্য; নিজের পথের BDP হিসাব না করে কপি করবেন না, আর প্রশাসকের অনুমতি ছাড়া বা আগে পরীক্ষামূলক মেশিনে না চালিয়ে সার্ভারে বসাবেন না:

# BDP = 1 Gbit/s x 0.150 s / 8 = 18.75 MB  ->  সর্বোচ্চ buffer প্রায় 2 x BDP = 64 MiB
net.core.rmem_max = 67108864          # SO_RCVBUF দিয়ে অ্যাপ সর্বোচ্চ যত চাইতে পারে
net.core.wmem_max = 67108864          # SO_SNDBUF-এর একই সীমা
net.ipv4.tcp_rmem = 4096 131072 67108864   # min default max — autotuning এই max পর্যন্ত বাড়ায়
net.ipv4.tcp_wmem = 4096 16384 67108864
# ঐচ্ছিক, আলাদা পরীক্ষায় — একসাথে সব নয়:
# net.core.default_qdisc = fq                 # BBR-এর pacing-এর জন্য প্রায়ই সুপারিশ করা হয়
# net.ipv4.tcp_congestion_control = bbr       # লোড করা module-এর তালিকায় থাকলে তবেই

কয়েকটি সূক্ষ্মতা: net.core.rmem_max সীমা টানে অ্যাপ SO_RCVBUF দিয়ে যত চাইতে পারে তার ওপর; autotuning-এর ছাদ tcp_rmem-এর তৃতীয় সংখ্যা। অ্যাপ নিজে SO_RCVBUF বসালে সেই socket-এর autotuning বন্ধ হয় (পর্ব ৩১)। Congestion control বদলানো আলাদা সিদ্ধান্ত — loss থাকা দীর্ঘ পথে BBR প্রায়ই CUBIC-এর চেয়ে বেশি throughput পায়, কিন্তু অন্য প্রবাহের সাথে ন্যায্যতার প্রশ্ন আছে (পর্ব ৩২)। BBR প্রথম দিকে pacing-এর জন্য fq qdisc-এর ওপর নির্ভর করত; নতুন kernel-এ TCP নিজেও pacing করতে পারে, তবু অনেক নির্দেশিকা fq সুপারিশ করে। Windows-এ এই কাজ করে “Receive Window Auto-Tuning”; macOS-এ sysctl-এর নাম আলাদা।

কখন tuning জরুরি, কখন অর্থহীন

জরুরি

Long fat network — উচ্চ bandwidth আর বড় RTT একসাথে: মহাদেশ পেরোনো ব্যাকআপ, ডেটা সেন্টারের মধ্যে প্রতিলিপি, বিজ্ঞানের বড় ডেটাসেট, উপগ্রহ link.

BDP কয়েক MB বা তার বেশি

প্রায় অর্থহীন

সাধারণ ওয়েব পাতা, API-র ছোট উত্তর, চ্যাট — কয়েক KB থেকে কয়েকশো KB-র প্রবাহ slow start শেষ হওয়ার আগেই শেষ। অংশ ৬-এ দেখেছেন, এখানে buffer নয়, RTT আর round trip-এর সংখ্যা সীমা।

latency-bound

ভুল জায়গা

Bottleneck যদি Wi-Fi, ISP-র সীমা, সার্ভারের CPU বা ডিস্ক হয়, TCP tuning কিছুই বদলাবে না। আগে মাপুন কোথায় আটকে।

আগে মাপুন

MTU, MSS আর offload

বড় MTU মানে প্রতি byte-এ কম header আর কম packet — অংশ ১-এ দেখেছেন jumbo frame-এ goodput প্রায় ৯৯%. কিন্তু data center-এর ভেতরের মতো নিয়ন্ত্রিত নেটওয়ার্কের বাইরে jumbo frame প্রায় কাজে আসে না, কারণ ইন্টারনেটের পথে MTU সাধারণত ১,৫০০; আর পথের কোনো যন্ত্র ছোট MTU-তে থাকলে Path MTU Discovery-র সমস্যা হতে পারে (পর্ব ২০)। Packet-প্রতি CPU-র খরচ কমাতে আধুনিক NIC আর kernel offload ব্যবহার করে: পাঠানোর সময় TSO/GSO-তে kernel একটি বড় খণ্ড (৬৪ KB পর্যন্ত) দেয় আর NIC বা kernel-এর শেষ ধাপ সেটিকে MSS-মাপের segment-এ কাটে; গ্রহণে GRO একই প্রবাহের পরপর packet জুড়ে বড় খণ্ড বানায়; checksum offload checksum-এর হিসাব NIC-কে দেয়। ফল: একই CPU-তে অনেক বেশি throughput. পার্শ্বফল: tcpdump-এ প্রায়ই ৬৪ KB-র “packet” বা ভুল checksum দেখা যায়, যা তারে কখনো যায়নি — পর্ব ৫৫-এ (সমস্যা খোঁজা) এই বিভ্রান্তি এড়ানোর কৌশল। Linux-এ ethtool -k <interface> কোন offload চালু তা দেখায়; খুঁটিনাটি driver আর NIC-ভেদে আলাদা।

৮ · অ্যাপ আর সার্ভারের দিক — round trip কমানো আর queue বোঝা

অংশ ৬-এর শিক্ষা হলো, বেশিরভাগ ওয়েব কাজে সবচেয়ে বড় লাভ আসে round trip কমিয়ে বা ছোট করে। অ্যাপের দিকের পরিচিত কৌশল:

কৌশলকী বাঁচায়কোথায় বিস্তারিত
সংযোগ পুনর্ব্যবহার (keep-alive, connection pool)প্রতি অনুরোধে TCP + TLS-এর ২–৩ RTT, আর slow start আবার শুরু হওয়াপর্ব ৩৬
TLS 1.3, session resumption, 0-RTTHandshake-এর ১ RTT বা তার বেশি (0-RTT-তে replay-এর ঝুঁকি মাথায় রেখে)পর্ব ৪৮
HTTP/2 আর HTTP/3একটি সংযোগে অনেক অনুরোধ; HTTP/3-এ transport আর TLS handshake একসাথে, আর TCP-র HOL blocking নেইপর্ব ৩৭, HTTP/2 আর HTTP/3
Cache আর CDNপুরো round trip (cache hit) বা RTT ছোট করা (কাছের edge)পর্ব ৩৮, Web cache আর CDN
Compression (gzip, Brotli)লেখা-জাতীয় ডেটার byte কয়েক গুণ কমে, ফলে slow start-এর round-ও কমে; ছবি আর ভিডিও আগেই সংকুচিতপর্ব ৩৬
Preconnect, dns-prefetchপরে লাগবে এমন সার্ভারের DNS আর সংযোগ আগেভাগে সেরে রাখাHTML-এর <link rel="preconnect">
কম round trip-এর নকশাChatty API-র দশটি ধারাবাহিক অনুরোধের বদলে একটি; গুরুত্বপূর্ণ CSS আগে খুঁজে পাওয়াপর্ব ৩৪

সার্ভারের দিকে: অনেক সংযোগ কম thread-এ সামলাতে event-driven নকশা (পর্ব ৪৪, Event-driven সার্ভার); ছোট ছোট লেখায় Nagle আর delayed ACK-এর মিলিত ৪০ ms-এর মতো স্থবিরতা এড়াতে একবারে পুরো উত্তর লেখা বা প্রয়োজনে TCP_NODELAY (পর্ব ৩০, TCP-র নির্ভরযোগ্যতা); আর লগে শুধু গড় নয়, প্রতিটি endpoint-এর p50/p95/p99 রাখা।

Queue-এর অন্তর্দৃষ্টি — কেন ৯০% ব্যস্ততা বিপজ্জনক

পর্ব ০৫-এ traffic intensity দেখেছেন: ρ ১-এর কাছে গেলে queuing delay লাফিয়ে বাড়ে। সরল M/M/1 মডেলে (এলোমেলো আগমন, এলোমেলো সেবার সময়, একজন সেবাদাতা) গড় মোট সময় T = S ÷ (১ − ρ), যেখানে S গড় সেবার সময় আর ρ = λ × S ব্যস্ততা। S = ১০ ms হলে:

ব্যস্ততা ρ৫০%৭০%৮০%৯০%৯৫%৯৯%
T = ১০ ÷ (১ − ρ) ms২০৩৩.৩৫০১০০২০০১,০০০
গড়ে ভেতরে L = ρ ÷ (১ − ρ)১২.৩৪৯১৯৯৯

৮০% থেকে ৯০%-এ যেতে মাত্র ১২.৫% বেশি কাজ, কিন্তু গড় সময় দ্বিগুণ; ৯৯%-এ দশ গুণ। (দ্বিতীয় সারিটি Little's law দিয়েও মেলে: L = λT = (ρ ÷ S) × S ÷ (১ − ρ).) বাস্তব সিস্টেম M/M/1 নয়, তবু আকৃতিটি প্রায় সর্বত্র দেখা যায়। এজন্য capacity planning-এ প্রচলিত একটি থাম্ব-রুল হলো link বা সার্ভারের স্বাভাবিক সর্বোচ্চ ব্যস্ততা ৭০–৮০%-এর আশেপাশে রাখা, যাতে হঠাৎ ভিড় আর একটি যন্ত্র বিকল হওয়ার ধাক্কা সামলানো যায়; সঠিক লক্ষ্য কাজের ধরন, খরচ আর latency-র লক্ষ্যভেদে প্রতিষ্ঠান নিজে ঠিক করে। পরিকল্পনা হয় p95 বা peak ঘণ্টার মাপ দেখে, দিনের গড় দেখে নয় — গড়ে ৩০% ব্যস্ত link সন্ধ্যার এক ঘণ্টায় ৯৫%-এ থাকতে পারে।

৯ · Bufferbloat পরীক্ষা আর খরচের হিসাব

বাড়িতে কেউ বড় ফাইল upload করছেন, আর একই সময়ে অন্য কারও ভিডিও কল আটকে যাচ্ছে — এটা প্রায়ই bufferbloat: router বা modem-এর বিশাল buffer ভরে থাকে, প্রতিটি packet লম্বা লাইনে দাঁড়ায় (পর্ব ১৫, Network layer). পরীক্ষাটি সহজ, আর নিজের সংযোগেই করবেন:

  1. খালি অবস্থায় এক মিনিট ping চালিয়ে median RTT লিখুন (idle latency).
  2. এবার নিজের সংযোগ ভরিয়ে দিন — একটি বড় upload বা নিজের সার্ভারের সাথে iperf3 -P 4 — আর একই সাথে ping চালু রাখুন (loaded latency).
  3. পার্থক্য দেখুন। কয়েক ms বাড়া স্বাভাবিক; কয়েকশো ms বা সেকেন্ড বাড়লে bufferbloat.

প্রতিকার: router-এ AQM — CoDel, fq_codel বা CAKE — যা packet-কে বেশিক্ষণ queue-তে থাকতে দেয় না আর প্রবাহগুলোকে আলাদা লাইনে রাখে। কিন্তু queue জমে সবচেয়ে ধীর link-এ (সাধারণত ISP-র modem), যা আপনার router নিয়ন্ত্রণ করে না; তাই OpenWrt-এর SQM-এর মতো ব্যবস্থায় router নিজের পাঠানোর হার link-এর চেয়ে সামান্য কম (প্রায়ই ৮৫–৯৫%) বেঁধে দেয়, যাতে queue router-এর নিজের হাতে, AQM-এর নিয়ন্ত্রণে জমে। সামান্য bandwidth ছেড়ে অনেকখানি latency কেনা — একটি সচেতন বাণিজ্য। Linux-এর অনেক distribution-এ ডিফল্ট qdisc ইতিমধ্যে fq_codel.

পারফরম্যান্সের দাম

প্রতিটি উন্নতির একটি খরচ আছে, আর ভালো প্রকৌশল সেটা জেনে বেছে নেয়:

  • মেমরি: প্রতিটি সংযোগে ৬৪ MiB buffer “সর্বোচ্চ” মানে ১০,০০০ সংযোগের সার্ভারে তাত্ত্বিক সর্বোচ্চ ৬২৫ GiB. Autotuning শুধু দরকারে বাড়ায় বলে বাস্তবে এমন হয় না, তবু সীমা বাড়ানোর আগে মেমরির হিসাব দরকার।
  • CPU বনাম byte: উচ্চ স্তরের compression byte কমায় কিন্তু CPU খায়; প্রতিবার না করে আগে থেকে সংকুচিত ফাইল রাখা একটি মাঝামাঝি পথ।
  • টাকা বনাম latency: বাড়তি bandwidth, CDN, একাধিক অঞ্চলে সার্ভার — সবই মাসিক বিল। অংশ ৬ বলে, ছোট পাতায় বেশি bandwidth কিনে প্রায় লাভ নেই; কাছের edge কিনলে আছে।
  • জটিলতা: প্রতিটি tuning নথিভুক্ত করে প্রতিটি নতুন সার্ভারে আবার করতে হয়; ভুলে যাওয়া একটি sysctl পরে রহস্যময় সমস্যা হয়ে ফেরে।
  • ন্যায্যতা: একটি অ্যাপ অনেক সমান্তরাল সংযোগ খুলে বা আক্রমণাত্মক congestion control দিয়ে নিজের গতি বাড়ালে, ভাগ করা link-এ অন্যদের ভাগ কমে।

আরও গভীরে: Linux kernel প্রতিটি TCP সংযোগের জন্য tcp_info কাঠামোয় delivery rate, প্রাপকের window-এ আটকে থাকার সময় (rwnd_limited) আর send buffer-এ আটকে থাকার সময় (sndbuf_limited) রাখে — ss -ti সেগুলোই দেখায়, আর BBR নিজেও delivery rate-এর নমুনা দিয়ে পথের bottleneck bandwidth অনুমান করে। তাই packet capture ছাড়াই বলা যায় সংযোগটি window, cwnd না অ্যাপের কারণে আটকে আছে। আরও সূক্ষ্ম মাপে eBPF-ভিত্তিক টুল প্রতিটি retransmission kernel-এর ভেতর থেকে গুনতে পারে।

পরীক্ষা ও ইন্টারভিউতে — প্রায়ই আসে এমন প্রশ্ন:

  • Throughput আর goodput-এর পার্থক্য? — Throughput মোট পৌঁছানো bit-এর হার; goodput শুধু অ্যাপের কাজের ডেটা, header আর পুনঃপ্রেরণ বাদে। ১ Gbps Ethernet-এ TCP goodput সর্বোচ্চ প্রায় ৯৪১ Mbps.
  • ১ Gbps, RTT ১৫০ ms পথে window কত লাগবে? — BDP = ১০৯ × ০.১৫ ÷ ৮ = ১৮.৭৫ MB; buffer সাধারণত তার প্রায় দ্বিগুণ রাখা হয়।
  • গড় latency না p99 — কোনটি দেখবেন? — দুটোই নয় একা; p50 সাধারণ অভিজ্ঞতা, p99 লেজ। Fan-out-এ ১ − ০.৯৯n সূত্রে লেজের প্রভাব বহু গুণ বাড়ে।
  • ওয়েবসাইট ধীর — bandwidth বাড়াবেন? — আগে মাপুন: ছোট পাতা latency-bound, round trip কমানো (keep-alive, TLS 1.3, CDN) বেশি কার্যকর।
  • ৫০ Mbps সংযোগে ১ GB ফাইল নামাতে কত সময়? — ৮ × ১০৯ ÷ (৫ × ১০৭) = ১৬০ s, আদর্শ অবস্থায়; header-এর কারণে বাস্তবে কিছুটা বেশি।

১০ · AI-এর যুগে পারফরম্যান্স — সংখ্যা মিলিয়ে নেওয়া

“আমার সার্ভার দ্রুত করার sysctl দাও” — AI এমন প্রশ্নে প্রায়ই ইন্টারনেটের পুরোনো “tuning guide” থেকে কুড়িয়ে আনা লম্বা তালিকা দেয়, যার কিছু অপ্রয়োজনীয়, কিছু পুরোনো kernel-এর, কিছু ক্ষতিকর। হিসাবেও AI-এর ভুলের ধরন চেনা:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
Mbps আর MB/s, বা MB আর MiB গুলিয়ে ৮ গুণ বা ৫% ভুলনেটওয়ার্ক bit-এ, ফাইল byte-এ মাপেএককসহ নিজে আবার হিসাব করুন
“Bandwidth বাড়ালেই সাইট দ্রুত হবে”ছোট পাতা latency-boundcurl -w বা waterfall-এ সময়ের ভাগ দেখুন
একটি ping বা একটি speed test থেকে সিদ্ধান্তএকটি নমুনা বণ্টন নয়কয়েকবার মাপুন, median আর p95 লিখুন
কারণ না দেখে বিশাল sysctl তালিকা, বা tcp_tw_recycle-এর মতো সরানো সেটিংঅনেক সেটিং নতুন kernel-এ নেই বা ক্ষতিকর (tcp_tw_recycle Linux 4.12-এ সরানো হয়েছে)নিজের kernel-এর ip-sysctl ডকুমেন্টেশন আর sysctl -a মেলান
পুরোনো কমান্ড (netstat, ifconfig) বা বানানো ফ্ল্যাগআধুনিক Linux-এ ss, ip; iperf2 আর iperf3-এর ফ্ল্যাগ আলাদাman iperf3, man ss দেখুন
“Firewall বা QoS বন্ধ করলে দ্রুত হবে”নিরাপত্তা খুইয়ে প্রায় কোনো লাভ নেইপ্রথমে মাপুন সত্যিই সেখানে সময় যাচ্ছে কি না

AI-কে পারফরম্যান্সের সমস্যা দিলে মাপা তথ্য, একক আর সীমা আগেই দিয়ে দিন:

একটি নেটওয়ার্ক পারফরম্যান্স সমস্যা বিশ্লেষণ করো। তথ্য: Linux সার্ভার থেকে দূরের সার্ভারে ব্যাকআপ, link 1 Gbps, ping-এ RTT median 150 ms, iperf3 (30 s, ৫ বার) median 312 Mbps, retransmission প্রায় 0, ss -ti-তে rwnd_limited 93%, net.ipv4.tcp_rmem = "4096 131072 6291456". ১. BDP byte-এ হিসাব করো, প্রতিটি ধাপে একক লিখে। ২. বর্তমান সর্বোচ্চ window দিয়ে তাত্ত্বিক throughput কত হয়, আর তা মাপা ৩১২ Mbps-এর সাথে মেলে কি না বলো। ৩. শুধু যে সেটিং বদলানো দরকার তা বলো — প্রতিটির নাম kernel-এর ip-sysctl ডকুমেন্টেশনের সাথে মিলিয়ে, কোনটি প্রাপকে আর কোনটি প্রেরকে, আর কোনটির জন্য root লাগে। ৪. বদলের পর কী মেপে ফল যাচাই করব আর কোন পার্শ্বপ্রতিক্রিয়া (মেমরি, bufferbloat) দেখব, তা বলো। ৫. যা তুমি নিশ্চিত জানো না, তা অনুমান না করে স্পষ্ট বলো।

AI-এর উত্তর মানার আগে — চেকলিস্ট

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

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

প্র ০১ইন্টারনেট সংযোগ বিক্রি হয় Mbps দিয়ে, অথচ অনেক কাজে latency বেশি গুরুত্বপূর্ণ। এই অসংগতি কোথা থেকে এলো, আর কেন bandwidth বাড়ানো সহজ কিন্তু latency কমানো কঠিন?

১৯৯৬ সালে Stuart Cheshire “It's the Latency, Stupid” নামে একটি বিখ্যাত প্রবন্ধ লেখেন। তাঁর যুক্তি ছিল, modem-এর যুগেও মানুষ শুধু bit/s-এর হিসাব করে, অথচ বহু interactive কাজে ধীরগতির আসল কারণ latency. তিনি একটি সরল সত্য মনে করিয়ে দেন: bandwidth টাকা দিয়ে কেনা যায় — আরেকটি তার, আরেকটি fiber-এর রঙ, সমান্তরাল link. কিন্তু latency-র একটি অংশ পদার্থবিজ্ঞান দিয়ে বাঁধা। Fiber-এ আলো চলে শূন্যস্থানের প্রায় দুই-তৃতীয়াংশ গতিতে, প্রায় ২ × ১০৮ m/s; ঢাকা থেকে প্রায় ৮,০০০ km দূরের একটি শহরে সোজা পথেও শুধু propagation-এ এক দিকে ৪০ ms, RTT ৮০ ms — আর বাস্তব cable-এর পথ সোজা নয়। কোনো প্যাকেজ এর নিচে নামাতে পারে না।

বিক্রির দিক থেকেও Mbps সুবিধাজনক: একটি সংখ্যা, বড় হলে ভালো, আর access link-এ সত্যিই ISP-র নিয়ন্ত্রণে। Latency নির্ভর করে আপনি কোন সার্ভারে যাচ্ছেন তার ওপর — ISP একা নিশ্চয়তা দিতে পারে না। ফলে দীর্ঘদিন বাজার একটি মাত্রাতেই প্রতিযোগিতা করেছে। অংশ ৬-এর অঙ্ক দেখিয়েছে পরিণাম: সাধারণ ওয়েব পাতায় বাড়তি bandwidth প্রায় অদৃশ্য, কিন্তু প্রতিটি RTT সরাসরি টের পাওয়া যায়।

তাহলে latency কমানো হয় কীভাবে? দূরত্ব কমিয়ে — CDN আর edge সার্ভার কনটেন্টকে ব্যবহারকারীর কাছে নিয়ে যায়, দেশের ভেতরের ট্রাফিক IXP-তে বদল হয়; round trip-এর সংখ্যা কমিয়ে — TLS 1.3, QUIC, সংযোগ পুনর্ব্যবহার, TCP-র বড় initial window; আর queue কমিয়ে — AQM আর ভালো congestion control. গত দুই দশকের ওয়েব-প্রোটোকলের বেশিরভাগ উন্নতি এই তিন দিকেই। সাম্প্রতিক কালে speed test-গুলোও loaded latency বা “responsiveness” দেখাতে শুরু করেছে, যা এই পুরোনো অসংগতি কমানোর একটি চেষ্টা।

মূল উপলব্ধি: Bandwidth কেনা যায়, latency-র মেঝে আলোর গতি দিয়ে বাঁধা; তাই আধুনিক পারফরম্যান্স প্রকৌশলের বড় অংশ হলো round trip কমানো আর কনটেন্ট কাছে আনা।

প্র ০২বড় অনলাইন সার্ভিসগুলো গড় latency নয়, p99 বা p99.9 নিয়ে এত মাথা ঘামায় কেন? লেজ ছোট রাখার কোন কৌশল তারা ব্যবহার করে?

২০১৩ সালে Google-এর Jeffrey Dean আর Luiz André Barroso “The Tail at Scale” নামে একটি প্রবন্ধ প্রকাশ করেন (Communications of the ACM). মূল যুক্তি অংশ ২-এর fan-out সূত্রটিই: একটি সার্চ বা feed তৈরি করতে একটি অনুরোধ শত শত সার্ভারে ভাগ হয়, আর উত্তর তৈরি হয় সবচেয়ে ধীরটির পরে। প্রতিটি সার্ভার ৯৯% সময় দ্রুত হলেও ১০০টির একটি অনুরোধের প্রায় ৬৩% কোনো না কোনো সার্ভারের লেজে পড়ে। অর্থাৎ বড় সিস্টেমে একটি অংশের “বিরল” ধীরতা পুরো সিস্টেমের “সাধারণ” অভিজ্ঞতা হয়ে যায়।

লেজ কোথা থেকে আসে? একই মেশিনে অন্য কাজের ভিড়, garbage collection-এর বিরতি, ডিস্কের পটভূমির কাজ, CPU-র তাপজনিত গতি কমানো, নেটওয়ার্কের queue, আর হারানো packet-এর retransmission timeout — অংশ ২-এর simulation-এ যে ০.৫% সেকেন্ডের ঘরে গেছে। এগুলো পুরোপুরি দূর করা অসম্ভব, তাই প্রবন্ধটি লেজ “সহ্য করার” কৌশলে জোর দেয়। Hedged request: একটি অনুরোধ পাঠিয়ে নির্দিষ্ট সময় (যেমন সেই ধরনের অনুরোধের p95) পেরোলেও উত্তর না এলে আরেকটি প্রতিলিপিতে একই অনুরোধ পাঠানো, যেটি আগে ফেরে সেটি নেওয়া; বাড়তি কাজ সামান্য, কিন্তু লেজ অনেক ছোট হয়। Tied request: দুই সার্ভারে পাঠিয়ে একটি শুরু করলে অন্যটিকে বাতিল করা। এছাড়া ধীর মেশিনকে সাময়িকভাবে বাদ দেওয়া, কাজকে ছোট টুকরোয় ভাগ করা যাতে একটি বড় কাজ সবার পথ আটকে না রাখে, আর কিছু ক্ষেত্রে “যথেষ্ট ভালো” আংশিক উত্তর দেওয়া।

নেটওয়ার্কের দিক থেকেও একই শিক্ষা: data center-এ একটি switch-এর buffer-এ মুহূর্তের ভিড় (incast) বা একটি হারানো packet-এর RTO লেজ তৈরি করে, তাই ছোট RTO, ECN আর DCTCP-র মতো কৌশল (পর্ব ৩২, ৫২) লেজের দিকে লক্ষ্য রেখেই এসেছে। আর SLO বা পরিষেবার লক্ষ্য লেখা হয় “৯৯% অনুরোধ ২০০ ms-এর ভেতরে” ধাঁচে, গড়ে নয়।

মূল উপলব্ধি: Fan-out লেজকে বহু গুণ বাড়ায়; তাই বড় সিস্টেম percentile-এ লক্ষ্য ঠিক করে আর hedged request-এর মতো কৌশলে লেজ সহ্য করতে শেখে।

প্র ০৩Bufferbloat কীভাবে আবিষ্কৃত হলো, আর “buffer বড় হলে loss কম, তাই ভালো” — এই সহজ যুক্তি কোথায় ভুল?

২০১০ সালের দিকে Jim Gettys, যিনি X Window System আর HTTP/1.1-এর কাজে পরিচিত, বাড়ির সংযোগে বড় ফাইল পাঠানোর সময় দেখলেন ping কয়েক সেকেন্ডে উঠে যাচ্ছে। খুঁজতে গিয়ে তিনি বুঝলেন সমস্যা কোনো একটি যন্ত্রে নয়: cable modem, বাড়ির router, অপারেটিং সিস্টেমের driver আর Wi-Fi — সবখানে buffer এত বড় যে ধীর link-এ কয়েক সেকেন্ডের ডেটা জমে থাকতে পারে। তিনি এর নাম দেন bufferbloat, আর ২০১১-১২ সালে কয়েকটি লেখা ও বক্তৃতার মাধ্যমে বিষয়টি নেটওয়ার্ক সম্প্রদায়ের সামনে আনেন।

সহজ যুক্তিটি ভুল কেন? Buffer-এর কাজ মুহূর্তের ধাক্কা সামলানো — একসাথে কয়েকটি packet এলে লাইনে রাখা। কিন্তু loss-ভিত্তিক TCP (Reno, CUBIC) loss না পাওয়া পর্যন্ত গতি বাড়াতে থাকে (পর্ব ৩২)। Buffer যত বড়, loss তত দেরিতে, তাই TCP buffer-টি পুরো ভরিয়ে রাখে। ফলে স্থায়ী একটি queue তৈরি হয়, যা throughput বাড়ায় না — link তো এমনিতেই পূর্ণ — শুধু প্রতিটি packet-কে লাইনে দাঁড় করায়। একই link ভাগ করা ভিডিও কল, গেম বা DNS প্রশ্নের প্রতিটি packet সেই লাইনের পেছনে পড়ে। তার ওপর TCP-র নিজের সংকেতও দেরিতে আসে, ফলে নিয়ন্ত্রণ আরও খারাপ হয়। অর্থাৎ bandwidth-এর লাভ শূন্য, latency-র দাম বিশাল। মেমরির দাম কমে যাওয়ায় যন্ত্র নির্মাতারা “বড় buffer, কম loss” ভেবে buffer বাড়িয়েছিলেন, যা ধীর link-এ ঠিক উল্টো ফল দেয়।

সমাধান এসেছে কয়েক দিক থেকে। Kathleen Nichols আর Van Jacobson ২০১২ সালে CoDel প্রস্তাব করেন, যা queue-এর দৈর্ঘ্য নয়, packet কতক্ষণ অপেক্ষা করল তা দেখে; পরে fq_codel প্রবাহগুলোকে আলাদা লাইনে রাখে, আর CAKE বাড়ির router-এর জন্য সব একসাথে গুছিয়ে দেয়। OpenWrt-এর মতো খোলা firmware আর Linux-এর ডিফল্ট qdisc-এ এগুলো ছড়িয়েছে, আর BBR-এর মতো congestion control queue খালি রাখার চেষ্টা করে। DOCSIS 3.1-এর মতো মানদণ্ডেও AQM যুক্ত হয়েছে। তবু বহু পুরোনো যন্ত্রে সমস্যাটি আজও আছে।

মূল উপলব্ধি: Buffer প্রয়োজন, কিন্তু স্থায়ী queue শুধু latency যোগ করে; queue ছোট রাখতে AQM আর ভালো congestion control লাগে, বড় buffer নয়।

প্র ০৪দুটি ভিন্ন speed test একই সংযোগে একই সময়ে ভিন্ন ফল দেয় কেন? “সঠিক” ইন্টারনেট গতি বলে কি কিছু আছে?

Speed test আসলে একটি নির্দিষ্ট পরীক্ষার ফল: কোন সার্ভার, কয়টি সংযোগ, কতক্ষণ, কোন অংশ বাদ দিয়ে হিসাব। এগুলো বদলালে ফলও বদলায়। বাণিজ্যিক অনেক পরীক্ষা কাছের সার্ভার বেছে নেয় আর একাধিক TCP সংযোগ একসাথে চালায়, যাতে access link-এর ক্ষমতা দেখা যায়। গবেষণা-ভিত্তিক Measurement Lab (M-Lab, ২০০৯ সালে কয়েকটি প্রতিষ্ঠান ও গবেষকের উদ্যোগে শুরু)-এর NDT পরীক্ষা মূলত একটি TCP সংযোগ দিয়ে মাপে আর বিস্তারিত TCP পরিসংখ্যান জনসাধারণের ডেটা হিসেবে প্রকাশ করে। একটি সংযোগ window, loss আর RTT-র প্রভাব বেশি দেখায়, তাই প্রায়ই কম সংখ্যা আসে। Netflix-এর fast.com-এর মতো পরীক্ষা মাপে একটি নির্দিষ্ট পরিষেবার সার্ভার থেকে। কোনোটিই “ভুল” নয় — তারা ভিন্ন প্রশ্নের উত্তর দেয়।

এর সাথে যোগ হয় পথ। কাছের সার্ভার হয়তো ISP-র নিজের নেটওয়ার্কে বা দেশের exchange-এ, দূরেরটি আন্তর্জাতিক link পেরিয়ে। সন্ধ্যার ভিড়ে আন্তর্জাতিক অংশে চাপ বেশি হলে দূরের সার্ভারের ফল কমে, কাছেরটির নয়। Wi-Fi-তে পরীক্ষা করলে ফলটি আসলে ঘরের বেতার link-এর, ISP-র নয়। আর একই পরীক্ষাও মুহূর্তভেদে বদলায় — অংশ ৪-এর loopback পরীক্ষাতেই দেখেছেন।

নীতিনির্ধারকেরাও এই সমস্যায় পড়েছেন। যুক্তরাষ্ট্রের FCC ২০১১ সাল থেকে “Measuring Broadband America” কর্মসূচিতে স্বেচ্ছাসেবীদের বাড়িতে নির্দিষ্ট পরিমাপ-যন্ত্র বসিয়ে বিজ্ঞাপিত আর প্রকৃত গতি তুলনা করে; ইউরোপের কয়েকটি দেশের নিয়ন্ত্রকও নিজস্ব পরিমাপ-পদ্ধতি দেয়, কারণ গ্রাহকের অভিযোগ যাচাইয়ে একটি স্বীকৃত পদ্ধতি দরকার।

তাই নিজের সংযোগ যাচাইয়ে: তারের সংযোগে, দিনের ভিন্ন সময়ে, দেশের ভেতরের আর বাইরের সার্ভারে কয়েকবার মাপুন, median লিখুন, আর latency-ও দেখুন। ISP-র সাথে কথা বলতে এই তালিকা একটি স্ক্রিনশটের চেয়ে অনেক শক্ত প্রমাণ।

মূল উপলব্ধি: প্রতিটি speed test একটি নির্দিষ্ট প্রশ্নের উত্তর; পদ্ধতি না জেনে দুটি সংখ্যা তুলনা অর্থহীন, আর গতি একটি বণ্টন — একক সংখ্যা নয়।

প্র ০৫TCP-র initial window ১ থেকে ৪, তারপর ১০ segment-এ বাড়ানো হলো। ছোট একটি সংখ্যা বদলাতে এত বিতর্ক আর সময় লাগল কেন?

Van Jacobson-এর ১৯৮৮ সালের congestion control-এ slow start শুরু হতো ১টি segment দিয়ে — ১৯৮৬-এর congestion collapse-এর পর সাবধানতাই ছিল প্রধান লক্ষ্য। ১৯৯৮ সালে পরীক্ষামূলক RFC 2414, আর ২০০২ সালে RFC 3390 initial window বাড়িয়ে প্রায় ৪ KB (MSS-ভেদে ২–৪টি segment) করার অনুমতি দেয়। তারপর ২০১০ সালের দিকে Google-এর প্রকৌশলীরা প্রস্তাব করেন ১০টি segment-এ নিতে, আর বিপুল পরিমাণ বাস্তব ট্রাফিকে পরীক্ষার ফল প্রকাশ করেন: ওয়েব অনুরোধের গড় latency উল্লেখযোগ্যভাবে কমেছে, আর retransmission সামান্য বেড়েছে। ২০১৩ সালে RFC 6928 (experimental) IW10 নথিভুক্ত করে; Linux kernel ২০১১ সালের দিকেই (২.৬.৩৯) ডিফল্ট ১০ করে।

লাভ কেন বড়? অংশ ৬-এর অঙ্কটি দেখুন: ছোট ফাইল latency-bound, আর প্রতিটি বাড়তি slow-start round মানে পুরো এক RTT. বেশিরভাগ ওয়েব উত্তর কয়েক KB থেকে কয়েক দশ KB; IW ৩ থেকে ১০ হলে অনেক উত্তর এক বা দুই round কম লাগে — উচ্চ RTT-র মোবাইল ব্যবহারকারীর জন্য শত শত ms.

তাহলে বিতর্ক কোথায়? Initial window হলো এমন ডেটা, যা পথ সম্পর্কে কিছু না জেনেই একসাথে পাঠানো হয়। ধীর link-এ — পুরোনো dial-up বা ভিড়ে থাকা মোবাইল সংযোগ — একটি পাতার জন্য ব্রাউজার ছয়টি সংযোগ খুললে একসাথে ৬০টি segment, প্রায় ৮৭ KB ঝাঁপিয়ে পড়ে; ছোট buffer উপচে loss হয়, আর অন্য ব্যবহারকারীর latency বাড়ে। সমালোচকেরা বলেছিলেন, একটি বড় কোম্পানির নেটওয়ার্কের মাপ সারা পৃথিবীর, বিশেষত উন্নয়নশীল দেশের ধীর সংযোগের প্রতিনিধি নাও হতে পারে। তাই IETF সময় নিয়েছে, ভিন্ন পরিবেশের পরিমাপ চেয়েছে, আর RFC-টি “experimental” রেখেছে। একই প্রশ্ন পরে QUIC-এর নকশাতেও ফিরে এসেছে।

মূল উপলব্ধি: Latency-bound কাজে একটি RTT বাঁচানোর মূল্য বিশাল, কিন্তু অন্ধভাবে বেশি পাঠানো অন্যের ক্ষতি করতে পারে; ইন্টারনেট-ব্যাপী সংখ্যা বদলাতে বহু পরিবেশের প্রমাণ লাগে।

অনুশীলন

খাতা-কলম আর ক্যালকুলেটর নিন — প্রতিটি সংখ্যার একক (bit, byte, s) লিখে হিসাব করুন।

  1. হাতে হিসাব (bit, byte আর BDP): (ক) একটি ৪০ Mbps সংযোগে ২ GB (২ × ১০৯ byte) ফাইল নামাতে আদর্শ অবস্থায় কত সময়? goodput ৯৪% হলে? (খ) Download manager ৪.৭ MB/s দেখালে সংযোগ কি ঠিক আছে? (গ) একটি ৫০০ Mbps পথে RTT ২২০ ms. BDP কত, আর ৮ MiB window দিয়ে সর্বোচ্চ throughput কত?

    (ক) ২ × ১০৯ × ৮ ÷ (৪০ × ১০৬) = ৪০০ s (৬ মিনিট ৪০ সেকেন্ড)। ৯৪%-এ ৪০০ ÷ ০.৯৪ ≈ ৪২৬ s, প্রায় ৭ মিনিট ৬ সেকেন্ড।

    (খ) ৪.৭ × ৮ = ৩৭.৬ Mbps, যা ৪০-এর ৯৪% — header-এর দাম বাদে প্রায় পুরোটাই। ঠিক আছে। (Manager যদি MiB-এ দেখায়, তাহলে ৪.৭ × ১০,৪৮,৫৭৬ × ৮ ≈ ৩৯.৪ Mbps — আরও ভালো।)

    (গ) BDP = ৫ × ১০৮ × ০.২২ ÷ ৮ = ১,৩৭,৫০,০০০ byte ≈ ১৩.৭৫ MB. ৮ MiB = ৮৩,৮৮,৬০৮ byte; ৮৩,৮৮,৬০৮ × ৮ ÷ ০.২২ ≈ ৩০৫ Mbps — link-এর ৬১%, window-limited. Buffer-এর সর্বোচ্চ সীমা অন্তত BDP, ভালো হয় প্রায় দ্বিগুণ।

  2. হাতে হিসাব (queue আর Little's law): একটি API সার্ভারের একটি worker, গড় সেবার সময় S = ২০ ms; M/M/1 ধরে নিন। (ক) সেকেন্ডে ৪০টি অনুরোধ এলে ρ, গড় মোট সময় T আর গড়ে ভেতরে থাকা অনুরোধ L কত? (খ) ৪৫টি এলে? (গ) ৭০% ব্যস্ততার লক্ষ্য রাখলে সেকেন্ডে সর্বোচ্চ কতটি অনুরোধ নেওয়া উচিত, আর তখন T কত?

    (ক) ρ = λS = ৪০ × ০.০২ = ০.৮; T = ২০ ÷ (১ − ০.৮) = ১০০ ms; L = λT = ৪০ × ০.১ = ৪.

    (খ) ρ = ০.৯; T = ২০ ÷ ০.১ = ২০০ ms; L = ৪৫ × ০.২ = ৯. অনুরোধ মাত্র ১২.৫% বাড়ল, অথচ সময় দ্বিগুণ।

    (গ) λ = ০.৭ ÷ ০.০২ = ৩৫ অনুরোধ/s; T = ২০ ÷ ০.৩ ≈ ৬৬.৭ ms. বাকি ৩০% ক্ষমতা হঠাৎ ভিড়ের জন্য রাখা।

  3. আউটপুট অনুমান করুন: অংশ ৫-এর curl interpreter-এর runs তালিকায় একটি নতুন সারি যোগ করা হলো: ["F", 0.003, 0.183, 0.365, 0.552, 0.560]. প্রতিটি ধাপের সময় (ms) কত আসবে, আর প্রোগ্রাম কোন রায় ছাপবে? আগে হাতে বের করুন, তারপর চালিয়ে মেলান।

    DNS = ৩, TCP = ১৮৩ − ৩ = ১৮০, TLS = ৩৬৫ − ১৮৩ = ১৮২, অপেক্ষা = ৫৫২ − ৩৬৫ = ১৮৭, body = ৫৬০ − ৫৫২ = ৮ ms. নিয়মগুলো ক্রমে: DNS ২০০ ms-এর কম; body মোটের অর্ধেকের কম; অপেক্ষা ১৮৭ ms, যা ৪ × ১৮০ + ১০০ = ৮২০ ms-এর কম — তাই সার্ভার ধীর নয়; কিন্তু RTT (১৮০ ms) > ১০০ ms. তাই সারিটি হবে:

    F                       3  180  182  187    8  -> far server: RTT ~180 ms, TLS = 1.0 RTT

    TLS মাত্র ১ RTT, তাই “(TLS 1.2 or no resumption?)” অংশটি আসে না — সম্ভবত TLS 1.3. অপেক্ষাও প্রায় ঠিক ১ RTT, অর্থাৎ সার্ভার দ্রুত। এখানে একমাত্র উপায় দূরত্ব কমানো (CDN বা কাছের অঞ্চলে সার্ভার) আর সংযোগ পুনর্ব্যবহার।

  4. কমান্ড লিখুন: আপনার নিজের দুটি Linux মেশিন আছে — A (192.168.1.10) আর B. (ক) A-তে iperf3 সার্ভার চালানোর কমান্ড। (খ) B থেকে, A থেকে B-তে আসা ডেটার throughput ৪টি সমান্তরাল stream-এ ২০ সেকেন্ড ধরে মাপার কমান্ড। (গ) ২০ Mbit/s হারে ১০ সেকেন্ড UDP পাঠিয়ে loss আর jitter মাপার কমান্ড, আর কোন লাইনের কোন কলাম পড়বেন। (ঘ) http://192.168.1.10/-এর জন্য শুধু TCP সংযোগের সময় আর TTFB ছাপানোর curl কমান্ড।

    (ক) iperf3 -s

    (খ) iperf3 -c 192.168.1.10 -R -P 4 -t 20 — -R উল্টো দিক (সার্ভার A পাঠায়, B পায়), -P 4 চারটি stream; ফলের [SUM] লাইনের receiver সারিটি দেখুন।

    (গ) iperf3 -c 192.168.1.10 -u -b 20M -t 10 — শেষের receiver লাইনের Jitter আর Lost/Total কলাম; sender লাইনে loss সবসময় ০ দেখায়, কারণ প্রেরক জানে না কী হারাল।

    (ঘ) curl -o /dev/null -s -w 'connect %{time_connect}\nttfb %{time_starttransfer}\n' http://192.168.1.10/ — দুটিই শুরু থেকে ক্রমযোজিত; TCP-র নিজের সময় = time_connect − time_namelookup (এখানে IP দেওয়া, তাই namelookup প্রায় ০)।

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

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

ক্রমএকটি ধীর long fat path tune করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. প্রশ্ন ঠিক করা আর কয়েকবার মেপে ভিত্তি-সংখ্যা লেখা
  2. ping আর ss -ti দিয়ে দেখা কী সীমা টানছে
  3. Bandwidth × RTT থেকে BDP হিসাব করা
  4. শুধু buffer-এর সর্বোচ্চ সীমা বদলানো
  5. একই পদ্ধতিতে আবার মেপে median তুলনা করা
  6. পার্শ্বপ্রতিক্রিয়া দেখে পরিবর্তন নথিভুক্ত করা

একটি ISP প্যাকেজ ৫০ Mbps. একটি ফাইল নামানোর সময় তাত্ত্বিক সর্বোচ্চ গতি MB/s-এ কত?

  • ৫০ MB/s
  • ৬.২৫ MB/s
  • ৪০০ MB/s
  • ৫ MB/s

একটি পথের bandwidth ১ Gbps আর RTT ১৫০ ms. Link পূর্ণ ব্যবহার করতে একটি TCP সংযোগের window অন্তত কত হওয়া উচিত?

  • ৬৪ KiB
  • ১৫০ MB
  • ১৮.৭৫ MB
  • ১.৮৭৫ MB

একটি ব্যবহারকারী-অনুরোধ ভেতরে ১০০টি সার্ভারে যায় আর সবার উত্তরের অপেক্ষা করে। প্রতিটি সার্ভারের ১% অনুরোধ তার p99-এর চেয়ে ধীর (স্বাধীনভাবে)। অনুরোধটি অন্তত একটি ধীর উত্তরের জন্য আটকে যাওয়ার সম্ভাবনা প্রায় কত?

  • ১%
  • ১০০%
  • প্রায় ১০%
  • প্রায় ৬৩%

curl -w একটি HTTPS অনুরোধের জন্য দেখাল: time_namelookup 0.010, time_connect 0.040, time_appconnect 0.075, time_starttransfer 1.420, time_total 1.430 (সেকেন্ড)। সবচেয়ে বড় সমস্যা কোথায়?

  • সার্ভারের উত্তর তৈরিতে (TTFB)
  • DNS resolution-এ
  • TCP handshake-এ
  • Body নামানোয় (bandwidth)

RTT ১০০ ms আর ১০ Mbps-এর একটি সংযোগে নতুন HTTPS সংযোগ খুলে ১০০ KB-র একটি পাতা নামাতে প্রায় ৬৫০ ms লাগে। কোন পরিবর্তন মোট সময় সবচেয়ে বেশি কমাবে?

  • Bandwidth দ্বিগুণ করা
  • কাছের সার্ভার বা CDN দিয়ে RTT অর্ধেক করা
  • TCP receive buffer ১০ গুণ বড় করা
  • Bandwidth ১ Gbps করা

M/M/1 মডেলে একটি সার্ভারের গড় সেবার সময় ১০ ms. ব্যস্ততা (utilisation) ৫০% থেকে ৯০% হলে গড় মোট সময় কী হয়?

  • ১০ ms-এই থাকে
  • ১৮ ms হয়
  • ২০ থেকে ৪০ ms হয়
  • ২০ ms থেকে ১০০ ms হয়

শব্দকোষ

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

মনে রাখুন

  1. শব্দ ঠিক রাখুন: bandwidth ≥ throughput ≥ goodput; latency (one-way বা RTT), jitter, loss আর utilisation আলাদা মাপ। Mbps ÷ ৮ = MB/s.
  2. বণ্টন দেখুন: p50, p95, p99 — গড় নয়। Fan-out-এ লেজ বাড়ে ১ − ০.৯৯n হারে; Little's law L = λW.
  3. পদ্ধতি: প্রশ্ন ঠিক করা, একবারে একটি বদল, কয়েকবার মাপা; iperf3, ping/mtr, ss -ti, curl -w, waterfall.
  4. BDP দিয়ে tuning: window ও buffer ≥ R × RTT (১ Gbps × ১৫০ ms = ১৮.৭৫ MB) — শুধু long fat path-এ জরুরি; ছোট flow latency-bound.
  5. Round trip কমানোই বড় লাভ: keep-alive, TLS 1.3, HTTP/2/3, CDN; আর সার্ভার ৭০–৮০% ব্যস্ততার বেশি না চালানো, কারণ queue ১/(১ − ρ) হারে বাড়ে।

পরের পর্বে: এতদিনের সব শেখা একসাথে — একটি প্রতিষ্ঠানের পুরো নেটওয়ার্ক নকশা: ঠিকানার পরিকল্পনা, VLAN, routing, নিরাপত্তা আর পারফরম্যান্সের লক্ষ্য মিলিয়ে ক্যাপস্টোন।

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

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