مشکلات سرور نوروزی

تاریخ: جمعه ۱۵ فروردين ۱۳۹۹
Rouzbeh Minecraft - مشکلات سرور نوروزی

سلام.

امیدوارم که حالتون خوب باشه و در سلامتی کامل به سر ببرید.

همچنین امیدوارم که توی این روزای سخت که به هممون سخت میگذره تو قرنطینه حال اعصابتون هم خوب باشه.

طبق یک سری اتفاقاتی که قبل از شیوع این بیماری افتاده بود و نیازی به توضیح دادنش در اینجا نیست، قرار بود که دیگه سرور تا انتهای سال باز نشه. اما با گذشت زمان و فراگیر شدن بیماری و قرنطینه شدن هممون، تصمیم گرفتیم برای اینکه تنوعی برای شما هم اتفاق بیوفته با مدرسه صحبت کنیم و هماهنگ کنیم که سرور رو توی ایام تعطیلات 3 بار باز کنیم. اولین سرورمون رو قرار بود روز چهارشنبه سوری باز کنیم و شما رو به حال خودتون بذاریم و بهتون امکانات بدیم تا حسابی کیف کنید، که همین طور هم شد.

اما برای دو روز دیگه، نشستیم و برنامه‌ریزی کردیم تا همین جوری توی بازی دور خودمون نچرخیم. همین شد که مسابقه سرور نوروزی رو طراحی کردیم. مسابقه ای که برای شما طراحی شد تا حالا توی سرور در طول این سال ها اجرا نشده بود و شما اولین دوره ای بودید که می‌خواستید این مسابقه رو اجرا کنید.

به علت نوع مسابقه، مساحت زیادی از یک نقشه رو نیاز داشتیم. برای اینکه حساب کار دستتون بیاد و متوجه تفاوت سرور نوروزی با بقیه‌ی سرورها بشید، مپ عادی‌ای که شما هر هفته روزای چهارشنبه در مدرسه بازی می کردید، یک مربع بود که حدودا ۴۹۰۰ بلوک مساحتش بود و حجمش می‌شد چیزی حدود ۳۰۰ مگابایت. اما مپی که تو این دو هفته باز کردیم، مساحتش حدود ۱۶۰ میلیون بلوک بود با حجم حدودی ۳ گیگابایت. ینی اگر ضرب و تقسیم بکنیم، مساحت نقشه حدود ۴۰ هزار برابر شده و حجم فایل‌ها هم حدود ۱۰ برابر!

پس فکر می‌کنم دیگه نیازی به توضیح نباشه که فرق این دو تا در چیه، و احتمالا علت پرش سرور رو بتونید خودتون حدس بزنید! ولی باز با این حال، ما در ادامه توضیحات فنی این اشکالات رو برای شما به تفصیل باز خواهیم کرد.

هفته ی قبل که سرور باز شد، ظرفیت سخت‌افزاری که همیشه برای کلاس ماینکرفت در اختیار داشتیم برای اجرای مسابقمون -با اون گستردگی- کافی نبود. با مکاتبات طولانی‌ای که با مدرسه در این ایام داشتیم، تونستیم هماهنگ کنیم که ظرفیت زیادی (چندین برابر قدرت سخت افزاری بیشتر) رو برای بازیمون به ما اختصاص بدن.

این هفته مشکل سخت افزاریمون به طور کامل برطرف شد، برای همین اوایل سرور (تا نیم ساعت اول) بدون هیچ مشکلی بازی در حال اجرا بود و ما هم روش نظارت داشتیم. اما بعد از گذشت زمان و حرکت بازیکن‌ها داخل نقشه، با یک مشکل جدید رو به رو شدیم.

اول از همه جدول ساعت‌هایی که سرور crash کرد رو با هم می‌بینیم:

زمان crash مدت زمان برقراری سرور بدون crash
زمان آغاز سرور: 18:00:00
18:280:28:39
18:280:00:02
18:450:17:07
18:460:00:42
18:470:00:50
18:490:02:14
18:500:01:13
18:520:01:41
18:550:02:40
18:590:04:33
19:000:00:53
19:290:29:23
19:300:01:01
19:340:03:04
19:370:03:26
19:390:02:14
19:400:00:51
19:410:01:20
19:430:01:57
19:450:01:34
زمان پایان سرور: 19:45

همونطوری که می‌بینید سرور ی جاهایی با ما راه اومده و زمان اتصال‌هایی در حدود نیم ساعت بدون وقفه داشتیم، ولی قطعی و وصلی زیادی هم داشتیم. اما چرا این اتفاق رخ داده؟ آیا منابع و سخت افزار سرور توانایی مدیریت حجم اطلاعات و پردازش ها رو نداشته؟ برای بررسی این فرضیه نمودار زیر رو می بینیم که میزان مصرف منابع سرور CPU و RAM رو نمایش میده:

همونطوری که در این نمودار می‌بینید، در بسیاری از اوقات، منابع مصرفی سرور از ۳۰ تا ۴۰٪ بالاتر نرفته و هیچوقت هم به ۱۰۰٪ نرسیده! این به این معنی هست که میزان CPU و RAM سرور مدرسه بسیار بیشتر از چیزیه که سرور احتیاج داشته. لازم به ذکره که بر روی سرور یک CPU مجازی ۱۰ هسته‌ای Intel Xeon X5550 سوار بوده و میزان رم سرور هم ۱۲ گیگابایت اختصاص داده شده بوده.

پس مشکل کجاست؟

برای فهمیدن علت دقیق این مشکل، به log ها و crash report های سرور مراجعه می‌کنیم. با بررسی این موارد مشخص میشه که خطایی که باعث شده سرور crash کنه یک خطای Fatal به شرح زیر بوده:

java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: -4762410

و در توضیحات ارور موجود در crash report اومده که مشکلی در فرآیند ticking سرور موجب شده هر tick سرور ماینکرفت که در حالت عادی ۰/۰۵ و نهایتا ۱ ثانیه‌س، الان تا بیش از ۶۰ ثانیه طول بکشه، که برای رفعش حداکثر قابل تنظیم tick تا ۱۲۰ ثانیه (۲ دقیقه) هم افزایش یافت ولی دردی از مشکل ما دوا نکرد. لازم به ذکره که منظور از tick همون ضربان سرور ماست که در هر ضربان همه چیز دوباره محاسبه میشه و تغییر میکنه، مثل موقعیت من و شما، موقعیت هیولاها و حیوانات، رشد درخت‌ها و سوختن ذغال داخل اجاق.

با توجه به اینکه نقشه‌ی ما وقتی ساخته و تکمیل میشه که یک بازیکن داخلش حرکت کنه، با ورود شما به داخل سرور و حرکت در نقاطی که قبلا کسی توشون حرکت نکرده بود، بار محاسباتی روی سرور به مقدار قابل توجهی زیاد شد و با اینکه سرور ما به مقدار مناسبی از لحاظ سخت افزار قوی بود، اون اروری که در بالا بهش اشاره شد تولید شد، چرا که محیط اجرایی نرم افزار جاوا که وظیفه اجرای سرور ماینکرفت رو بر عهده داره، بیشتر از مقدار پیش‌فرض نمایه‌های آرایه‌ها بهش ورودی داده شده، و این امر موجب شده که خطای نمایه‌ی خارج از مرز توسط جاوا داده بشه و سرور crash کنه و بسته بشه. به زبون ساده می‌شه گفت که انگار یک جدول برای جاوا تعریف شده که ۱۰۰۰ خونه توش داره، ولی مقدار اطلاعاتی که ما در هر ضربان (tick) وارد این جدول می‌کردیم به جای ۱۰۰۰ تا (که ظرفیت جدول هست) چند هزار برابر بیشتر باشه!‌ خب مشخصه که این جدول اینهمه اطلاعات رو تو خودش نمی‌تونه جا بده و دچار دو نوع خطا میشه که از لحاظ فنی بهشون buffer overflow و Out Of Bounds Array Index می‌گیم. خیلی ساده!

ببخشید که توضیحاتمون زیاد شد ولی به علت یک سری از پیام های شما مجبور شدیم توضیحات کاملی در این مورد بهتون بدیم تا حسابی مثل یه لامپ روشن بشید. چون خیلی هاتون تصور می کردید ما سرور رو خودمون می بندیم و قصد آزار و اذیت شما رو داریم!

دوستان! این که یک هفته انتظار کشیدید تا در سرور حاضر بشید، این که در این حال و اوضاع به دنبال هماهنگی و هم گروهی گشتید و اینکه برای بازی کردن ذوق و شوق زیادی داشتید، همه و همه برای ما قابل درکه.

شاید باورتون نشه اما ما خودمون بیشتر از شما دوست داشتیم که این مسابقه اجرا بشه، چون اگه شما یکی دو ساعت زحمت کشیدید تا گروه پیدا کنید و هماهنگ بشید با هم، ما چیزی حدود 30 ساعت مفید وقت گذاشتیم که تمهیدات لازم رو براتون اماده کنیم -که آخرشم نشد به آخر ماجرا برسید و معبد اصلی رو کشف کنید.

پس به خاطر دلایل بالا و اعصابِ خوردتون حق داشتید سوال کنید، غر بزنید یا ...

اما متاسفانه بعضی از پیام هاتون باعث دلخوری زیادی برای ما شد، بعضی از پیام ها هم نشانی از ادب توش دیده نمی‌شد و بعضی‌شون هم هیچ اطلاعاتی از موضوعی که راجع بهش حرف می‌زنن نداشتن، ولی ندانسته حرف زدن! که دو نمونه از این پیام‌ها رو بدون ذکر نام در زیر می‌تونید ببینید:

در ضمن منظور دوستمون از کرک در پیام دوم، کرش یا همون crash بوده!:)))

آقایون! این خیلی مهمه که شما جایگاهی که توش قرار دارید (در اینجا به عنوان دانش‌آموز) و جایگاه فردی که مخاطبتون هست (در اینجا معلمین شما) رو درک کنید و متناسب با اون حرف بزنید و برخورد کنید. الان توی این سنی که هستید، بهترین فرصته که تمرین کنید وقتی از یه موضوعی خشمگین می‌شید یا ناراحت هستید، خشمتون رو کنترل کنید و کاری نکنید که بی‌احترامی و بی‌ادبی تلقی بشه و بعدا به ضررتون تموم و باعث پشیمونیتون بشه. تو این موارد بهترین کار اینه که صبر کنید تا یه کم حال اعصابتون بهتر بشه و بعدا تصمیم بگیرید که چه برخوردی می خواید بکنید.

این ماجرای سرور تلنگر خوبی برای هممون بود تا یه کم به خودمون بیایم و صبر و حوصله و کنترل خشم رو تمرین کنیم کنار هم.

با همه‌ی این حرف‌ها، ما باز هم تصمیم داشتیم که مشکلات سرور رو رفع کنیم و در آینده‌ی نزدیک مجددا سرور ماجراجویی‌مون رو راه بندازیم و دور هم در این ایام سخت خوش بگذرونیم و چیز یاد بگیریم. اما با توجه توضیحاتی که در بالا دادیم و برخوردی که از بعضی از شما دیدیم، تصمیم گرفتیم که برگزاری سرور خارج از زمان کلاسمون رو به طور دائم متوقف کنیم.

در نهایت براتون آرزوی موفقیت و سلامت می کنیم و دوست داریم هر چه زودتر این ویروس مزاحم دست از سر هممون برداره!

به امید دیدار همتون!