سامانه نوبتدهی آزمایشگاه مهر در همدان شنبه ساعت نه و دوازده دقیقه از کار افتاد و ساعت ده و سه دقیقه برگشت. تعمیرش پنج دقیقه بود و بقیهاش فهمیدن. دیسک نه روز بود که از ۹۰ درصد رد شده بود و هیچکس نگاهش نمیکرد. دیسک ۹۰ درصد یک هشدار است و دیسک ۱۰۰ درصد یک قطعی، و فاصله میان این دو در این مورد نه روز بود.
از آن ۵۱ دقیقه، ۳۴ دقیقهاش پیش از آن گذشت که کسی بفهمد چیزی خراب است. چیزی که بالاخره خبر داد سامانه پایش نبود، تلفن یک مراجعهکننده بود که نتوانسته بود نوبت بگیرد. این جمله را باید کامل خواند: تنها چیزی که در آن صبح واقعا کار کرد، تلفن بود. سرور جایی است که هر چیز دیگری در کامپیوتر، شبکه، و زیرساختی که زیر بقیه نشسته بالاخره به آن تکیه میکند، و به همین دلیل خرابیاش را تقریبا همیشه کس دیگری اول میبیند.
هیچ حد سیستمی یک پرتگاه نیست
عدد را پیش از نگاه کردن به نمودار بلند بگویید. پر شدن دیسک یک اتفاق ناگهانی نیست، یک شیب است، و شیبش معمولا هفتهها طول میکشد. چیزی که این شیب را از دید پنهان میکند تجمیع است: نمودار مصرف کل ماشین آن نه روز کاملا سالم بود، چون بخش لاگ روی یک فایلسیستم جدا نشسته بود و آن یکی داشت پر میشد. df -h برای هر فایلسیستم جدا گزارش میدهد، پس دیسک پر میتواند یک پوشه باشد، و ستون درصد را باید سطر به سطر خواند نه به شکل یک عدد کلی.
وقتی سطر مقصر پیدا شد، پرسش بعدی این است که داخلش چه چیزی جا گرفته. ncdu همان مسیر را میگیرد و پوشهها را مرتبشده بر اساس حجم نشان میدهد، که جای زدن دستور du روی پوشهها یکییکی را میگیرد. در آزمایشگاه مهر جواب یک فایل لاگ بود که چرخش نداشت و از راهاندازی سامانه بیوقفه بزرگ شده بود؛ همان پنج دقیقه تعمیر، تعریف کردن یک چرخش برای آن فایل بود، و هر کدام از آن نه روز میشد همین کار را کرد.
همان تعمیر پنج دقیقهای
- یک پرونده در
/etc/logrotate.d/mehrبا پنج دستور:daily،rotate 7،compress،missingok،notifempty - و آزمودنش بدون دست زدن به چیزی:
logrotate -d /etc/logrotate.d/mehr
logrotate با daily و rotate 7 فایل را هر شب میچرخاند و هفت نسخه نگه میدارد؛ دستور سوم نسخههای قدیمی را فشرده میکند، دستور چهارم میگوید نبودن فایل خطا نیست، و دستور پنجم میگوید فایل خالی را نچرخان. پرچم آزمون فقط میگوید چه کاری انجام میشد و هیچ فایلی را جابهجا نمیکند، که تنها راه دیدن نتیجه پیش از شب اول است. کل این پرونده پنج سطر است و روی هر سروری که یک سرویس دارد باید همان روز اول نوشته شود.
نکتهای که این تعمیر لو میدهد بزرگتر از خودش است: هر سرویسی که راه میافتد یک فایل تولید میکند که هیچکس مسئول کوچک نگه داشتنش نیست. پایگاه داده، وبسرور و خود سامانه هر سه لاگ مینویسند و هر سه پیشفرضشان با هم فرق دارد، و ماشینی که سه سال بالا مانده اختلاف این سه پیشفرض را روی دیسکش جمع کرده است.
سنجیدن کاری که کاربر میکند
چیزی را بسنجید که کاربر انجام میدهد، نه چیزی را که ماشین گزارش میدهد. ماشین آن صبح تا آخرین لحظه گزارش داد که بالاست، و درست هم میگفت: سیستمعامل بالا بود، وبسرور جواب میداد، و پردازنده بیکار بود. چیزی که کار نمیکرد گرفتن نوبت بود، و هیچ سنجهای برای آن وجود نداشت. آزمونی که وجود این خرابی را میگرفت یک درخواست دورهای به همان مسیر ثبت نوبت است با بررسی متن جواب، از یک ماشین دیگر، هر دقیقه. پایش، و اینکه چه چیزی ارزش هشدار دادن دارد تماما همین یک تمایز است.
وقتی هشدار رسید، اولین چیزی که باید خوانده شود لاگ همان بازه است نه کل لاگ. journalctl -p err -S -1h فقط خطاهای یک ساعت گذشته را چاپ میکند: پرچم اول سطح را به خطا و بالاتر محدود میکند و پرچم دوم شروع بازه را میگذارد، و خروجی معمولا از چند صد هزار سطر به چند ده سطر میرسد. در آن صبح همان چند ده سطر، هر بار یک جمله گفته بودند که به دیسک اشاره داشت.
یک شنبه
خرابی یک ثانیه بود و فهمیدنش سی و چهار دقیقه
پنج لحظه از یک قطعی. فقط در دو لحظه آخر کسی به سرور دست زد.
- نه روز قبلدیسک از ۹۰ درصد رد میشودهیچ هشداری روی این فایلسیستم تعریف نشده، و عدد کلی هنوز راحت خوانده میشود
- ۰۹:۱۲دیسک پر میشودپایگاه داده نوشتن را رد میکند و سامانه خطای ثبت نوبت میدهد
- ۰۹:۴۶یک مراجعهکننده تلفن میزندسی و چهار دقیقه گذشته، و این همان سامانه پایشی است که واقعا کار کرد
- ۰۹:۵۸df -h سطر مقصر را نام میبرددوازده دقیقه تا پیدا شدنش، چون نمودارهای خود ماشین از عدد اشتباهی بودند
- ۱۰:۰۳چرخش لاگ، و نوشتن از سر گرفته میشودپنج دقیقه، که هزینه همین تعمیر در هر کدام از آن نه روز بود
فاصلهها متناسب نیستند و خودِ شکل ادعاست: تعمیر پنج دقیقه بود و قطعی ۵۱ دقیقه، و هرچه میان این دو بود فهمیدن بود.
جایی که کار میایستد
ایست اینجا کنترلپنل است. بیشتر سرورهایی که اینجا اجاره میشوند با دایرکتادمین یا سیپنل تحویل داده میشوند، و کسی که دو سال است سرور را با همان اداره میکند هرگز پوسته را باز نکرده. تا وقتی خرابی چیزی است که پنل نشان میدهد این کافی است. کنترلپنل وقتی خرابی زیر خودش باشد چیزی برای نشان دادن ندارد، و دیسکِ پر روی یک فایلسیستم جدا دقیقا از همان جنس است: پنل صفحه سفید میدهد یا اصلا بالا نمیآید، و تنها حرکت باقیمانده راهاندازی دوباره ماشین یا تیکت زدن به ارائهدهنده است. هر دو گاهی جواب میدهند و هیچکدام تشخیص نیستند. یک بعدازظهر با لایهای میان سختافزار و هرچه اجرا میکنید این دیوار را برمیدارد.
ایست دوم شیفت است و فنی نیست. سرور آزمایشگاه را همان کسی نگه میدارد که سامانهاش را نوشته، و ساعت سه بامداد هیچکس نیست؛ برق هم اینجا متغیر بیشتری است، چون دیتاسنترها ژنراتور دارند و دفترها اغلب ندارند، پس ماشینی که در دفتر خود شرکت نشسته یک وابستگی دارد که نسخه اجارهایاش ندارد. جواب هم استخدام نیست: تعریف کردن اینکه چه چیزی واقعا نیمهشب ارزش بیدار کردن دارد و چه چیزی تا صبح صبر میکند، تصمیمی است که یک بار گرفته میشود و میزبانی، و اینکه چه کسی مسئول چیست مرزش را روشن میکند.
چه چیزی امروز باز میشود
Prometheus و Grafana هر دو رایگان و متنباز هستند و جای ناجیوس و نسلش را گرفتند، که ثبت میکردند چیزی بالا هست یا نه، نه اینکه چطور رفتار میکند. تفاوت همان تفاوت این صفحه است: یک سنجه که هر پانزده ثانیه ذخیره میشود شیب نه روزه را نشان میدهد، و یک بررسی بالا یا پایین فقط لحظهای را نشان میدهد که دیگر دیر شده. Uptime Kuma هم رایگان و متنباز است و روی یک ماشین دوم بالا میآید، و جای سرویسهای پایش بیرونی را میگیرد که ثبتنام و پرداخت خارجی میخواهند؛ همان درخواست دورهای به مسیر ثبت نوبت را همین میزند.
ncdu رایگان و متنباز است و در مخزن هر توزیع هست، و جای زدن du روی پوشهها یکییکی تا پیدا شدن مقصر را گرفت. سه ابزار بالا با هم کاری میکنند که یک ماشین بتواند پیش از خراب شدن حرف بزند، و کاری که یک سرور میکند، و چرا همیشه روشن است جایی است که این عادت شکل میگیرد. پیکربندی خود چیزی که جواب میدهد در وبسرورها، و پروندهای که رفتارشان را تعیین میکند است، و اگر ماشین ویندوزی باشد قواعدش را ویندوز سرور، و چیزی که در آن فرق میکند میگوید.
پرسشی که بعد از این میماند این است که وقتی همین ماشین اجارهای باشد و ساعتی صورتحساب بگیرد، کدام یک از این تصمیمها یک قلم ماهانه میشود. اجاره کردن زیرساخت، به جای مالک شدنش همان پرسش را با پول جواب میدهد، مسیری که این درخواستها از آن میآیند در رساندن داده از یک دستگاه به دستگاه دیگر کشیده شده، و سرویسهایی که یک تیم کوچک باید خودش نگه دارد در ایمیل و ابزارهای کار گروهی، و هزینه نگه داشتنشان جمعاند.