۵ سرور وبسوکت Node.js زیر ذرهبین
خلاصهٔ کاملتر
تو این مقاله، تیم Evil Martians گزارش میده که پنج استک وبسوکت روی Node.js رو روی سختافزار یکسان Railway (۳۲ vCPU و ۳۲ گیگ رم، یه ریجن، یه پروژه) مقایسه کرده: Socket.io پیشفرض، Socket.io با Connection State Recovery، uWebSockets.js، AnyCable OSS و AnyCable Pro. نویسنده خودش میگه AnyCable محصول همون تیمه و دقیقاً به همین دلیل بیشتر از همه دنبال مچگیری از عدد خودشون بوده.
اولین درس این بود که لودجنراتور نباید روی لپتاپ باشه. وقتی ده هزار کانکشن از یه آیپی خانگی باز میشه، سیستم ضدسوءاستفادهٔ لبهٔ شبکه اون آیپی رو میبنده — که تو یه سفر کاری به آمریکای لاتین، پنج آیپی پشتسرهم قربانیش شدن. ولی مهمتر از بنشدن، فیزیک ماجراست: وایفای هتل و چند هزار کیلومتر فیبر هم توی عددی که اسمش رو «تأخیر سرور» گذاشتی میشینه. راهحل، یه سرویس bench-runner کنار خود سرورها روی شبکهٔ داخلی بود.
ولی همون ابزار سنجش تمیزشده هم هنوز دروغ میگفت. عدد p99 برابر ۲۳۴ میلیثانیه که مدتها روی صفحهٔ مقایسهٔ خودشون نشسته بود، در واقع ۱۱ میلیثانیهست؛ اون ۲۲۳ میلیثانیهٔ باقیمونده تو خود bench-runner گیر کرده بود، چون هر ده هزار کلاینت تو یه پروسهٔ Node بودن و ایونتلوپ اشباع، تایماستمپ دریافت رو دیر میزد. با پخش همون بار روی ۴۰ شارد ۲۵۰تایی — بدون هیچ تغییری تو سرور — عدد افتاد به ۱۱ میلیثانیه و throughput هم از ۱۵۰ به ۱۲ میلیثانیه رسید.
به گفتهٔ نویسنده، درس اینجا «به ابزارت شک کن» نیست، بلکه تقارنه: هر عدد غافلگیرکننده باید با یه اندازهگیری مستقل دوم و از یه زاویهٔ دیگه بررسی بشه. وقتی AnyCable تو throughput از uWS عقب موند، اولین واکنش این بود که حتماً باگ تسته — ولی بنچمارک درونپروسهای benchi بدون هیچ هاپ شبکهای همون شکل رو نشون داد و معلوم شد اینبار فرض اشتباه بوده، نه ابزار. تلهٔ ظریف دیگه هم این بود که نمیشه p99 شاردها رو میانگین گرفت؛ صدک میانگین نیست.
تو جدول نهایی هیچ سروری همهٔ ستونها رو نمیبره. سر ۱۰ هزار مشترک همه بین ۷ تا ۱۱ میلیثانیه p99 هستن، یعنی هیچکدوم کند نیست. زیر قطعیهای شبکه، Socket.io پیشفرض ۸۵٪ و uWS ۸۷٪ پیام میرسونن، در حالی که CSR و AnyCable هر دو ۱۰۰٪. برای هر کانکشن بیکار، uWS با ۵ کیلوبایت سبکترینه، AnyCable Pro با بافر replayش ۱۸ کیلوبایت میگیره و Socket.io حدود ۵۲ کیلوبایت که سقفش رو حوالی ۱۲۰ هزار کانکشن روی یه نود میذاره.
نکات کلیدی:
- ابزار اندازهگیری خودش بخشی از آزمایشه؛ لودجنراتور رو از لپتاپ و از شبکهٔ کنترلنشده بیار بیرون
- اگه با دادن منابع بیشتر به هارنس عدد عوض شد، اون عدد مال هارنس بوده نه سرور
- هر نتیجهٔ غافلگیرکننده رو با یه روش دوم و مستقل کروشه کن — گاهی ابزار دروغ میگه، گاهی فرض تو
- متغیری که تستش نمیکنی (مثل backoff متفاوت کتابخونهها) رو یکسان کن، وگرنه اون رو داری اندازه میگیری
- برای ادغام نتایج شاردها، توزیعها رو ادغام کن، نه صدکها رو میانگین بگیر
- «چند کانکشن نگه داشت» بدون «چرا همونجا متوقف شد» عدد بیمعنیه




