میں نے اپنی سائٹ پر ایک CDN کیش شامل کیا اور اس کی رفتار کم ہونے لگی۔ یہاں وہ ریاضی ہے جو مجھے پہلے کرنے کی ضرورت ہے:

پچھلے ہفتے میں نے تیز رفتار دیکھنے کی امید میں، اپنی جامد سائٹ کے سامنے ایک CDN کیش رکھا۔

تاہم، رفتار نمایاں طور پر سست ہوگئی. لطیف نہیں: تبدیلیاں نظر آنے سے پہلے آزاد کرالر نے 38 سست صفحات پر جھنڈا لگایا 75 اس کے بعد۔

میں نے اسے اسی دن واپس کر دیا۔ یہ ایک حساب ہے جو آپ کو بتاتا ہے کہ کیا ہوا، کیوں ہوا، اور کسی بھی چیز کو تعینات کرنے سے پہلے مداخلت نہ کرنا۔

انڈیکس

شرطیں

آپ کو پہلے CDN چلانے کی ضرورت نہیں ہے۔ تاہم، اگر آپ درج ذیل سے واقف ہیں تو یہ زیادہ معنی خیز ہو سکتا ہے:

  • یہاں یہ ہے کہ ایک CDN اعلی سطح پر کیا کرتا ہے: ہم آپ کے صفحات کی کاپیاں دنیا بھر کے سرورز پر محفوظ کرتے ہیں اور انہیں قریبی زائرین کے لیے پیش کرتے ہیں۔

  • پہلے سے طے شدہ HTTP کیشنگ ہیڈر: کس بارے میں Cache-Control اور max-age نہیں دیکھتے میں وضاحت کرتا ہوں s-maxage اور must-revalidate وہ کہاں سے آتے ہیں.

  • پڑھیں curl حکم: اس مضمون میں تمام پیمائشیں سنگل لائن ہیں۔ curl آپ اسے اپنی سائٹ کے خلاف چلا سکتے ہیں۔

اس میں Cloudflare کا کوئی علم نہیں ہے اور انسٹال کرنے کے لیے کچھ بھی نہیں ہے۔ اہم سبق ریاضی ہے اور تمام CDNs پر لاگو ہوتا ہے۔

ترتیب

یہ سائٹ ایک مستحکم ایسٹرو بلڈ ہے۔ 77 HTML صفحات، کوئی سرور سائیڈ رینڈرنگ اور کوئی ڈیٹا بیس نہیں۔ نوی ممبئی میں اصل سرورز کے ساتھ مفت پلان میں، ہم کلاؤڈ فلیئر کے پیچھے ہیں۔ ٹریفک معتدل ہے۔ تقریباً 9 زائرین روزانہ آتے ہیں۔

گوگل سرچ کنسول کی رپورٹ یہ ہے: اوسط جوابی وقت 711ms. گوگل کی اپنی گائیڈ لائن 200ms ہے۔ یہ 3.5x سے زیادہ تھا، اور ایک واضح وجہ کے ساتھ ایک واضح مسئلہ کی طرح لگتا تھا۔

وجہ اصلی تھی۔ کلاؤڈ فلیئر کیش کر رہا تھا۔ موجود نہیں ہے HTML میں:

$ curl -sI https://example.com/ | grep -i 'cache-control|cf-cache-status'
cache-control: no-cache
cf-cache-status: DYNAMIC

DYNAMIC اس کا مطلب یہ ہے کہ Cloudflare جواب کو بالکل بھی کیش نہیں کرتا ہے۔ ہر ایک ایچ ٹی ایم ایل کی درخواست (کرہ ارض پر ہر آنے والے اور ہر کرالر کی طرف سے) نے ممبئی تک کا سفر کیا۔

اصلیت منتقل ہو رہی تھی۔ Cache-Control: no-cacheیہ میری طرف سے ایک جان بوجھ کر انتخاب تھا تاکہ یہ یقینی بنایا جا سکے کہ تعیناتی فوری طور پر نظر آ رہی ہے۔ جامد اثاثے (جے ایس، سی ایس ایس، فونٹ، اور تصاویر) عام طور پر کیش کیے گئے تھے۔ صرف HTML پاس ہوا۔

لہذا آپ کے پاس میٹرکس ہیں جو کہتے ہیں کہ اصل بہت دور ہے، ایچ ٹی ایم ایل کیشڈ نہیں ہے، اور جواب سست ہے۔ اگر آپ HTML کو کنارے پر کیش کرتے ہیں تو مسئلہ دور ہوجاتا ہے۔ ٹھیک ہے؟

میں نے کیا بدلا۔

میں نے اس ترتیب میں دو تبدیلیاں کیں:

1. اصل ہیڈر۔ پر no-cache کو:

Cache-Control: public, max-age=0, s-maxage=31536000, must-revalidate

یہ جاننے کے قابل ایک مفید نمونہ ہے۔ max-age=0, must-revalidate طریقہ براؤزر ہم ہر درخواست پر دوبارہ توثیق کرتے ہیں، لہذا تعیناتیاں فوری طور پر صارفین کو دکھائی دیتی ہیں۔ no-cache گارنٹی۔ لیکن s-maxage لاگو ہوتا ہے۔ صرف مشترکہ کیشےCDN اشیاء کو ایک سال تک برقرار رکھ سکتا ہے جب تک کہ براؤزر انہیں چیک کرتا رہے۔

2. Cloudflare کیشے کے قواعد۔ یہ وہ تفصیلات ہیں جنہوں نے مجھے حیران کر دیا: اکیلے ہیڈر کچھ نہیں کرتے۔ Cloudflare بغیر ایکسٹینشن کے HTML کو کیش نہیں کرتا ہے۔ Cache-Control ہیڈر میں نے اسے فرض کرنے کے بجائے یک طرفہ راستے پر چیک کیا۔

req 1: cf-cache-status: DYNAMIC
req 2: cf-cache-status: DYNAMIC
req 3: cf-cache-status: DYNAMIC

5 درخواستیں۔ s-maxage میں نے اسے 1 سال پر سیٹ کیا لیکن پھر بھی DYNAMIC ہر بار. جواب کو نشان زد کرنے کے لیے ایک واضح کیش اصول درکار ہے۔ کیش کے لئے اچھا ہے. یہ اصل میں ایک مفید پراپرٹی ہے۔ اس کا مطلب ہے کہ کیشنگ آن ہونے سے پہلے ہیڈر کی تبدیلیوں کو محفوظ طریقے سے پھیلایا جا سکتا ہے۔

ایک بار جب قواعد کو تعینات کیا گیا تو، انہوں نے بالکل اسی طرح کام کیا۔

req 1: cf-cache-status: MISS
req 2: cf-cache-status: HIT
req 3: cf-cache-status: HIT

اور یہ ایک فتح کی طرح لگ رہا تھا. گرم صفحہ کے پہلے بائٹ تک کا وقت ~0.28 سیکنڈ سے کم ہو کر ~0.17 سیکنڈ ہو گیا۔

میں ہندوستان میں پیمائش کر رہا تھا۔ اصل ملک ہندوستان ہے۔ اس سوچ پر قائم رہو۔

نتیجہ

اگلا کرال بدتر تھا۔ وہی سائٹ، وہی دن، وہی 80 یو آر ایل:

رینگنا ایچ ٹی ایم ایل کیشنگ میں ایک سست صفحہ دیکھ رہا ہوں۔
11:58 AM بند کر دیں 38
شام 6:04 کو 75

یہ اس سے تقریباً دوگنا ہے۔ میں نے ایک عین مطابق میٹرک بنایا ہے جسے میں بہت خراب کو ٹھیک کرنے کی کوشش کر رہا تھا۔

یہ کیوں بیک فائر ہوا حصہ 1: MISS مفت نہیں ہے۔

میرے پاس جو ذہنی نمونہ ہے وہ یہ ہے کہ کیشنگ دو نتائج کے درمیان ایک سکے کا پلٹنا ہے: ایک تیز HIT اور ایک MISS، جس کی قیمت بالکل بھی کیش کے برابر نہیں ہے۔

دوسرا ہاف غلط تھا۔ MISS میں، CDN جواب کو پراکسی کو آگے نہیں بھیجتا ہے۔ ایسا ہی ہونا چاہیے۔ اسٹور آبجیکٹ کو اسٹریم کیا جا رہا ہے۔ وہ کام مہنگا ہے۔

میں نے کیشے کو ہٹا کر اور پھر اسی صفحہ کو Cloudflare کے ذریعے بازیافت کرکے اور براہ راست اصل IP پر استعمال کرکے اس کی پیمائش کی: --resolve.

# through Cloudflare, cache cold
curl -s -o /dev/null -w '%{time_starttransfer}' https://example.com/page

# straight to origin, bypassing Cloudflare entirely
curl -sk -o /dev/null -w '%{time_starttransfer}' --resolve example.com:443:203.0.113.10 https://example.com/page

6 سے زیادہ صفحات:

سڑک ٹی ٹی ایف بی
گرم مارا 0.239 سیکنڈ
کولڈ مس 0.366 سیکنڈ
سیدھے اصل پر جائیں (کوئی کیشنگ نہیں) 0.281 سیکنڈ

کیتھی مس ~85ms سست کیشنگ نہ کرنے کے بجائے۔ اس کا مطلب ہے کہ تمام مس شدہ درخواستیں اب ہیں۔ چیزیں بدتر ہو گئی اس سے پہلے کہ میں نے شروع کیا۔

یہ کیوں بیک فائر ہوا، حصہ 2: کرالرز ہمیشہ ٹھنڈے رہتے ہیں۔

کیش صرف اس وقت اثر انداز ہوتا ہے جب ایک ہی یو آر ایل کو اسی کنارے والے مقام سے دوبارہ درخواست کی جاتی ہے جب کہ یہ ابھی بھی کیشڈ ہے۔

کرالر ایسا نہیں کرتے۔ ہر یو آر ایل حاصل کریں۔ ایک بار.

میں بالکل اس کی تصدیق کرنے کے قابل تھا اور ٹیکنالوجی چوری کے قابل تھی۔ اگر CDN کے کیش سے کوئی درخواست پیش کی جاتی ہے، تو یہ کبھی بھی اصل تک نہیں پہنچ پائے گی۔ لہذا، ماخذ تک رسائی کے لاگز ناکامی کی شرح کا براہ راست پیمانہ ہیں۔

grep -ic "crawler-user-agent" /var/log/nginx/access.log

رینگتے ہوئے ۔ 80 یو آر ایل، مجھے کریڈٹ کیا گیا **82 درخواستیں**۔ کرالر کے ذریعہ درخواست کردہ تمام صفحات غائب ہیں۔ کوئی راستہ نہیں ہٹ ریٹ 0%اور ان میں سے ایک مس اب اضافی ~85ms لے گئی۔

یہی منطق پہلی بار آنے والوں پر بھی لاگو ہوتی ہے، جو تعریف کے مطابق سرد بھی آتے ہیں۔

حساب مجھے پہلے کرنا چاہیے تھا۔

یہاں پوری کہانی ہے: اس میں تقریباً 1 منٹ لگتا ہے۔

تین فون نمبر ہیں:

کیشنگ صرف اس صورت میں جیتتی ہے جب اوسط درخواست بیس لائن سے زیادہ ہو۔

h × H + (1 − h) × M  <  B

اپنی ہٹ ریٹ کو حل کریں۔ h:

h  >  (M − B) / (M − H)

میرے فون نمبر کے لیے:

h > (0.366 − 0.281) / (0.366 − 0.239)
h > 0.085 / 0.127
h > 0.67

بھی توڑنے کے لیے 67% کیش ہٹ ریٹ کی ضرورت تھی۔

اب حقیقت کا جائزہ لیں۔ 77 صفحات، تقریباً 9 زائرین فی دن، اور ایک سرچ کرالر ہر چند دنوں میں ہر صفحے کو دوبارہ بازیافت کرتا ہے۔ فرض کریں کہ روزانہ 35 HTML درخواستیں 77 URLs میں تقسیم کی جاتی ہیں۔ اور دنیا بھر میں متعدد کناروں کے مقامات پر پھیل گیا۔ ہر تعیناتی کے ساتھ پوری کیشے کو صاف کیا جاتا ہے۔

ایک حقیقت پسندانہ ہٹ ریٹ صفر کے قریب ہے۔ 67 فیصد کی ضرورت تھی۔

تبدیلی کبھی کام نہیں کرے گی اور مجھے یہ معلوم تھا کہ اس سے پہلے کہ میں کوئی کنفیگریشن لائن لکھوں۔

ڈنکنے والا حصہ

تشخیص درست تھی۔ اصل میں زیادہ تر ٹریفک سے بہت دور ہے۔ HTML اصل میں کیشڈ نہیں ہے۔ 711ms اصلی تھا۔

میں نے بغیر پوچھے ٹھیک کا انتخاب کیا۔ درخواستوں کا کتنا فیصد اصل میں آپ کو فائدہ پہنچائے گا؟.

اور چونکہ پیمائش اسی ملک میں واقع ایک لیپ ٹاپ سے کی گئی تھی، توثیق کے نتائج اور بھی خراب تھے۔ مقامی curl ٹائمنگ نے کہا کہ تبدیلی کامیاب رہی۔ صرف بیرونی کرالر جس نے ابتدائی طور پر اس مسئلے کو اٹھایا تھا اس نے رجعت دیکھی۔

تو اسے ضرور دیکھیں۔ میٹرکس کی جانچ کریں جو کسی مسئلے کی نشاندہی کرتی ہیں، نہ کہ مسئلے کے لیے پراکسی۔

رکھنے کے قابل ہنر

اس کا ایک حصہ میری واپسی سے بچ گیا اور واقعی مفید ہے۔

اگر آپ HTML کو کنارے پر کیش کرتے ہیں، تو آپ کی تعیناتی پائپ لائن کو اس کیش کو بے دخل کرنا چاہیے۔ اور API کال واپس آ گئی۔ "success": true یہ اس بات کا ثبوت نہیں ہے کہ کیشے نے اصل میں کچھ بھی حذف کر دیا ہے۔ تو اس پر یقین نہ کریں۔ چیک کریں

LOCAL=$(shasum -a 256 dist/index.html | cut -d' ' -f1)
LIVE=$(curl -s https://example.com/ | shasum -a 256 | cut -d' ' -f1)

if [ "$LOCAL" != "$LIVE" ]; then
  echo "EDGE IS STALE — this deploy is not live" >&2
  exit 3
fi

ان بائٹس کا موازنہ کریں جو آپ کا CDN درحقیقت پیش کرتا ہے ان بائٹس کے ساتھ جو آپ نے ابھی تیار کیا ہے۔ یہ "فزی API نے کہا کہ یہ ٹھیک ہے" اور "سائٹ کو حقیقت میں اپ ڈیٹ کیا گیا تھا" کے درمیان فرق ہے۔

متعلقہ جال: ہیش ہے۔ مطلقیت اگر کوئی مماثلت ہے تو، مشتبہ خصوصیات جو کہ کیشے پر شبہ کرنے سے پہلے HTML کو کنارے پر دوبارہ لکھتی ہیں (اسکرپٹ آپٹیمائزرز، ای میل اوبسیکشن، آٹومنیفیکیشن)۔

ابھی تک بہتر ہے، اس مفروضے کو ہارڈ کوڈ نہ کریں کہ کیشنگ آن ہے۔ پوچھیں:

STATE=$(curl -sI https://example.com/ | tr -d '\r' | awk 'tolower($1)=="cf-cache-status:"{print $2}')

case "$STATE" in
  DYNAMIC|BYPASS) echo "HTML isn't cached; a missing purge is harmless" ;;
  *)              echo "HTML IS cached — a failed purge means this deploy is invisible" ;;
esac

اب، اگر کوئی کیش رول کو ٹوگل کرتا ہے، تو چیک خاموشی سے خراب ہونے کے بجائے خود بخود ٹھیک ہو جائے گا۔

اس کے بجائے میں آپ سے کیا کہنا چاہتا ہوں۔

تعیناتی سے پہلے اپنی بریک ایون ہٹ ریٹ کا حساب لگائیں۔ (M − B) / (M − H). اگر آپ ممکنہ طور پر وہاں نہیں جاسکتے ہیں تو رک جائیں۔

اپنی اصل ہٹ ریٹ کا ایماندار تخمینہ حاصل کریں۔ روزانہ کی درخواستیں یو آر ایل میں تقسیم ہوتی ہیں، کناروں کے مقامات پر دوبارہ تقسیم ہوتی ہیں، اور ہر تعیناتی کے ساتھ دوبارہ ترتیب دی جاتی ہیں۔ اس سے بہت کم جو آپ عام طور پر محسوس کریں گے۔

پیمائش کریں کہ آپ کے صارفین اور کرالر جسمانی طور پر کہاں واقع ہیں، ماخذ کے ساتھ والی مشینوں پر نہیں۔

یاد رکھیں، کیشنگ مقبولیت کی شرط ہے۔ انعام دینے والی سائٹس جو ایک ہی URL کی ایک مختصر مدت کے اندر بار بار درخواست کرتی ہیں۔ زیادہ ٹریفک والی سائٹیں یہاں آرام سے جیت جاتیں۔ ایک ایسی سائٹ جس پر روزانہ 9 زائرین آتے ہوں، ممکن نہیں ہے۔

اور اگر آپ اپنے سامعین سے دور ایک سست ماخذ کو دیکھ رہے ہیں، تو ایماندارانہ جواب شاید کوئی ذخیرہ نہ ہو۔ آپ اصل کو بھی منتقل کر سکتے ہیں۔

میں چیزوں کے پیچھے انجینئرنگ کے بارے میں لکھتا ہوں۔ صحت مند کیلکولیٹر حبمفت صحت اور تندرستی کیلکولیٹروں کا ایک سیٹ - ایسی اصلاح پر مشتمل ہے جو ظاہر ہے کہ کام نہیں کرتی ہیں۔

اوپر تک سکرول کریں۔