بیست و پنج دقیقه کار مفید روی پایگاه داده تقریباً هیچ خروجی‌ای تولید نمی‌کند و از دید هر دستگاهی در مسیر آن جریان غیرفعال به نظر می‌رسد. حالت غیرفعال دقیقاً همان چیزی است که جمع‌آوری می‌شود. گزارش پس از آن همیشه یک شکل دارد: پرس‌وجو در حال اجرا بود، سپس نشست ناپدید شد و نتیجه هرگز نرسید.

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

کدام جریان خاموش می‌شود

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

ss -tio dst 10.60.4.20
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes

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

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

سیاست بی‌کاری منقضی می‌شود یا محدود می‌کند

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

از مالک هر واسطه بپرسید کدام یک را پیاده می‌کند. دیوار آتش، دستگاه NAT، متعادل‌کننده بار و دروازه ابری همگی می‌توانند وضعیت نگه دارند و لازم نیست هم‌نظر باشند. تنگ‌ترین آن‌ها مهلتی را تعیین می‌کند که باید شکستش دهید.

این تفاوت همچنین می‌گوید کِی تنظیم را متوقف کنید. اگر سیاست سقف مطلق است، راه‌حل درست واحد کاری کوتاه‌تر، کار قابل ادامه یا استثنای تأییدشده است و بررسی زیر فقط تأیید می‌کند که keepalive چیزی را تغییر نداد.

کلید سوکت در پس پیش‌فرض‌های لینوکس

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

به همین دلیل تنها بالا بردن اعداد برای یک کلاینت پایگاه داده چیزی را تغییر نمی‌دهد. کتابخانه کلاینت یا برنامه باید مکانیزم را فعال کند، و جایی که پشته کنترل‌های هر اتصال را ارائه می‌دهد، تنظیم محدود بهتر از تغییر برای کل میزبان است که سرویس‌های نامرتبط را تحت تأثیر می‌گذارد.

فاصله تا نخستین کاوشگر هم مهلت پرس‌وجو نیست. اتصال سالم بین کاوشگرها آرام می‌ماند و همتای مرده بر اساس فاصله و تعداد کاوشگرها شناخته می‌شود. خواندن این سه مقدار به‌عنوان یک مهلت به تنظیماتی می‌رسد که خطا را یا بسیار دیر یا بسیار شتاب‌زده تشخیص می‌دهند. آن‌ها تشخیص را کنترل می‌کنند، نه شکیبایی برنامه را.

EXPIRE_TIME یک تنظیم پایگاه داده است نه اصلاح شبکه

Oracle Net مکانیزم زنده‌بودن خودش را ارائه می‌دهد که در پروفایل مؤثر فرایند پیکربندی می‌شود، نه در فایلی دلخواه که تصادفاً نامی مشابه دارد. مقدار بر حسب دقیقه بیان می‌شود.

SQLNET.EXPIRE_TIME = 5

هدف اصلی آن تشخیص اتصال‌های مرده در سمت سرور است و روی پلتفرم‌هایی که مدل بهبودیافته را پشتیبانی می‌کنند رفتار TCP keepalive را نیز برای آن اتصال‌ها تنظیم می‌کند. این ویژگی مفیدی است: لایه پایگاه داده می‌تواند کاوشگرها را ترتیب دهد بدون اینکه از برنامه کلاینت بخواهد تغییر کند.

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

فاصله آرام را بیازمایید، سپس بازیابی را برنامه‌ریزی کنید

یک اتصال مجاز تازه را از دوره‌ای آرام‌تر از مهلتی که می‌کوشید شکستش دهید عبور دهید و ترافیک زنده‌بودن و نتیجه برنامه را ببینید. محتوای بار مفیدی را که لازم ندارید ضبط نکنید؛ زمان‌سنج‌ها و وضعیت اتصال به پرسش پاسخ می‌دهند.

ss -tio dst 10.60.4.20
# after the quiet interval, same command
ls -l "$ORACLE_HOME/network/admin/sqlnet.ora"

اگر نشست همچنان ناپدید شد، مهلت به دستگاهی تعلق دارد که هنوز نپرسیده‌اید، یا سیاست سقف مطلق است. اگر دوام آورد، ثبت کنید کدام لایه تغییر کرد تا عملیات آرام بعدی بررسی را تکرار نکند.

در پایان تصمیم بگیرید وقتی اتصال واقعاً می‌افتد چه می‌شود، زیرا بررسی‌های زنده‌بودن فراوانی را کم می‌کنند و هرگز احتمال را از بین نمی‌برند. نتیجه ثبت‌شده عملیات پایگاه داده را پیش از ارسال دوباره روشن کنید: از دست رفتن پاسخ چیزی را درباره تأییدشدن کار اثبات نمی‌کند. برای هر چیزی که باید بسته‌شدن لپ‌تاپ یا راه‌اندازی دوباره تونل را دوام بیاورد، کاری متعلق به سرور با نتیجه پایدار طراحی قوی‌تری است و keepalive یک زمان‌بند نیست.

مقالات مرتبط