# صدکِ ۹۹ که یک کران‌جاب بود

- Published: 2026-07-28
- Reading time: 3 min
- Tags: PostgreSQL, Observability, Latency

سه هفته، صدکِ ۹۹ یک اندپوینت هر شب ساعت ۰۲:۱۰ به نُه ثانیه می‌رسید و تا ۰۲:۴۰ خودش برمی‌گشت. کسی بیدار نبود که ببیند و داشبورد آن را در میانگین گم می‌کرد. اصلاحش یک کلمه SQL بود؛ یافتهٔ اصلی همان سه هفته بود.

هشدار هیچ‌وقت آن‌قدر بلند نبود که کسی را بیدار کند. یک اندپوینت — همان که اپ موبایل موقع باز شدن صدا می‌زند — هر شب از صدکِ ۹۹ برابر ۱۸۰ میلی‌ثانیه به حدود نُه ثانیه می‌رفت و پیش از آنکه کسی در تهران صبحانه بخورد به حالت عادی برمی‌گشت. سه هفته این کار را کرد.

اشتباه اول

### داشبورد داشت آن را در میانگین گم می‌کرد

پنل تأخیر ما میانگین متحرک یک‌ساعته بود. سی دقیقه پاسخ نُه‌ثانیه‌ای در دل یک روزِ پاسخ‌های ۱۸۰ میلی‌ثانیه‌ای، میانگین روزانه را چند میلی‌ثانیه جابه‌جا می‌کند؛ اما صدکِ ۹۹ را نُه ثانیه جابه‌جا می‌کند. صدک تمام این مدت در انبار متریک‌ها بود؛ فقط پنل آن را رسم نمی‌کرد. اولین تغییر، رفع اشکال نبود. جای هر میانگین روی آن تخته، صدک‌های ۵۰ و ۹۵ و ۹۹ روی یک محور نشست تا وقتی دُم از میانه جدا می‌شود، به‌شکل یک فرم دیده شود، نه عددی که کسی باید با حافظه‌اش مقایسه کند.

موضوع چه بود

### کاری شبانه که قفلی را نگه داشته بود که به آن نیاز نداشت

ساعت ۰۲:۱۰ کاری شبانه یک نمای مادی‌شده را بازمی‌ساخت؛ همان نمایی که پرس‌وجوی «باز شدن اپ» از آن می‌خواند. دستور را بدون CONCURRENTLY اجرا می‌کرد و REFRESH MATERIALIZED VIEW در آن حالت قفل ACCESS EXCLUSIVE می‌گیرد — و هر خواندنِ آن نما پشت این قفل صف می‌بندد. بازسازی حدود نیم‌ساعت طول می‌کشید، چون نما از روزی که نوشته شده بود چهل برابر شده بود. آن کار شبانه دو سال قدمت داشت. روزی که نوشته شد درست بود و از روزی که جدولِ پشتش بزرگ شد، بی‌سروصدا غلط شده بود.

```
-- پیش از این: قفل ACCESS EXCLUSIVE می‌گیرد و همهٔ خواننده‌ها پشتش صف می‌بندند
REFRESH MATERIALIZED VIEW app_launch_summary;

-- پس از این: خواننده‌ها همان تصویر قبلی را می‌گیرند تا تصویر تازه ساخته شود.
-- به یک ایندکس یکتا روی نما نیاز دارد؛ تمام هزینهٔ این اصلاح همین است.
REFRESH MATERIALIZED VIEW CONCURRENTLY app_launch_summary;
```

خطا یک خط SQL بود. آنچه ارزش نوشتن دارد این است که یک صدکِ ۹۹ نُه‌ثانیه‌ای شبانه، سه هفته از تیمی که هر روز به داشبورد خودش نگاه می‌کرد جان سالم به در برد — چون آن پنل به پرسشی جواب می‌داد که کسی نمی‌پرسید.


---

Source: https://larsima.com/insights/p99-was-a-cron-job
Organisation: LARSIMA (شرکت فن‌آوران توسعه لار سیما), registered in Iran, no. 318515, since 2007-12-02.
