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

FinOps — rightsizing, tagging, showback আর unit economics

FinOps — Rightsizing, Tagging, Showback and Unit Economics

Taught in Bangla, this lesson defines FinOps as cost accountability rather than cost cutting, walks the Inform, Optimize and Operate loop, allocates a bill with tags, showback and chargeback, and rightsizes from p95 CPU and memory with a rollback plan. It covers off-hours schedules, idle resources, storage lifecycle, commitment coverage, budgets, forecasts, cost anomalies, cost per order and the monthly FinOps review.

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

  • FinOps Framework-এর Inform, Optimize আর Operate কী, আর প্রকৌশলীর ভূমিকা কোথায়
  • একটি বিলকে tag দেখে ভাগ করা, shared খরচ বণ্টন আর unallocated খুঁজে বের করা
  • p95 metric থেকে rightsizing, Kubernetes request কমানো আর rollback পরিকল্পনা
  • Off-hours সূচি, idle resource, storage lifecycle আর commitment coverage-এর হিসাব
  • Cost anomaly ধরা, budget ও forecast, cost per order আর মাসিক FinOps review

১ · FinOps কী — খরচকে কারও না কারও কাজ বানানো

একটি কাল্পনিক অনলাইন বাজার অ্যাপ ধরি, নাম “হাটঘর”। এই পর্বের সব সংখ্যা এই অ্যাপেরই, আর সব দাম ধরে নেওয়া। গত বছর হাটঘরের cloud বিল ছিল মাসে $৩,০০০। এ বছর তা $১০,০০০। হিসাব বিভাগ জিজ্ঞেস করলেন, “বাড়ল কেন?” প্রকৌশল দল বলল, “অর্ডার তো বেড়েছে।” কত বেড়েছে, কার কারণে বেড়েছে, কেউ বলতে পারলেন না।

মেসের বিদ্যুৎ বিলের কথা ভাবুন। পুরো মেসের এক মিটার, বিল সবাই সমান ভাগে দেন। তাই কেউ ফ্যান বন্ধ করেন না, কারণ নিজের বাঁচানো টাকা আটজনে ভাগ হয়ে যায়। প্রতিটি ঘরে সাব-মিটার বসালে ছবি বদলায়। কেউ বকা দেন না, তবু সবাই নিজের সংখ্যা দেখেন, আর নিজে থেকেই সুইচ বন্ধ হতে থাকে। FinOps সেই সাব-মিটার, আর তার সাথে মাসে একবার মেসের বৈঠক।

FinOps শব্দটি Finance আর DevOps জুড়ে তৈরি। FinOps Foundation-এর সংজ্ঞার সারকথা হলো: এটি একটি কাজের কাঠামো ও সংস্কৃতি, যেখানে প্রকৌশল, অর্থ আর ব্যবসা দল একসাথে বসে প্রযুক্তির (মূলত cloud-এর) খরচ থেকে ব্যবসার সর্বোচ্চ মূল্য বের করে, সময়মতো তথ্য দেখে সিদ্ধান্ত নেয়, আর খরচের জবাবদিহি ভাগ করে নেয়।

পুরোনো data centre-এ খরচের সিদ্ধান্ত হতো বছরে একবার, কেনাকাটা বিভাগের টেবিলে। পর্ব ০৪-এ দেখেছেন, cloud-এ খরচ হয়ে গেছে OpEx. এখন একজন প্রকৌশলী একটি Terraform line বদলালেই মাসে কয়েকশো ডলারের সিদ্ধান্ত হয়ে যায়। সিদ্ধান্ত যেহেতু প্রকৌশলীর হাতে এসেছে, খরচের তথ্যও তাঁর হাতে আসা দরকার। এটাই FinOps-এর মূল কথা।

মূল ধারণা

লক্ষ্য “সবচেয়ে কম বিল” নয়। লক্ষ্য হলো প্রতিটি খরচের পেছনে একটি মালিক আর একটি কারণ থাকা। নতুন ফিচারে খরচ বাড়া ভালো হতে পারে। কারণহীন খরচ কখনোই ভালো নয়।

FinOps Foundation-এর শুরু ২০১৯ সালের দিকে, আর ২০২০ সালে এটি Linux Foundation-এর অংশ হয়। J.R. Storment ও Mike Fuller-এর বই Cloud FinOps (O'Reilly, প্রথম সংস্করণ ২০১৯–২০, দ্বিতীয় সংস্করণ ২০২৩) এই চর্চার পরিচিত পাঠ্য। তবে ধারণাটি এদের আগেই বড় cloud ব্যবহারকারীদের ভেতরে গড়ে উঠছিল।

২ · Inform → Optimize → Operate লুপ

FinOps Framework কাজকে তিন phase-এ ভাগ করে। এগুলো একবার করে শেষ করার ধাপ নয়, একটি চলমান লুপ। আলাদা আলাদা service বা দল একই সময়ে আলাদা phase-এ থাকতে পারে।

FinOps-এর চলমান লুপ

Inform → Optimize → Operate → Inform

Inform থেকে Optimize, Optimize থেকে Operate, Operate থেকে আবার Inform Inform দেখা ও ভাগ করা tag · showback · unit cost Optimize খরচ কমানো আকার · সূচি · দর Operate অভ্যাস বানানো মালিক · নিয়ম · review ব্যবসার মূল্য business value প্রতি মাসে আবার ঘোরে
ছবি ৭৩.১ — তিনটি phase একটি লুপ, আর লুপের কেন্দ্রে ব্যবসার মূল্য, শুধু বিলের অঙ্ক নয়।
Phaseমূল প্রশ্নউদাহরণ কাজ
Informকে কত খরচ করছে, কেন?Tag, বিল ভাগ, showback, budget, unit cost
Optimizeকোথায় একই কাজ কম টাকায় হয়?Rightsizing, off-hours সূচি, idle মোছা, commitment
Operateএটি কীভাবে অভ্যাস হবে?মালিক ঠিক করা, নিয়ম, মাসিক review, automation

লেখার সময়ে Framework-এর ছয়টি নীতি মোটামুটি এই: দলগুলো একসাথে কাজ করবে; সিদ্ধান্ত হবে ব্যবসার মূল্য দেখে; নিজের প্রযুক্তি-ব্যবহারের দায় প্রত্যেকে নেবে; তথ্য হবে সহজলভ্য, সময়মতো ও সঠিক; FinOps-এর চর্চা কেন্দ্র থেকে সহায়তা পাবে; আর cloud-এর পরিবর্তনশীল খরচের সুবিধা কাজে লাগানো হবে। Framework নিয়মিত হালনাগাদ হয়। Domain আর capability-র নাম বদলায়, আর সাম্প্রতিক সংস্করণে আওতা শুধু public cloud-এ নেই, SaaS বা data centre-এর খরচও আসছে। তাই নামগুলো FinOps Foundation-এর ওয়েবসাইটে মিলিয়ে নিন।

Framework পরিপক্বতাকে তিন নামে ডাকে: Crawl, Walk, Run. শুরুতে সব কিছু নিখুঁত করার দরকার নেই। হাটঘরের প্রথম লক্ষ্য ছিল শুধু খরচের ৮০% কোনো দলের নামে আনা।

খরচের মালিক কে? FinOps-এর ছোট একটি কেন্দ্রীয় দল (বা একজন) তথ্য, tool আর commitment কেনা সামলান। কিন্তু VM-এর আকার বদলানোর সিদ্ধান্ত যে দলের service, সেই দলের। কেন্দ্রীয় দল হিসাবরক্ষক ও পরামর্শক। পুলিশ নয়। সবচেয়ে কার্যকর ছবিটি হলো, প্রকৌশলী নিজের dashboard-এ latency-র পাশেই খরচ দেখছেন।

৩ · দেখা: tag, allocation, showback আর chargeback

না দেখে কমানো যায় না। পর্ব ৩৫-এ আপনি tag নীতি, tag coverage আর unallocated খরচ দেখেছেন। সংক্ষেপে: ৪–৬টি দরকারি tag, নির্দিষ্ট মানের তালিকা, আর হিসাব খরচের অঙ্কে। এই পর্বে সেই tag থেকে দলের হাতে বিল পৌঁছানো দেখব। একে বলে cost allocation.

কাঁচা তথ্য আসে billing export থেকে: প্রতিটি resource-এর ঘণ্টা বা দিনভিত্তিক লাইন, যা warehouse-এ ঢোকানো যায়। Provider-এর console-এর চেয়ে এটিই নির্ভরযোগ্য উৎস। মনে রাখবেন, অনেক provider-এ tag-কে আলাদাভাবে “খরচের tag” হিসেবে চালু করতে হয়, আর চালু করার আগের খরচে তা সাধারণত দেখা যায় না।

এবার হাটঘরের $১০,০০০ বিলটি ধাপে ধাপে ভাগ করা যাক। এখানে “পরে” চেপে দেখুন, প্রতিটি ধাপে টেবিল কীভাবে বদলায়।

  1. কাঁচা বিল১১টি লাইন
  2. Tag দিয়ে ভাগ৫টি বালতি
  3. Unallocated$৭০০
  4. Shared ভাগ$১,৮০০
  5. Showbackদলের হাতে
bill.csvমোট $10,000
vm-web        compute    checkout   2600
db-orders     database   checkout   1400
vm-search     compute    search     1500
cache-search  cache      search      500
wh-reports    warehouse  data       1100
lake-raw      storage    data        400
nat-main      network    shared      800
logs-all      logging    shared      500
support-plan  support    shared      500
vm-old-test   compute    (empty)     450
disk-orphan   storage    (empty)     250
team tag দিয়ে যোগমোট $10,000
checkout       4000
search         2000
data           1500
shared         1800
(empty)         700
Unallocated700 / 10000 = 7.0%
450 vm-old-test   last login 4 months ago
250 disk-orphan   attached to nothing
Shared $1,800ভিত্তি: direct খরচ $7,500
checkout  1800 x 4000/7500 = 960
search    1800 x 2000/7500 = 480
data      1800 x 1500/7500 = 360
                     sum = 1800
Showbackমোট $10,000
team           direct  shared  showback  share
checkout         4000     960      4960  49.6%
search           2000     480      2480  24.8%
data             1500     360      1860  18.6%
(unallocated)     700       0       700   7.0%
  1. কাঁচা বিল। ১১টি লাইন, যোগফল $১০,০০০। দুটি লাইনে team tag নেই। এই অবস্থায় কেউ বলতে পারেন না কোন দল কত খরচ করল।
  2. Tag দিয়ে যোগ। Checkout $৪,০০০, search $২,০০০, data $১,৫০০। সরাসরি দলের নামে এলো মোট $৭,৫০০। বাকি থাকল shared $১,৮০০ আর tag ছাড়া $৭০০।
  3. Unallocated আলাদা করা। $৭০০, অর্থাৎ বিলের ৭%. এটিকে shared-এ মিশিয়ে দেবেন না, তাহলে মালিকহীন খরচ লুকিয়ে যায়। আলাদা লাইনে রেখে বড় থেকে ছোট ক্রমে মালিক খোঁজা হয়। vm-old-test চার মাস কেউ খোলেননি।
  4. Shared ভাগ। NAT, log আর support-এর $১,৮০০ direct খরচের অনুপাতে ভাগ হলো: $৯৬০, $৪৮০ আর $৩৬০। যোগফল আবার $১,৮০০, তাই কোনো টাকা হারায়নি।
  5. Showback. Checkout $৪,৯৬০, search $২,৪৮০, data $১,৮৬০, unallocated $৭০০। যোগফল $১০,০০০, বিলের সাথে হুবহু মিলে গেছে। এই মিল প্রতি মাসে যাচাই করুন, না মিললে দল সংখ্যাটিকেই বিশ্বাস করবে না।

Showback না chargeback?

Showback

Showback মানে শুধু দেখানো: “গত মাসে আপনাদের খরচ এত।” কোনো টাকা নড়ে না। সাব-মিটারের সংখ্যা দেখা, কিন্তু বিল আগের মতোই সবাই মিলে দেওয়া।

শুরুর জন্য নিরাপদ

Chargeback

Chargeback মানে সেই টাকা দলের বাজেট থেকে সত্যিই কাটা। মিটার যার, বিলও তার। তবে তথ্য অসম্পূর্ণ হলে ঝগড়া বাড়ে।

Tag পরিণত হলে

Shared খরচ ভাগের চার উপায়

উপায়কীভাবেকখন
অনুপাতেDirect খরচের অনুপাতে (উপরের হিসাব)সরল, শুরুর জন্য ভালো
সমান ভাগেদলের সংখ্যা দিয়ে ভাগSupport plan-এর মতো খরচে, দল কাছাকাছি মাপের হলে
ব্যবহার মেপেLog-এর GB, NAT-এর GB, অনুরোধের সংখ্যাসবচেয়ে ন্যায্য, তবে মাপার খরচ আছে
আলাদা রাখা“Platform” লাইনে, কারও ঘাড়ে নয়দল যা বদলাতে পারে না, এমন খরচে

নিচের Bash block ওপরের পুরো হিসাবটি করে। CSV থাকে block-এর ভেতরেই। awk-এ ভাগের কাজটি দেখুন, আর শেষের unallocated লাইনটি খেয়াল করুন।

#!/usr/bin/env bash
set -euo pipefail
cat > bill.csv <<'EOF'
resource,service,team,usd
vm-web,compute,checkout,2600
db-orders,database,checkout,1400
vm-search,compute,search,1500
cache-search,cache,search,500
wh-reports,warehouse,data,1100
lake-raw,storage,data,400
nat-main,network,shared,800
logs-all,logging,shared,500
support-plan,support,shared,500
vm-old-test,compute,,450
disk-orphan,storage,,250
EOF
awk -F, 'NR > 1 {
  key = ($3 == "") ? "(unallocated)" : $3
  c[key] += $4; total += $4
}
END {
  direct = c["checkout"] + c["search"] + c["data"]
  printf "%-14s %7s %7s %9s %6s\n", "team", "direct", "shared", "showback", "share"
  n = split("checkout search data", teams, " ")
  for (i = 1; i <= n; i++) {
    t = teams[i]; s = c["shared"] * c[t] / direct
    printf "%-14s %7d %7d %9d %5.1f%%\n", t, c[t], s, c[t] + s, 100 * (c[t] + s) / total
  }
  u = c["(unallocated)"]
  printf "%-14s %7d %7d %9d %5.1f%%\n", "(unallocated)", u, 0, u, 100 * u / total
  printf "%-14s %7d\n", "bill total", total
}' bill.csv
echo "--- unallocated, biggest first:"
awk -F, 'NR > 1 && $3 == "" { print $4, $1 }' bill.csv | sort -rn

আউটপুটে checkout 4000 960 4960 49.6% আর শেষে (unallocated) 700 0 700 7.0%. চারটি showback যোগ করলে $১০,০০০ হয়, যা bill total 10000-এর সমান। নিচের তালিকায় 450 vm-old-test প্রথমে, কারণ sort -rn বড় অঙ্ক আগে আনে। খরচ-ভিত্তিক ক্রমে মালিক খুঁজলে অল্প কাজেই বেশি টাকার হদিস মেলে।

দুটি হিসাবের ফাঁদ: amortization আর FOCUS

ধরুন, জানুয়ারিতে এক বছরের একটি commitment কিনতে একসাথে $১,২০০ দিলেন। বিলে জানুয়ারিতে $১,২০০, বাকি এগারো মাসে শূন্য। এতে দলের খরচের গ্রাফ অর্থহীন হয়ে যায়। Amortized cost সেই টাকাকে ব্যবহারের সময়ে ছড়িয়ে দেয়: মাসে $১০০। অর্থ বিভাগ নগদ হিসাব চান, প্রকৌশলীর দরকার amortized হিসাব। Showback সাধারণত দ্বিতীয়টিতেই করা হয়।

আরেকটি সমস্যা, প্রতিটি provider-এর বিলের column আলাদা। FOCUS (FinOps Open Cost and Usage Specification) হলো বিলের ডেটার একটি উন্মুক্ত নির্দিষ্টকরণ, যা FinOps Foundation-এর আওতায় তৈরি হচ্ছে। ১.০ সংস্করণ এসেছে ২০২৪ সালে, পরে আরও সংস্করণ এসেছে। ভাবনাটি হলো একই নামের column সব provider-এ: যেমন BilledCost আর EffectiveCost, যা ঠিক ওপরের দুই হিসাবের পার্থক্য ধরে। লেখার সময়ে কয়েকটি বড় provider FOCUS-ধাঁচের export দিচ্ছে। Column-এর নাম আর সমর্থন version-ভেদে আলাদা হতে পারে, তাই হালনাগাদ নথি মিলিয়ে নিন।

কাজAWSAzureGoogle Cloud
খরচ দেখাCost ExplorerCost ManagementBilling reports
কাঁচা exportCost and Usage Report / Data ExportsCost Management exportsBilling export to BigQuery
BudgetAWS BudgetsBudgetsCloud Billing budgets
আকারের পরামর্শCompute OptimizerAzure AdvisorRecommender
CommitmentSavings Plans, Reserved InstancesSavings plans, ReservationsCommitted use discounts

নিচের কমান্ডটি শুধু পড়ে, কিছু বদলায় না। তবু কিছু provider-এ cost API-র প্রতিটি ডাকের সামান্য দাম থাকতে পারে। এটি এখানে শুধু উদাহরণ, চালানোর দরকার নেই।

aws ce get-cost-and-usage \
  --time-period Start=2026-09-01,End=2026-10-01 \
  --granularity MONTHLY \
  --metrics UnblendedCost \
  --group-by Type=TAG,Key=team

৪ · Rightsizing — ব্যবহারের তথ্য দেখে আকার ঠিক করা

এখন Optimize phase. খরচ কমানোর দুটি হাতল আছে। Usage optimization মানে কম জিনিস ব্যবহার করা। Rate optimization মানে একই জিনিস কম দরে কেনা। বিল = ব্যবহার × দর, তাই আগে ব্যবহার কমান। নইলে অপচয়ের ওপরই ছাড় কিনে ফেলবেন।

বিয়েবাড়ির ক্যাটারিংয়ে “ভয়ে” ৩০০ জনের বদলে ৫০০ জনের খাবার বলা হয়। কম পড়লে বদনাম, তাই বেশি। Cloud-এ VM-এর আকারও প্রায়ই এভাবেই ঠিক হয়: লঞ্চের দিন ভয়ে বড় আকার, তারপর কেউ আর ফিরে দেখেন না। Rightsizing হলো গত কয়েকটি অনুষ্ঠানে আসলে কতজন খেয়েছেন তা দেখে অর্ডার ঠিক করা, হাতে কিছু বাড়তি রেখে।

গড় utilisation দেখলে চলে না, কারণ গড়ে চূড়া হারিয়ে যায়। তাই p95 দেখা হয়। সূত্রটি সহজ:

প্রয়োজন = বর্তমান ক্ষমতা × p95 ব্যবহার ÷ লক্ষ্য ব্যবহার
8 vCPU × 18% ÷ 60% = 2.4 vCPU

লক্ষ্য ১০০% নয়, কারণ headroom লাগে। এখানে ধরা হলো CPU ৬০% আর memory ৭০%. সংখ্যা দুটি নীতি, নিয়ম নয়। CPU আর memory আলাদা হিসাব করে যে আকারে দুটোই আঁটে, সেটি বেছে নিতে হয়। নিচের simulator ছয়টি service-এ এটি করে। সব আকার ও দাম ধরে নেওয়া, আসল দাম provider-এর pricing পাতায় মিলিয়ে নিন।

// Rightsizing from sample p95 metrics. All sizes and prices are assumed.
const sizes = [
  { name: 'S',  vcpu: 2,  gib: 8,  usd: 60 },
  { name: 'M',  vcpu: 4,  gib: 16, usd: 120 },
  { name: 'L',  vcpu: 8,  gib: 32, usd: 240 },
  { name: 'XL', vcpu: 16, gib: 64, usd: 480 },
];
const CPU_TARGET = 0.60, MEM_TARGET = 0.70, MIN_DAYS = 14;

// service, current size, days of data, p95 CPU %, p95 memory %
const fleet = [
  ['web',        'L',  30, 18, 30],
  ['search-api', 'XL', 30, 20, 30],
  ['report-job', 'L',  30,  9, 62],
  ['cache-a',    'M',  30, 70, 81],
  ['admin-new',  'L',   5, 12, 20],
  ['old-tool',   'M',  30,  1,  6],
];

let net = 0;
console.log('service     now  need vCPU/GiB  to  $/mo  note');
for (const [svc, now, days, cpu, mem] of fleet) {
  const cur = sizes.find(s => s.name === now);
  const needCpu = cur.vcpu * cpu / 100 / CPU_TARGET;
  const needMem = cur.gib * mem / 100 / MEM_TARGET;
  let fit = sizes.find(s => s.vcpu >= needCpu && s.gib >= needMem) ?? cur;
  let note = fit.usd < cur.usd ? 'downsize' : fit.usd > cur.usd ? 'UPSIZE' : 'keep';
  if (days < MIN_DAYS) { fit = cur; note = `wait, only ${days} days of data`; }
  else if (cpu < 3 && mem < 10) note = 'idle? ask owner, maybe delete';
  const change = fit.usd - cur.usd;
  net += change;
  const need = `${needCpu.toFixed(1)}/${needMem.toFixed(1)}`;
  console.log(`${svc.padEnd(11)} ${now.padEnd(4)} ${need.padEnd(14)} ${fit.name.padEnd(3)} ${String(change).padStart(5)}  ${note}`);
}
console.log(`net change: ${net} USD per month`);

ছয়টি লাইন, ছয়টি শিক্ষা। web সহজ: -120 downsize. report-job-এ CPU মাত্র ৯%, তবু keep, কারণ memory-র প্রয়োজন 28.3 GiB, যা M আকারে আঁটে না। শুধু CPU দেখলে এটি ছোট হতো, আর process মরত। cache-a-তে 120 UPSIZE: FinOps মানে সব সময় কমানো নয়, এই service চাপে আছে। admin-new-এ পাঁচ দিনের তথ্য, তাই অপেক্ষা। old-tool ছোট করার আগে প্রশ্ন, এটি আদৌ দরকার তো? শেষ লাইন net change: -300 USD per month.

একটি rightsizing, সাথে rollback পরিকল্পনা

কাগজের হিসাব একটি অনুমান মাত্র। বদলটি production-এ একটি deployment, তাই পর্ব ৫৯-এর শৃঙ্খলা এখানেও লাগে। হাটঘরের search-api-তে ৩টি XL instance, instance-প্রতি $৪৮০। ওপরের হিসাবে L যথেষ্ট, তাই মাসে $৭২০ বাঁচার কথা। আগে থেকে লেখা শর্ত দেখুন, আর ধাপ ৫-এ কী হয় খেয়াল করুন।

প্রমাণ৩০ দিন, একটি sale-এর দিনসহ
size now      3 x XL (16 vCPU, 64 GiB)  $1440/mo
p95 CPU       20%      max CPU    39%
p95 memory    30%      max memory 33%
p95 latency   180 ms   SLO        300 ms
need          5.3 vCPU, 27.4 GiB  ->  L (8, 32)
পরিকল্পনাকাজের আগে লেখা
change      one reviewed IaC pull request
window      weekday 11:00, no sale that week
go on if    p95 latency < 250 ms
            p95 CPU     < 65%
            errors      < 0.1%
rollback    revert the PR, back to XL in 15 min
owner       search on-call
Canary২৪ ঘণ্টা
fleet        1 x L  +  2 x XL
on the L     p95 CPU 41%   memory 61%
p95 latency  186 ms   (limit 250)
errors       0.02%    (limit 0.1%)
verdict      go on
পুরো fleetএকে একে, মাঝে এক ঘণ্টা
fleet        3 x L     $720/mo
p95 CPU      42%
p95 latency  192 ms
verdict      looks fine, keep watching 7 days
Rollbackশুক্রবার রাত ০২:০০
event        weekly full reindex starts
p95 CPU      78%       limit 65%
p95 latency  340 ms    limit 250, SLO 300
action       revert the PR
02:14        back to 3 x XL, latency 190 ms
কারণ ও সমাধানপরের সপ্তাহ
cause        reindex used 12 parallel workers
             39% on XL means 78% on half the CPU
             a few hours a week, so below p95
fix          reindex limited to 6 workers
next try     3 x L, reindex CPU p95 58%
ফলপরের বিল
vm-search     $1500  ->  $780
saved         $720/mo
SLO breach    14 min, inside error budget
new rule      batch jobs listed before any resize
  1. প্রমাণ। ৩০ দিনের তথ্যে p95 CPU ২০%, memory ৩০%. সর্বোচ্চ মান CPU ৩৯%, memory ৩৩%, তবে ওই ৩৯% নিয়ে কেউ ভাবলেন না। প্রয়োজন ৫.৩ vCPU আর ২৭.৪ GiB, তাই L আঁটে। তথ্যে একটি sale-এর দিন আছে কি না সেটিও যাচাই হলো।
  2. পরিকল্পনা। বদলের আগেই লেখা হলো: কখন এগোবেন, কখন ফিরবেন, কে ফেরাবেন। শর্ত আগে না লিখলে ঘটনার সময় মানুষ যুক্তি বানিয়ে নেন। Rollback মানে PR-টি revert করা, ১৫ মিনিটে XL-এ ফেরা।
  3. Canary. তিনটির একটি L করা হলো। সেখানে CPU ৪১%, memory ৬১%, যা হিসাবের ৪০% আর ৬০%-এর কাছে। Latency ১৮৬ ms, সীমা ২৫০। শর্ত মিলেছে, তাই এগোনো হলো। এটি canary release-এর মতোই।
  4. পুরো fleet. বাকি দুটিও একে একে L হলো। বিল এখন $৭২০। Latency ১৯২ ms. সব ঠিক দেখাচ্ছে, তবু সাত দিন নজরে রাখা হলো, কারণ সাপ্তাহিক কাজ এক দিনে ধরা পড়ে না।
  5. Rollback. শুক্রবার রাতে সাপ্তাহিক reindex শুরু হতেই CPU ৭৮%, latency ৩৪০ ms, দুটোই সীমার বাইরে। On-call কোনো আলোচনা ছাড়াই শর্ত মেনে PR revert করলেন। ১৪ মিনিটে ফেরা হলো। পরিকল্পনা আগে থেকে লেখা ছিল বলেই ঘুমচোখেও সিদ্ধান্ত সহজ ছিল।
  6. কারণ। Reindex ১২টি worker চালাচ্ছিল। XL-এ সেই চূড়া ছিল ৩৯%, যা ধাপ ১-এর তথ্যেই ছিল। CPU অর্ধেক হলে ৭৮%. কাজটি সপ্তাহে মাত্র কয়েক ঘণ্টা চলে বলে p95-এ আসেনি। p95 মানে ৫% সময় উপেক্ষা করা, আর সেখানেই লুকিয়ে ছিল কাজটি। Worker ৬টিতে নামানো হলো, আবার চেষ্টায় CPU ৫৮%.
  7. ফল। পরের বিলে vm-search $১,৫০০ থেকে $৭৮০, মাসে $৭২০ সাশ্রয়। ১৪ মিনিটের সমস্যা error budget-এর ভেতরেই ছিল। নতুন নিয়ম: আকার বদলের আগে batch কাজের তালিকা দেখতে হবে। সাশ্রয় হিসাব থেকে নয়, পরের বিল থেকে নিশ্চিত করুন।

Kubernetes: request বনাম আসল ব্যবহার

Kubernetes-এ টাকা যায় node-এর জন্য, আর node ভরে request দিয়ে, আসল ব্যবহার দিয়ে নয় (পর্ব ৪৮). তাই একটি Pod ১ vCPU বুক করে ০.৩ ব্যবহার করলেও scheduler-এর চোখে পুরো ১ vCPU দখল। Request আর ব্যবহারের এই ফাঁককে বলে slack.

২০টি PodPod-প্রতি CPUPod-প্রতি memoryমোট বুকNode (৪ vCPU, ১৬ GiB)
আগের request1000m2Gi২০ vCPU, ৪০ GiB৫টি, $৬০০
আসল ব্যবহার (p95)300m900Mi (সর্বোচ্চ 1100Mi)৬ vCPU, প্রায় ১৭.৬ GiB—
নতুন request500m1300Mi১০ vCPU, প্রায় ২৫.৪ GiB৩টি, $৩৬০

হিসাবটি সরল। সিস্টেমের Pod আর headroom বাদ দেওয়া হয়েছে, আর node-এর দাম ওপরের M আকারের। চারটি জিনিস মনে রাখুন:

  • টাকা বাঁচে node সরলে। Request কমালেই বিল কমে না। Cluster Autoscaler বা Karpenter ফাঁকা node সরালে তবেই কমে।
  • Memory-তে p95 নয়, সর্বোচ্চ মান দেখুন। CPU কম পড়লে ধীর হয়, memory কম পড়লে OOMKilled. তাই এখানে সর্বোচ্চ ১১০০Mi-র ওপর প্রায় ২০% যোগ করা হয়েছে।
  • HPA-র হিসাব বদলে যায়। HPA-র CPU লক্ষ্য request-এর শতাংশে। লক্ষ্য ৭০% থাকলে আগে সীমা ছিল ৭০০m, request ৫০০m করলে তা ৩৫০m. অর্থাৎ Pod সংখ্যা আগের চেয়ে তাড়াতাড়ি বাড়বে, আর সাশ্রয় উবে যেতে পারে। লক্ষ্যও একসাথে নতুন করে ঠিক করুন।
  • Pod-এর খরচ ভাগ। বিলে Pod থাকে না, থাকে node. OpenCost-এর মতো tool Pod-কে সাধারণত request আর ব্যবহারের যেটি বড়, সেই অনুযায়ী খরচ ধরে, আর খালি node-এর অংশ আলাদা “idle” লাইনে দেখায়।

VPA-কে শুধু পরামর্শের জন্য চালানো যায়। updateMode: "Off" মানে সে Pod ছোঁবে না, শুধু status-এ সুপারিশ লিখবে। VPA আলাদা component, তাই আগে cluster-এ আছে কি না দেখে নিন।

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: search-api-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: search-api
  updatePolicy:
    updateMode: "Off"

৫ · অপচয় বন্ধ: off-hours, idle resource আর storage lifecycle

Off-hours সূচি

রাতে অফিস বন্ধ হলে কেউ বাতি জ্বালিয়ে রাখেন না। অথচ dev আর test environment প্রায়ই সারা সপ্তাহ চালু থাকে। সপ্তাহে ১৬৮ ঘণ্টা। রবি থেকে বৃহস্পতিবার সকাল ৯টা থেকে রাত ৯টা চালু রাখলে ঘণ্টা হয় ১২ × ৫ = ৬০, অর্থাৎ ৩৫.৭%. এটি হলো off-hours schedule. বন্ধ VM-এ compute-এর বিল থামে, তবে disk-এর বিল চলতে থাকে। হিসাবে এটি বাদ দিলে সাশ্রয় বেশি দেখাবে।

// Off-hours schedule savings. Prices are assumed; month = 720 hours.
const VMS = 10, USD_PER_VM_HOUR = 0.10;
const DISK_GB = 500, USD_PER_GB_MONTH = 0.08;  // disks bill even when stopped
const MONTH_H = 720, WEEK_H = 168;

const disk = DISK_GB * USD_PER_GB_MONTH;
const fullCompute = VMS * USD_PER_VM_HOUR * MONTH_H;
const before = fullCompute + disk;

const schedules = [
  ['always on',        24 * 7],
  ['Sun-Thu 09-21',    12 * 5],
  ['Sun-Thu 09-18',     9 * 5],
  ['Sun-Thu 09-21+Sat', 12 * 5 + 6],
];

console.log('schedule           h/week  on%    compute  disk  total  saved');
for (const [name, weekHours] of schedules) {
  const share = weekHours / WEEK_H;
  const compute = fullCompute * share;
  const total = compute + disk;
  const saved = before - total;
  console.log(name.padEnd(18), String(weekHours).padStart(6),
    (share * 100).toFixed(1).padStart(5), compute.toFixed(2).padStart(9),
    disk.toFixed(0).padStart(5), total.toFixed(2).padStart(7), saved.toFixed(2).padStart(7));
}

// Same 12x5 schedule, but 4 of the 10 VMs are under a commitment:
// a commitment is paid for every hour, running or not.
const COMMITTED = 4;
const free = VMS - COMMITTED;
const savedFree = free * USD_PER_VM_HOUR * MONTH_H * (1 - 60 / WEEK_H);
console.log(`12x5 with ${COMMITTED} committed VMs: saved ${savedFree.toFixed(2)}`);

$৭২০ compute × ৬০/১৬৮ = $২৫৭.১৪। Disk-এর $৪০ যোগ করে নতুন মোট 297.14, আর saved 462.86, মোট বিলের ৬০.৯%. শেষ লাইনটি ফাঁদ দেখায়: ৪টি VM commitment-এর আওতায় থাকলে সেগুলো বন্ধ করে টাকা বাঁচে না, তাই সাশ্রয় নামে 277.71-এ। Dev environment সাধারণত commitment-এর বাইরে রাখাই ভালো।

বাস্তবে সূচি চলে পর্ব ১০-এর মতো script বা provider-এর scheduler দিয়ে, tag দেখে: schedule=office-hours. দুটি জিনিস রাখুন: একটি “আজ রাতে চালু রাখুন” ব্যবস্থা, আর সকালে ধাপে ধাপে চালু করা। Production-এ এটি নয়, সেখানে আছে scheduled scaling. কিছু managed database কয়েক দিন পর নিজে থেকে আবার চালু হতে পারে, তাই provider-এর নিয়ম দেখে নিন।

Idle resource মোছা

Idle resource বিলে আসে, কিন্তু কোনো কাজে লাগে না। সাধারণ তালিকা: কোনো VM-এ না লাগানো disk, পুরোনো snapshot, target-হীন load balancer, ব্যবহার না হওয়া public IP, ফেলে রাখা test database, আর orphaned resource. নিরাপদ পথটি এমন:

  1. তালিকা তৈরি আর tag দেখে মালিক খোঁজা।
  2. মালিককে জানিয়ে নির্দিষ্ট তারিখ দেওয়া।
  3. বন্ধ করা বা সরানো, মোছা নয়। Disk-এর একটি শেষ snapshot রাখা।
  4. ৩০ দিন অপেক্ষা। কেউ খোঁজ না করলে মোছা।

“বছরে একবার চলে” এমন একটি কাজ ৩০ দিনের metric-এ idle-ই দেখায়। তাই শুধু metric দেখে মোছা বিপজ্জনক। নতুন test resource-এ expires-on tag লাগানো আরও ভালো উপায়, তাতে মোছার দায় শুরুতেই ঠিক হয়।

Storage lifecycle: একটি হিসাব

হাটঘরের log জমে দিনে ১০০ GB, রাখতে হয় ৩৬৫ দিন। স্থির অবস্থায় মোট ৩৬,৫০০ GB. ধরে নিই দর প্রতি GB-মাসে hot $০.০২, cool $০.০১ আর archive $০.০০২। পর্ব ২১-এর lifecycle rule বসালে:

বয়সStorage classGBমাসিক খরচ
০–৩০ দিনHot৩,০০০$৬০
৩১–৯০ দিনCool৬,০০০$৬০
৯১–৩৬৫ দিনArchive২৭,৫০০$৫৫
মোট৩৬,৫০০$১৭৫

সব hot রাখলে ৩৬,৫০০ × $০.০২ = $৭৩০। তাই সাশ্রয় $৫৫৫, প্রায় ৭৬%. তবে ঠান্ডা ধাপে পড়ার ফি, ন্যূনতম রাখার সময়, আর object-প্রতি সরানোর ফি থাকতে পারে। লক্ষ লক্ষ ছোট ফাইলে এই ফি লাভ খেয়ে ফেলতে পারে। আর ৩৬৫ দিনের পরে মোছার নিয়মটিও থাকা চাই। সবচেয়ে সস্তা ডেটা সেটিই, যা রাখা হয়নি। পর্ব ৬৪-এ log-এর খরচ কমানোর আরও উপায় দেখেছেন।

৬ · Commitment coverage — কতটা অঙ্গীকার করবেন

Commitment discount কী, তা পর্ব ৭২ (Cloud-এর বিল)-এর বিষয়। এখানে প্রশ্ন শুধু কৌশলের: কতটা কিনবেন? দুটি মাপ গুলিয়ে ফেলবেন না। Coverage মানে মোট ব্যবহারের কত ভাগ ছাড়ের আওতায়। Commitment utilisation মানে কেনা অঙ্গীকারের কত ভাগ সত্যিই কাজে লাগল।

মেসে মাসিক চুক্তিতে রিকশা ঠিক করলে প্রতিদিনের ভাড়া কম, তবে না গেলেও টাকা দিতে হয়। যে কয়দিন নিশ্চিত যাবেন, সেটুকুই চুক্তিতে রাখুন, বাকিটা রাস্তায় রিকশা ডাকুন।

ধরি, on-demand দরে দিনে ১৬ ঘণ্টা $১০০/ঘণ্টা আর ৮ ঘণ্টা $৬০/ঘণ্টা ব্যবহার হয়। ছাড় ৩০% (ধরে নেওয়া)। Commitment-এর দাম প্রতি ঘণ্টায় দিতেই হবে, ব্যবহার হোক বা না হোক।

অঙ্গীকার (on-demand মূল্যে)Commitment ফি/দিনবাড়তি on-demandমোট/দিনCoverageUtilisation
নেই$০$২,০৮০$২,০৮০০%—
$৬০/ঘণ্টা$১,০০৮$৬৪০$১,৬৪৮৬৯.২%১০০%
$৮০/ঘণ্টা$১,৩৪৪$৩২০$১,৬৬৪৮৪.৬%৯১.৭%
$১০০/ঘণ্টা$১,৬৮০$০$১,৬৮০১০০%৮৬.৭%

সবচেয়ে সস্তা ৬৯% coverage, ১০০% নয়। কারণটি একটি সুন্দর নিয়ম। অঙ্গীকারের প্রতিটি বাড়তি ডলারে আপনি সব সময় $০.৭০ দেন, আর লাভ হয় শুধু যে ঘণ্টায় সেটি ব্যবহার হয়, ঘণ্টায় $১ করে। তাই বাড়তি অংশটি লাভজনক তখনই, যখন সেটি মোট সময়ের অন্তত (১ − ছাড়) ভাগ ব্যবহার হয়।

বাড়তি অঙ্গীকার লাভজনক যদি ব্যবহারের ভাগ ≥ ১ − ছাড়
16/24 = 66.7% < 70%, তাই $৬০-এর ওপরে আর নয়

এখানে ওপরের স্তরটি ৬৬.৭% সময় চলে, যা ৭০%-এর কম। তাই সেটি কেনা লোকসান, যদিও অল্প। আরও ক’টি কৌশল:

  • আগে ছোট করুন। Rightsizing আর সূচি শেষ করে যে স্থির ভিত্তি থাকে, তার ওপর কিনুন।
  • সিঁড়ির মতো কিনুন। সবটা একদিনে না কিনে প্রতি মাসে অল্প অল্প। তাহলে মেয়াদও একসাথে ফুরোয় না, সিদ্ধান্ত বদলের সুযোগ থাকে।
  • নমনীয়টি আগে। নির্দিষ্ট VM-ধরনে বাঁধা ছাড়ের চেয়ে মোট খরচে বাঁধা ছাড় কম, তবে আকার বদলালেও কাজে লাগে। Provider-ভেদে নাম ও শর্ত আলাদা।
  • ভবিষ্যৎ দেখুন। বড় migration বা architecture বদল আসছে কি না জেনে নিন, নইলে এক বছরের অঙ্গীকার পড়ে থাকবে।

৭ · Budget, forecast আর cost anomaly

মাস শেষে বিল দেখা মানে মাস শেষে ব্যাংক হিসাব দেখা। তখন আর কিছু করার থাকে না। তাই দরকার আগাম সংকেত।

Budget alert সীমা ছাড়ালে জানায়, তবে সাধারণত খরচ থামায় না (পর্ব ০৬). শুধু আসল খরচে নয়, পূর্বাভাসের ওপরও alert রাখুন। Run rate সবচেয়ে সরল পূর্বাভাস। মাসের ১২ দিনে $৪,৩২০ খরচ হলে দিনে $৩৬০, আর ৩০ দিনে $১০,৮০০। Budget $১০,০০০ হলে ১২ তারিখেই জানা গেল, প্রায় ৮% ছাড়াবে। তবে মনে রাখবেন, বিলের তথ্য কয়েক ঘণ্টা থেকে এক-দুই দিন দেরিতে আসতে পারে, আর সপ্তাহের শেষে ব্যবহার কম হলে সরল গড় ভুল বলবে।

Budget মাসের মোট দেখে। Anomaly detection দেখে “আজকের খরচ আজকের মতো কি না”। Cloud খরচে seasonality আছে: হাটঘরে শুক্র-শনিবার খরচ কম। তাই একটি স্থির সীমা দুই দিকেই ভুল করে। নিচের simulator ৩৫ দিনের একটি seeded series নেয়, প্রতিটি দিনকে আগের তিন সপ্তাহের একই বারের median-এর সাথে মেলায়, আর স্থির $৪৮০ সীমার সাথে তুলনা করে।

// Cost anomaly detector on a seeded daily series. Day 1 is a Sunday.
function mulberry32(a) {
  return () => {
    a = (a + 0x6D2B79F5) | 0;
    let t = Math.imul(a ^ (a >>> 15), 1 | a);
    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}
const rnd = mulberry32(73);
const cost = [null];                         // cost[d] = USD on day d
for (let d = 1; d <= 35; d++) {
  const weekend = d % 7 === 6 || d % 7 === 0;  // Friday, Saturday
  let usd = (weekend ? 250 : 400) * (0.97 + 0.06 * rnd());
  if (d === 25) usd += 100;                  // planned sale day
  if (d >= 28 && d <= 29) usd += 120;        // leak starts on a Saturday
  cost.push(Math.round(usd));
}

const median = a => [...a].sort((x, y) => x - y)[Math.floor(a.length / 2)];
const known = { 25: 'planned sale' };
const FIXED_LIMIT = 480;

console.log('day  actual  expected  excess  seasonal      fixed-limit');
for (let d = 22; d <= 35; d++) {
  const expected = median([cost[d - 7], cost[d - 14], cost[d - 21]]);
  const excess = cost[d] - expected;
  const seasonal = excess > Math.max(0.15 * expected, 20);
  const fixed = cost[d] > FIXED_LIMIT;
  if (!seasonal && !fixed) continue;
  const flag = !seasonal ? '-' : known[d] ? `known: ${known[d]}` : 'ALERT';
  console.log(String(d).padStart(3), String(cost[d]).padStart(7), String(expected).padStart(9),
    String(excess).padStart(7), ' ' + flag.padEnd(13), fixed ? 'ALERT' : '-');
}
console.log('days checked: 22..35');

দিন ২৮ শনিবার: 376, প্রত্যাশা 249, বাড়তি 127. স্থির সীমা চুপ, কারণ ৩৭৬ < ৪৮০, অথচ seasonal নিয়ম ALERT দিল। দিন ২৫-এ উল্টো: স্থির সীমা বাজল, কিন্তু সেদিন পরিকল্পিত sale ছিল, তাই known: planned sale. জানা ঘটনার তালিকা ভুল alert কমায়। দিন ২৯-এ 521-এ স্থির সীমা অবশেষে বাজল, এক দিন দেরিতে। Median নেওয়া হয়েছে, কারণ আগের একটি অদ্ভুত দিন median-কে বেশি নড়াতে পারে না। সীমায় $২০ রাখা হয়েছে, যাতে ছোট অঙ্কের শতাংশে alert না বাজে।

Provider-দের নিজস্ব anomaly সুবিধাও আছে। সেগুলো চালু রাখুন, তবে alert যেন বিলের মালিক দলের কাছে যায়। এবার সেই শনিবারের সংকেতটি অনুসরণ করা যাক।

  1. Alertদিন ২৮
  2. Serviceকোনটি বাড়ল
  3. Resourceকে পাঠাল
  4. সমাধানদিন ২৯
  5. শিক্ষাপর্যালোচনা
Alertদিন ২৮, শনিবার
actual    376
expected  249
excess    127  (limit: 15% of 249 = 37.35)
Service ধরে তুলনাপ্রত্যাশা বনাম আজ
service         expected  actual  change
compute              120     122      +2
database              60      60       0
data transfer         34     158    +124
other                 35      36      +1
total                249     376    +127
Resource আর উৎসFlow log দেখে
resource   nat-main (processed bytes)
extra      $124 at $0.05/GB = about 2.5 TB
source     job wh-sync, team=data
target     object storage, same region
started    Friday night, new release
সমাধানদিন ২৯
day 29   actual 521, expected 399, excess 122
fix      private endpoint for object storage
day 30   data transfer back to normal
total    127 + 122 = $249 extra
শিক্ষাদোষ নয়, ব্যবস্থা
if missed   about $120 a day x 30 = $3600
owner       alert now goes to team data
guard       cost check in design review
template    new VPCs get the endpoint by default
  1. Alert. শনিবারের খরচ $৩৭৬, প্রত্যাশা $২৪৯। বাড়তি $১২৭, সীমা $৩৭.৩৫ ছাড়িয়ে গেছে। অঙ্কটি ছোট, এটি স্থির সীমায় ধরা পড়েনি। বিল এখনো ছোট, তাই এখনই খোঁজার সেরা সময়।
  2. Service ধরে ভাগ। Compute +$২, database ০, অন্যান্য +$১। Data transfer $৩৪ থেকে $১৫৮, অর্থাৎ +$১২৪। মোট বাড়তির প্রায় পুরোটাই এখানে। প্রথম ভাগেই খোঁজার জায়গা অনেক ছোট হয়ে গেল।
  3. Resource আর দল। বাড়তি অংশ nat-main-এর processed bytes. পর্ব ৭২-এর ধরে নেওয়া $০.০৫/GB দরে $১২৪ মানে প্রায় ২.৫ TB. পর্ব ২৬-এর NAT gateway ভেতর দিয়ে একই region-এর object storage-এ ডেটা যাচ্ছে। Flow log দেখাল, উৎস শুক্রবার রাতের নতুন release-এর wh-sync কাজ।
  4. সমাধান। দিন ২৯-এ রবিবার, বাড়তি $১২২। পর্ব ২৮-এর private endpoint বসানো হলো, যাতে ডেটা NAT দিয়ে না যায়। দিন ৩০ থেকে স্বাভাবিক। দুই দিনে মোট বাড়তি $১২৭ + $১২২ = $২৪৯।
  5. শিক্ষা। ধরা না পড়লে মাসে প্রায় $৩,৬০০, বিলের এক-তৃতীয়াংশের বেশি। কাউকে দোষ নয়, ব্যবস্থা বদল: alert এখন সরাসরি data দলে যায়, নকশা পর্যালোচনায় খরচের প্রশ্ন যোগ হলো, আর নতুন VPC-র template-এ endpoint থাকবে। এটি পর্ব ৬৭-এর postmortem-এরই ছোট রূপ।

৮ · Unit economics — খরচকে ব্যবসার ভাষায় আনা

“বিল বেড়েছে” কথাটি একা অর্থহীন। ৫০% বেশি অর্ডার সামলাতে ২০% বেশি বিল হলে সেটি সাফল্য। Unit economics খরচকে ব্যবসার একটি এককে ভাগ করে: unit cost = মোট খরচ ÷ ব্যবসার একক। একক হতে পারে অর্ডার, active user, API call, বা শিক্ষার্থী। যে একক ব্যবসা নিজে গোনে, সেটিই ভালো।

মাসবিলঅর্ডারখরচ/অর্ডার
আগস্ট$১০,০০০২,০০,০০০$০.০৫০
সেপ্টেম্বর$১২,০০০৩,০০,০০০$০.০৪০
অক্টোবর$১২,৫০০২,৫০,০০০$০.০৫০

সেপ্টেম্বরে বিল ২০% বেড়েছে, তবু খরচ/অর্ডার কমেছে ২০%. ভালো মাস। অক্টোবরে বিল বেড়েছে মাত্র ৪%, অথচ অর্ডার কমেছে, খরচ/অর্ডার ২৫% বেড়েছে। শুধু বিল দেখলে অক্টোবরকে শান্ত মাস মনে হতো। আগস্টে active user ৮০,০০০ হলে খরচ/user $০.১২৫।

গড়ের ভেতরে স্থির আর পরিবর্তনশীল খরচ মিশে থাকে। আগস্ট ও সেপ্টেম্বর ধরে একটি মোটা সরলরেখা টানা যায়: ১,০০,০০০ অর্ডার বাড়লে বিল $২,০০০ বাড়ে, তাই পরবর্তী এক অর্ডারের খরচ, বা marginal cost, $০.০২। বাকি স্থির অংশ $৬,০০০। মাত্র দুই মাসের তথ্য, তাই এটি মোটা অনুমান। এই সূত্রে অক্টোবরের প্রত্যাশা $৬,০০০ + ২,৫০,০০০ × $০.০২ = $১১,০০০। আসল বিল $১২,৫০০। অর্থাৎ $১,৫০০-এর ব্যাখ্যা দরকার।

খরচ যখন architecture-এর একটি metric

Latency আর availability-র মতো খরচও নকশার একটি শর্ত। Amazon-এর CTO Werner Vogels ২০২৩ সালে “The Frugal Architect”-এ প্রথম নিয়মই বলেন: খরচকে non-functional requirement বানান। কাজের কথায় এর অর্থ:

  • নকশা পর্যালোচনায় একটি প্রশ্ন: “১০ গুণ traffic-এ এই নকশার খরচ/অর্ডার কত হবে?”
  • PR-এ খরচ: Infracost-এর মতো tool Terraform diff-এর আনুমানিক খরচ দেখাতে পারে।
  • লুকানো খরচ: Zone পেরোনো chatty call, NAT দিয়ে ডেটা, উচ্চ cardinality-র metric, অসীম log. কোনোটিই diagram-এ দেখা যায় না, সবই বিলে দেখা যায়।
  • মাপ: প্রতিটি service-এর dashboard-এ SLO-র পাশে খরচ/অনুরোধ।

Cloud-এ সুন্দর নকশা আর সস্তা নকশা সব সময় এক নয়। নকশার পরের ধাপ পর্ব ৭৪ (Well-Architected)-এ দেখবেন, যেখানে খরচ একটি পুরো স্তম্ভ।

৯ · মাসিক FinOps review আর সাধারণ ফাঁদ

এককালীন পরিষ্কারে বিল এক মাস কমে, তারপর ফিরে আসে। অভ্যাসের জন্য দরকার নিয়মিত সময়। হাটঘর প্রতি মাসের ৫ তারিখে ৪৫ মিনিট বসে, যখন আগের মাসের তথ্য স্থির হয়েছে। থাকেন প্রতিটি দলের একজন প্রকৌশলী, অর্থ বিভাগের একজন, পণ্য ব্যবস্থাপক আর FinOps-এর দায়িত্বে থাকা মানুষটি।

মিনিটবিষয়অক্টোবরের উদাহরণ
৫বিল বনাম budget ও forecast$১২,৫০০, প্রত্যাশা $১১,০০০
৫Unit cost-এর ধারা$০.০৪ থেকে $০.০৫, কেন?
১৫সবচেয়ে বেশি বদলানো ৩–৫টি লাইনwh-reports +$৯০০, ভুলে চালু staging +$৩৫১, NAT spike +$২৪৯
৫Unallocated আর tag coverage৭% থেকে ৩%, লক্ষ্য < ৫%
৫Commitment coverage ও utilisationCoverage ৬৮%, utilisation ৯৯%
১০কাজের তালিকা: মালিক, তারিখ, অনুমিত সাশ্রয়Data দল: warehouse query-তে partition filter, ১৫ তারিখের মধ্যে

তিনটি লাইনের যোগ $৯০০ + $৩৫১ + $২৪৯ = $১,৫০০, অর্থাৎ অক্টোবরের ব্যাখ্যাহীন অংশ পুরোপুরি ব্যাখ্যা হলো। সভার শেষ প্রশ্নটি হলো, আগের মাসের কাজগুলো কি বিলে সত্যিই দেখা গেল? দোষারোপ নয়, যে কারণে পর্ব ৬৭-এর postmortem-ও blameless.

তিনটি বড় ফাঁদ

পয়সা গোনা: মাসে $৩০ বাঁচাতে একজন প্রকৌশলীর দুই দিন গেলে, আর তাঁর সময়ের দাম $৩০০ হলে, শোধ হতে ১০ মাস। এদিকে বড় তিনটি লাইন অছোঁয়া। সাধারণত বিলের বড় অংশ অল্প কয়েকটি লাইনে থাকে, তাই বড় থেকে শুরু করুন।

নির্ভরযোগ্যতা ভাঙা: Standby মুছে, replica কমিয়ে, multi-zone তুলে বিল কমে, যতক্ষণ না একটি outage মাসের সাশ্রয়ের দশ গুণ খেয়ে ফেলে। প্রতিটি বদলের পাশে লিখুন, SLO-র কী হবে। PodDisruptionBudget বা headroom “অপচয়” নয়, বিমা।

এককালীন পরিষ্কার: “Cost-cutting sprint” ভালো লাগে, তবে যে অভ্যাস থেকে অপচয় এসেছিল তা থেকে যায়। সমাধান: tag-এর নিয়ম, default ছোট আকার, মেয়াদের tag, আর এই মাসিক সভা।

আরও গভীরে: Google-এর “Autopilot: workload autoscaling at Google” paper (EuroSys ২০২০) দেখায়, মানুষের দেওয়া সীমার চেয়ে ব্যবহারের ইতিহাস থেকে স্বয়ংক্রিয়ভাবে ঠিক করা সীমায় slack অনেক কমে, আর memory-র কারণে কাজ মরাও কমে। FinOps-এর একটি পরিচিত সার্বিক মাপ effective savings rate: ছাড় ও commitment মিলিয়ে on-demand মূল্যের তুলনায় আসলে কত ভাগ বাঁচল। শুধু coverage ভালো দেখালেও এই মাপ খারাপ হতে পারে। সংজ্ঞার খুঁটিনাটি প্রতিষ্ঠানভেদে আলাদা।

পরীক্ষা ও ইন্টারভিউতে:

  • FinOps-এর তিন phase? Inform, Optimize, Operate, যা একটি চলমান লুপ।
  • Showback আর chargeback? Showback শুধু দেখায়, chargeback দলের বাজেট থেকে কাটে।
  • Commitment কেনার আগে কী? Rightsizing ও অপচয় বন্ধ, কারণ আগে ব্যবহার, পরে দর।
  • Coverage ১০০% কেন ভালো নয়? বাড়তি অংশ সময়ের (১ − ছাড়) ভাগের কম চললে লোকসান।
  • বিল বাড়া কি সব সময় খারাপ? না, unit cost কমলে সেটি বৃদ্ধির স্বাভাবিক দাম।

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

AI একটি billing export-এর সারাংশ করতে পারে, আর সন্দেহজনক লাইন খুঁজে দিতে পারে। কিন্তু সে জানে না কোন “idle” VM বছরে একবার চলে, বা কোন replica কেন আছে। সে সাধারণত খরচই ভাবে না, আর ভাবলে এমন কিছু মুছতে বলে যা মোছা উচিত নয়।

AI-এর ভুলঝুঁকিযাচাই
পুরোনো বা বানানো দাম বলেভুল সিদ্ধান্তProvider-এর pricing পাতা
শুধু CPU দেখে ছোট করতে বলেMemory ফুরিয়ে OOMp95 ও সর্বোচ্চ memory, batch কাজ
“Idle” দেখে delete কমান্ড দেয়ডেটা হারানোমালিক, snapshot, --dry-run
১০০% coverage বা তিন বছর সুপারিশ করেঅব্যবহৃত অঙ্গীকার(১ − ছাড়) নিয়ম, ব্যবহারের ইতিহাস
NAT, cross-zone data transfer ভুলে যায়লুকানো খরচBudget alert, প্রথম সপ্তাহের বিল
Script-এ * অনুমতি বা বানানো flag দেয়নিরাপত্তা ও ভুল কাজRead-only role, provider-এর অফিসিয়াল নথি

আসল বিল বা account id AI-কে দেবেন না। নাম ঢেকে, সংখ্যা রেখে জিজ্ঞেস করুন, আর সিদ্ধান্ত নয়, প্রশ্নের তালিকা চান:

তুমি একজন FinOps পর্যালোচক। নিচে একটি নাম-ঢাকা সারণি আছে: service, instance আকার, ৩০ দিনের p95 ও সর্বোচ্চ CPU, p95 ও সর্বোচ্চ memory, মাসিক খরচ, batch কাজের তালিকা। [সারণি পেস্ট করব, আসল নাম বা account id থাকবে না] ১. কোন service ছোট করার যোগ্য, আর কোনটি নয়? প্রতিটির হিসাব দেখাও (লক্ষ্য CPU ৬০%, memory ৭০%). ২. কোন তথ্য না থাকলে তুমি সুপারিশ করতে পারবে না, তা বলো। ৩. প্রতিটি বদলের জন্য rollback-এর শর্ত লেখো: কোন metric, কোন সীমা। ৪. কোনো delete কমান্ড দিও না। দাম নিজে থেকে ধরে নিও না, আমি যা দিয়েছি তাই ব্যবহার করো।

AI-এর FinOps পরামর্শ হাতে পেলে — চেকলিস্ট

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

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

প্র ০১Cloud বিল খুব বড় হলে কি cloud ছেড়ে নিজের server-এ ফিরে যাওয়াই ভালো? “Repatriation” বিতর্ক থেকে FinOps কী শেখে?

২০২১ সালে Andreessen Horowitz-এর Sarah Wang ও Martin Casado “The Cost of Cloud, a Trillion Dollar Paradox” প্রবন্ধে যুক্তি দেন: শুরুতে cloud গতি দেয়, কিন্তু বড় হওয়ার পর একই cloud বিল প্রতিষ্ঠানের মুনাফার ওপর ভারী চাপ হয়ে যেতে পারে। তাঁদের হিসাব একটি অনুমান, এবং তা নিয়ে তর্ক আছে। পরে 37signals-এর মতো কিছু প্রতিষ্ঠান প্রকাশ্যে জানায়, তারা নিজেদের কেনা server-এ ফিরছে, আর তাদের দাবি অনুযায়ী খরচ কমেছে। এই দাবিগুলো তাদের নিজের হিসাব, স্বাধীনভাবে যাচাই করা নয়।

এই বিতর্ক সাদা-কালো নয়। পর্ব ০৩ আর পর্ব ০৪-এর হিসাব মনে করুন। স্থির, অনুমানযোগ্য চাপ বড় হলে নিজের যন্ত্র সস্তা হতে পারে। ওঠানামা করা চাপ, ছোট দল, আর অনেক managed service-এ cloud-এর সুবিধা বেশি। নিজের server-এর হিসাবে বিদ্যুৎ, জায়গা, মানুষ, spare, আর নতুন কিছু দ্রুত চেষ্টা করতে না পারার দামও ধরতে হয়।

FinOps-এর দৃষ্টিতে প্রশ্নটি “cloud না নিজের server” নয়, প্রশ্ন হলো “আমাদের unit cost কত, আর তার কত অংশ স্থির?” অনেক সময় যে অপচয় দেখে মানুষ cloud ছাড়তে চান, তা cloud-এর দাম নয়, ব্যবহারের অভ্যাস। আগে Inform আর Optimize না করলে তুলনাটিই ভুল হয়, কারণ আপনি অপচয়ভরা cloud-কে সুসজ্জিত ভবিষ্যৎ data centre-এর সাথে মেলাচ্ছেন।

মূল উপলব্ধি: বড় সিদ্ধান্তের আগে নিজের বিল পরিষ্কার করুন। পরিষ্কার বিল ছাড়া cloud ছাড়ার বা থাকার কোনো হিসাবই বিশ্বাসযোগ্য নয়।

প্র ০২Chargeback তো সবচেয়ে কড়া জবাবদিহি। তাহলে শুরুতেই তা চালু করলে সমস্যা কোথায়?

Chargeback শুনতে ন্যায্য: যে খরচ করে, সে দেবে। কিন্তু একটি মাপে টাকা জুড়ে দিলে মানুষ মাপটিকে সামলাতে শুরু করে, আসল লক্ষ্যকে নয়। অর্থনীতিবিদ Charles Goodhart-এর নামে পরিচিত কথাটি হলো, কোনো মাপ লক্ষ্য হয়ে গেলে সেটি আর ভালো মাপ থাকে না।

অপরিণত tag-এর ওপর chargeback চালু করলে কয়েকটি ঘটনা প্রায় অনুমান করা যায়। দলগুলো প্রকৌশলের বদলে হিসাব নিয়ে তর্ক করে। Shared খরচ কার ঘাড়ে যাবে, সেই ঝগড়ায় সভা শেষ হয়। কেউ কেউ কাজটি অন্য দলের account-এ সরিয়ে দেন, বা tag মুছে দেন। কেউ observability আর backup-এ খরচ কমান, কারণ সেটির সুফল তখনই দেখা যায় না। Platform দল ব্যবহার বাড়াতে চাইলেও সেবার “দাম” দেখে দলগুলো নিজের নিজের সমাধান বানাতে পারে।

আরেকটি সমস্যা ন্যায্যতার। একটি দলের হাতে যদি খরচের চাবিকাঠি না থাকে, যেমন সবার জন্য ব্যবহৃত warehouse, তাহলে টাকা কাটলেও আচরণ বদলায় না। শুধু অসন্তোষ বাড়ে। মেসের উদাহরণে, সাব-মিটার না থাকা বারান্দার বাতির টাকা একজনের ঘাড়ে দিলে তিনি রাগ করবেন, বাতি বন্ধ হবে না।

তাই প্রচলিত পথ ধাপে ধাপে। আগে showback, কয়েক মাস ধরে দলগুলো সংখ্যায় বিশ্বাস করতে শিখুক। Tag coverage উঁচু হোক, shared ভাগের নিয়ম লেখা ও স্বীকৃত হোক। তারপর দরকার হলে chargeback, শুধু দল যা নিয়ন্ত্রণ করে সেই খরচে। অনেক প্রতিষ্ঠান showback-এই থেকে যায়, আর তাতেই বেশিরভাগ লাভ পায়, কারণ বেশিরভাগ প্রকৌশলী সংখ্যা দেখলেই ঠিক করতে চান।

মূল উপলব্ধি: জবাবদিহি আসে বিশ্বাসযোগ্য তথ্য আর নিয়ন্ত্রণের ক্ষমতা থেকে, শাস্তি থেকে নয়।

প্র ০৩প্রকৌশলীরা কেন প্রয়োজনের চেয়ে বড় request আর VM বেছে নেন? এটি কি শুধু অসাবধানতা?

না, এটি বেশিরভাগ ক্ষেত্রে যুক্তিসঙ্গত আচরণ, আর সেটাই আসল সমস্যা। Service ধীর হলে বা রাত ৩টায় OOMKilled হলে ঝড় পড়ে একজন প্রকৌশলীর ওপর। অতিরিক্ত ৪ GiB memory-র খরচ চলে যায় একটি বড় বিলে, যা তিনি দেখেন না। ঝুঁকি তাঁর, টাকা অন্য কারও। এই অসমতা থাকলে মানুষ বাড়িয়েই লিখবেন।

তথ্যের অভাবও আছে। নতুন service-এর চাপ কেউ জানেন না, তাই একটি অনুমান দিয়ে শুরু হয়। অনুমানটি একবার কাজ করলে আর কেউ ফেরেন না। Google-এর Borg paper (Verma ও সহকর্মীরা, EuroSys ২০১৫) জানায়, ব্যবহারকারীরা প্রায়ই বেশি resource চান, তাই Borg খালি অংশে কম গুরুত্বের কাজ চালাত। পরে Autopilot paper (EuroSys ২০২০) দেখায়, স্বয়ংক্রিয়ভাবে সীমা ঠিক করলে Google-এর কাজে slack উল্লেখযোগ্যভাবে কমে।

তাহলে সমাধান মানুষকে বকা দেওয়া নয়। ব্যবস্থা বদলাতে হবে যেন নিরাপদ পথটিই সহজ পথ হয়। প্রথমত, প্রকৌশলীর dashboard-এ request-এর পাশে আসল ব্যবহার আর খরচ রাখুন। দ্বিতীয়ত, VPA-র পরামর্শ বা অনুরূপ tool দিয়ে PR বানিয়ে দিন, যাতে কাজটি এক ক্লিকের হয়। তৃতীয়ত, rollback সহজ করুন, যাতে ছোট করার ভয় কমে। চতুর্থত, HPA-র মতো ব্যবস্থায় চাপ বাড়লে নিজে থেকে বাড়ার পথ রাখুন, তাহলে একটি Pod-কে আর সবচেয়ে খারাপ দিনের জন্য সাজাতে হয় না। আর নেতৃত্বকে বলতে হবে, ছোট করার চেষ্টায় একটি সীমার ভেতরের ভুল অপরাধ নয়।

মূল উপলব্ধি: অপচয় অনেক সময় ব্যক্তির দোষ নয়, ব্যবস্থার ঝুঁকি-বণ্টনের ফল। ঝুঁকি আর খরচ একই চোখের সামনে আনলেই আচরণ বদলায়।

প্র ০৪Amazon Prime Video-র একটি দল ২০২৩ সালে লিখেছিল, serverless ছেড়ে এক প্রক্রিয়ায় আনায় খরচ ৯০% কমেছে। তাহলে কি serverless আর microservice খারাপ?

Prime Video-র কারিগরি ব্লগের সেই লেখায় একটি নির্দিষ্ট audio/video মান-পর্যবেক্ষণ সেবার কথা ছিল। লেখা অনুযায়ী, প্রথম নকশায় অনেক ছোট ধাপ একটি state machine দিয়ে জোড়া ছিল, আর video-র ফ্রেম উপাদানগুলোর মধ্যে object storage দিয়ে আদান-প্রদান হতো। প্রতিটি ধাপের রূপান্তর আর storage-এ প্রতিটি পড়া-লেখার দাম এত বেশি হচ্ছিল যে দল সব উপাদান এক process-এ এনে container-এ চালায়, আর জানায় যে খরচ প্রায় ৯০% কমেছে।

লেখাটি প্রকাশের পর অনেকেই বললেন, “microservice ব্যর্থ”। কিন্তু এটি ভুল সিদ্ধান্ত। লেখাটি একটি সেবার কথা বলে, পুরো Prime Video-র নয়। শিক্ষাটি হলো খরচের আকৃতি। Serverless আর state machine-এর দাম সাধারণত প্রতি call বা প্রতি রূপান্তরে। অল্প ও অনিয়মিত ঘটনায় এটি চমৎকার, যেমন পর্ব ৭১-এ দেখেছেন। কিন্তু প্রতিটি ফ্রেমে, দিনরাত, বিপুল সংখ্যক call হলে একই নকশা ব্যয়বহুল।

এখানেই unit economics-এর ব্যবহার। দলটি “এক stream পর্যবেক্ষণের খরচ”-এর মতো একটি একক ধরলে সহজেই দেখা যায়, কোন call-টি বারবার হচ্ছে, আর সেটি নকশার কোন সিদ্ধান্তের ফল। সেই সাথে মনে রাখুন, প্রথম নকশাটি দ্রুত তৈরি করার জন্য ভালো সিদ্ধান্ত হতেই পারে। নকশা স্থির জিনিস নয়। প্রথমে দ্রুত শেখা, তারপর চাপ ও খরচের আকৃতি জেনে নকশা বদলানো একটি স্বাভাবিক পথ। Werner Vogels-ও ২০২৩ সালের “Monoliths are not dinosaurs” লেখায় এমন ঘটনাকে নকশার trade-off হিসেবেই দেখান, আর বলেন একই নকশা চিরকাল ঠিক থাকে না।

মূল উপলব্ধি: কোনো architecture সস্তা বা দামি নয়, দামি হলো নির্দিষ্ট চাপের সাথে তার মূল্য-কাঠামোর অমিল। প্রতিটি নকশার জন্য জিজ্ঞেস করুন, এটির দাম কীসের সংখ্যার সাথে বাড়ে?

প্র ০৫খরচ আর নির্ভরযোগ্যতা মুখোমুখি হলে সিদ্ধান্ত কীভাবে নেবেন? এই trade-off কি টাকায় হিসাব করা যায়?

পুরোপুরি না, তবে অনেকটা যায়। একটি উদাহরণ ধরি, সব সংখ্যা ধরে নেওয়া। হাটঘরের database-এর multi-zone standby-র খরচ মাসে $৬০০। FinOps-এর খাতায় এটি লোভনীয়, বছরে $৭,২০০। এবার অন্য দিক। অর্ডার থেকে ঘণ্টায় গড়ে $৩,০০০ আয় হলে, standby না থাকায় এক zone-এর সমস্যায় পুনরুদ্ধারে ৪ ঘণ্টা লাগলে ক্ষতি $১২,০০০, সাথে গ্রাহকের আস্থা। যদি এমন ঘটনা গড়ে তিন বছরে একবারও ঘটে, প্রত্যাশিত ক্ষতি বছরে $৪,০০০। শুধু এই অঙ্কে standby-টি লোকসান মনে হবে। তবু সিদ্ধান্ত এত সরল নয়, কারণ আস্থা, ডেটা হারানো আর ঈদের আগের ব্যস্ততম দিনে ঘটার ঝুঁকি এই অঙ্কে নেই।

এই ধরনের হিসাবের মূল্য সঠিক সংখ্যায় নয়, আলোচনায়। এটি অনুমানকে প্রকাশ্যে আনে, আর অর্থ ও প্রকৌশল দল একই ভাষায় কথা বলে। পর্ব ৬৬-এর SLO এখানে কাজের। Error budget যদি প্রায়ই অনেকটা বেঁচে থাকে, হয়তো আপনি প্রয়োজনের চেয়ে বেশি নির্ভরযোগ্যতা কিনছেন। যদি প্রায়ই ফুরিয়ে যায়, খরচ কমানোর সময় এটি নয়।

আরেকটি কৌশল স্তরভেদ। সব service সমান গুরুত্বপূর্ণ নয়। Checkout আর অর্ডারের ডেটা প্রথম স্তর, সেখানে বাড়তি capacity বিমা। অভ্যন্তরীণ রিপোর্ট বা dev environment শেষ স্তর, সেখানে spot বা off-hours সূচি মানানসই। একই নিয়ম সবখানে চাপালে হয় অপচয়, নয় ঝুঁকি। পর্ব ২৪-এর RPO ও RTO-ও এই স্তরভেদেরই ভাষা।

মূল উপলব্ধি: খরচ আর নির্ভরযোগ্যতা শত্রু নয়, দুটিই একই ব্যবসার হিসাব। প্রতিটি সাশ্রয়ের প্রস্তাবে লিখুন: কোন ঝুঁকি কিনছি, কত টাকায়, আর কে সেটি মেনে নিচ্ছেন।

অনুশীলন

কোনো আসল cloud account লাগবে না। সব কিছু কাগজে বা পাতার simulator-এ করা যায়।

  1. Off-hours হিসাব: ৮টি test VM, প্রতিটি ঘণ্টায় $০.২০ (ধরে নেওয়া)। মাস ৭২০ ঘণ্টা। Disk-এর খরচ মাসে $৩০, যা সব সময় চলে। সপ্তাহে ৫ দিন ১০ ঘণ্টা করে চালু রাখলে নতুন মোট বিল কত, আর কত বাঁচে?

    পূর্ণ compute: ৮ × $০.২০ × ৭২০ = $১,১৫২। চালু ভাগ: ৫০/১৬৮ = ২৯.৮%. নতুন compute: $১,১৫২ × ৫০/১৬৮ = $৩৪২.৮৬। Disk যোগ করে নতুন মোট $৩৭২.৮৬। আগের মোট $১,১৮২। সাশ্রয় $১,১৫২ − $৩৪২.৮৬ = $৮০৯.১৪। Disk-এর $৩০ দুই দিকেই আছে, তাই সাশ্রয়ে আসে না।

  2. Commitment হিসাব: দিনে ১০ ঘণ্টা $৫০/ঘণ্টা আর ১৪ ঘণ্টা $৩০/ঘণ্টা ব্যবহার (on-demand মূল্যে)। ছাড় ৪০%. $৩০ আর $৫০ অঙ্গীকারের মধ্যে কোনটি ভালো? (১ − ছাড়) নিয়ম দিয়ে ব্যাখ্যা করুন।

    কোনো অঙ্গীকার না থাকলে দিনে ৫০০ + ৪২০ = $৯২০। $৩০ অঙ্গীকার: ফি ৩০ × ০.৬০ × ২৪ = $৪৩২, বাড়তি ১০ ঘণ্টায় $২০ করে $২০০, মোট $৬৩২। $৫০ অঙ্গীকার: ফি ৫০ × ০.৬০ × ২৪ = $৭২০, বাড়তি নেই, মোট $৭২০। তাই $৩০ ভালো। নিয়মে: ওপরের স্তরটি ১০/২৪ = ৪১.৭% সময় চলে, যা ১ − ০.৪০ = ৬০%-এর কম।

  3. সমালোচনা করুন: একজন ব্যবস্থাপক ঘোষণা দিলেন: “এই মাসে সব দল ৩০% খরচ কমাবে। staging আর log সব বন্ধ, database replica অর্ধেক, আর আগামী তিন বছরের commitment কিনে ফেলুন।” এই পরিকল্পনার সমস্যা কী? আপনি কী প্রস্তাব করবেন?

    সমস্যা: সবার জন্য একই ৩০% অর্থহীন, কারণ দলগুলো সমান অপচয় করে না। Staging বন্ধ করলে release-এর ঝুঁকি বাড়ে, log বন্ধ করলে incident অন্ধ হয়, replica কমালে SLO ঝুঁকিতে পড়ে। আর আকার ঠিক করার আগে তিন বছরের অঙ্গীকার মানে অপচয়কে তিন বছরের জন্য বেঁধে ফেলা।

    প্রস্তাব: আগে বড় পাঁচটি লাইন আর unallocated দেখা। তারপর idle মোছা, staging-এ off-hours সূচি, log-এ retention আর sampling, p95 দেখে rightsizing, rollback-সহ। Unit cost-এ লক্ষ্য ঠিক করা। সবশেষে ছোট, ধাপে ধাপে commitment.

  4. আউটপুট অনুমান করুন: নিচের কমান্ড কী ছাপবে? না চালিয়ে বলুন। কমান্ডটি নিজের Linux বা WSL-এ চালিয়ে মিলিয়েও নিতে পারেন।
    printf 'a,web,100\nb,,40\nc,web,60\nd,,0\n' |
    awk -F, '{ k = ($2 == "" ? "none" : $2); c[k] += $3 }
             END { print c["web"], c["none"] }'

    আউটপুট 160 40. a আর c web-এ গিয়ে ১০০ + ৬০ = ১৬০। b আর d-র দ্বিতীয় ঘর ফাঁকা, তাই none-এ ৪০ + ০ = ৪০। মানে, ফাঁকা tag-ও হিসাবে থাকে, হারায় না।

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

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

ক্রমএকটি দলের প্রথমবার cloud খরচ গোছানোর কাজগুলো ভালো ক্রমে সাজান (▲▼ চেপে সরান)

  1. Tag বসিয়ে বিল দলের নামে ভাগ করা
  2. Idle resource মোছা আর dev environment-এ off-hours সূচি
  3. Metric দেখে rightsizing, rollback পরিকল্পনাসহ
  4. স্থির ভিত্তির ওপর commitment কেনা
  5. মাসিক review আর unit cost-কে অভ্যাস করা

FinOps Framework-এর তিনটি phase কোনগুলো, আর তাদের সম্পর্ক কী?

  • Plan, Build, Run; একবার শেষ হলে আর লাগে না
  • Inform, Optimize, Operate; একটি চলমান লুপ
  • Crawl, Walk, Run; একবারেই পার হতে হয়
  • Measure, Cut, Report; প্রতি বছর একবার

একটি প্রতিষ্ঠানের tag coverage মাত্র ৫০%, আর shared খরচ ভাগের নিয়ম এখনো ঠিক হয়নি। প্রথমে কোনটি বেছে নেওয়া সবচেয়ে যুক্তিসঙ্গত?

  • এখনই সব দলে chargeback চালু করা
  • Tag পুরোপুরি ঠিক না হওয়া পর্যন্ত দলকে কোনো সংখ্যা না দেখানো
  • Showback শুরু করা, আর unallocated আলাদা লাইনে দেখানো
  • পুরো বিল সব দলে সমান ভাগে ভাগ করা

৮ vCPU, ৩২ GiB-এর একটি VM-এ ৩০ দিনের p95 CPU ৮%, p95 memory ৮৫%. লক্ষ্য CPU ৬০%, memory ৭০%. ঠিক সিদ্ধান্ত কোনটি?

  • ৪ vCPU, ১৬ GiB-তে নামানো, কারণ CPU প্রায় খালি
  • ২ vCPU, ৮ GiB-তে নামানো
  • VM-টি idle ধরে মুছে ফেলা
  • আকার না কমানো; বরং memory-ভারী ধরন খোঁজা

Commitment-এর ছাড় ২৫%. ব্যবহারের একটি স্তর দিনের ৬০% সময় চলে। এই স্তরের জন্য বাড়তি অঙ্গীকার কি লাভজনক?

  • না, কারণ দরকার অন্তত ৭৫% সময় ব্যবহার
  • হ্যাঁ, কারণ ৬০% ব্যবহার ২৫%-এর চেয়ে বেশি
  • না, কারণ শুধু ১০০% ব্যবহার হলেই লাভ হয়
  • তথ্য যথেষ্ট নয়, ঘণ্টার দাম জানা দরকার

এক মাসে cloud বিল ১০% বাড়ল, আর অর্ডার বাড়ল ২৫%. খরচ/অর্ডারের কী হলো?

  • ১০% বেড়েছে
  • প্রায় ১২% কমেছে
  • ঠিক ১৫% কমেছে
  • বদলায়নি

একটি Deployment-এর CPU request ১০০০m থেকে ৫০০m করা হলো। HPA-র লক্ষ্য আগের মতোই ৭০% utilisation. কী ঘটবে?

  • HPA-র আচরণে কোনো বদল হবে না
  • প্রতি Pod-এ ১৪০০m ব্যবহারের পরে HPA Pod বাড়াবে
  • প্রতি Pod-এ প্রায় ৩৫০m ব্যবহারেই HPA Pod বাড়াতে শুরু করবে
  • সব Pod সাথে সাথে OOMKilled হবে

শব্দকোষ

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

মনে রাখুন

  1. FinOps খরচ কাটার অভিযান নয়, প্রতিটি খরচের মালিক ও কারণ ঠিক করার অভ্যাস।
  2. লুপ: Inform → Optimize → Operate. Showback আগে, chargeback তথ্য পরিণত হলে।
  3. বিল = ব্যবহার × দর। আগে মোছা, ছোট করা, রাতে বন্ধ রাখা; তারপর commitment.
  4. Rightsizing-এ CPU ও memory দুটোই, আগে থেকে লেখা rollback শর্ত, আর Kubernetes-এ HPA-র হিসাব।
  5. বিল নয়, unit cost দেখুন; একই বারের সাথে তুলনা করে anomaly ধরুন; মাসিক review বন্ধ করবেন না।

পরের পর্বে: খরচ cloud নকশার একটি স্তম্ভ মাত্র। পর্ব ৭৪-এ Well-Architected-এর সব স্তম্ভ, multi-cloud আর lock-in-এর হিসাব দেখব।

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

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