پرش به محتویات

خروجی‌های تنبل (lazy) و نگه‌داشتن بهترین‌ها (keep top)

همهٔ قابلیت‌های هیدیفای

یک خروجی تنبل ("lazy": true) از ابتدا در پیکربندی، در گروه‌هایش و در فهرست برنامه هست، اما هسته فقط تنظیماتش را نگه می‌دارد: خروجی واقعی وقتی ساخته می‌شود که اولین اتصال یا تست از آن بگذرد، و وقتی چیزی از آن استفاده نمی‌کند دوباره بسته می‌شود. keep top (experimental.monitoring.keep_top) فقط از سریع‌ترین چند خروجی تنبل استفاده می‌کند و بقیه را در حال استراحت می‌گذارد؛ پس یک پروفایل با صدها پروکسی به اندازهٔ همان چند پروکسیِ در حال استفاده حافظه می‌گیرد.

چرا از آن استفاده کنیم

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

چطور از فیلترینگ عبور می‌کند

خودش عبور نمی‌دهد. فقط تعیین می‌کند کدام خروجی‌ها وجود داشته باشند و از کدام‌ها استفاده شود.

چطور کار می‌کند

خروجی‌های تنبل

  • خروجی از ابتدا با تگ خودش هست. نوع آن نوع خروجی واقعی است و detourهایش معلوم است، پس گروه‌ها و پایش با آن مثل هر خروجی دیگری رفتار می‌کنند.
  • اولین اتصال یا تست، خروجی واقعی را می‌سازد و راه می‌اندازد. هر استفاده‌ای شمرده می‌شود: هر اتصال تا وقتی بسته شود، و یک تست URL در طول همهٔ اتصال‌هایش.
  • وقتی آخرین اتصال بسته شود، خروجی واقعی ۳۰ ثانیه برای اتصال بعدیِ همان مرور می‌ماند و بعد بسته می‌شود. پس از تست بلافاصله بسته می‌شود؛ پس تست یک پروفایل کامل همان تعداد خروجی را ساخته نگه می‌دارد که هم‌زمان تست می‌شوند (workers پایش، ۱۰).
  • هیچ‌وقت زیر یک اتصال بسته نمی‌شود.
  • اگر خروجی واقعی ساخته نشود (تنظیماتش اشتباه است)، اتصال با همان خطا ناموفق می‌شود، خروجی با دلیلش «ناموفق» نشان داده می‌شود و پس از ۳۰ ثانیه دوباره امتحان می‌شود.
  • بارگذاری مجدد (hot reload) به خروجی تنبلِ تغییرنکرده دست نمی‌زند و خروجی تغییرکرده را جایگزین می‌کند.
  • گروه‌ها، direct، block و endpointها (WireGuard، WARP و ...) هرگز تنبل نیستند؛ این گزینه روی گروه، direct و block نادیده گرفته می‌شود و endpointها آن را ندارند.

keep top

  • فقط خروجی‌های تنبل را مدیریت می‌کند. آن‌هایی که استفاده نمی‌شوند استراحت می‌کنند: چرخه‌ها تستشان نمی‌کنند و هیچ متعادل‌کننده‌ای نتیجه‌شان را نمی‌بیند، پس چیزی از آن‌ها عبور نمی‌کند و هرگز ساخته نمی‌شوند. برنامه هنوز آن‌ها را با آخرین پینگشان می‌بیند.
  • سریع‌ترین‌ها را چندتا چندتا پیدا می‌کند، هر بار یک مرحله: بهترین count خروجیِ پیداشده تا این‌جا، به‌اضافهٔ batch خروجی بعدی که هنوز تست نشده‌اند. با رسیدن هر پینگ، خروجی‌ای که پاسخ نمی‌دهد یا برای بهترین‌ها کند است به استراحت برمی‌گردد و خروجی بعدی جایش را در دسته می‌گیرد؛ پس پروکسی‌ای که تا آخر مهلتش طول می‌کشد بقیه را معطل نمی‌کند.
  • ترتیب همان ترتیب چرخه‌های پایش است: بر اساس آخرین پینگ، سریع‌ترین اول، خروجی‌های هرگز تست‌نشده یکی در میان، و ناموفق‌ها آخر. میان ناموفق‌ها، آن‌هایی که زمانی پاسخ داده‌اند اول می‌آیند. پینگ‌های اجرای قبل در فایل کش هست، پس اجرای بعد با سریع‌ترین‌های این اجرا شروع می‌کند.
  • با quick، انتخاب وقتی تمام می‌شود که خروجی‌های مانده در آخرین تستشان (در ۲۴ ساعت گذشته) کندتر از پیداشده‌ها بوده باشند. وگرنه وقتی تمام می‌شود که همه تست شده باشند.
  • خروجی‌ای که در یک selector انتخاب شده، و خروجی‌های فهرست pinned، همیشه استفاده می‌شوند، با هر پینگی، کنار count خروجیِ سریع‌تر. انتخاب یا سنجاق کردن خروجی‌ای که در استراحت است آن را از استراحت درمی‌آورد و تست می‌کند.
  • خروجی‌ای که به استراحت می‌رود اتصال‌هایش را تا پایانشان نگه می‌دارد.
  • وقتی همهٔ نگه‌داشته‌شده‌ها timeout شوند، انتخاب تازه‌ای دوباره از میان همه می‌گذرد؛ آن‌هایی که پاسخ می‌دهند در این مدت در استفاده می‌مانند. وقتی هیچ‌کدام پاسخ ندهد، پس از ۳۰ ثانیه و بعد ۱، ۲، ۴ و حداکثر ۵ دقیقه دوباره می‌گذرد، و به محض این‌که یکی از خروجی‌های در استفاده پاسخ دهد ادامه می‌دهد (پس از تغییر شبکه، پایش آن‌ها را دوباره تست می‌کند).
  • خروجیِ نگه‌داشته وقتی «بی‌پاسخ» حساب می‌شود که دو تست پشت سر هم ناموفق باشد: پس از اولین تست ناموفق، ۵ ثانیه بعد یک بار دیگر تست می‌شود، تا یک تست ازدست‌رفته جایش را از او نگیرد.
  • با count، خروجیِ نگه‌داشته‌ای که دیگر پاسخ نمی‌دهد جایگزین می‌شود: انتخابی که فقط جای خالی را پر می‌کند پاسخ‌دهنده‌ها را نگه می‌دارد، خروجی‌های در استراحت را به ترتیب آخرین پینگشان تست می‌کند و به محض این‌که count خروجی پاسخ بدهند تمام می‌شود. با answering، خروجی‌ای که پاسخ نمی‌دهد به استراحت می‌رود.
  • تا وقتی کمتر از حد مجاز نگه داشته شده (count، یا با answering همه) و خروجی‌های دیگری در استراحت‌اند، خروجی‌های در استراحت ۱۰ دقیقه پس از آخرین بار دوباره تست می‌شوند، بعد ۳۰ دقیقه، بعد ۱، ۲، ۴ و هر ۶ ساعت تا وقتی هیچ‌کدام پاسخ ندهد؛ با پاسخ‌دادن یکی، فاصله دوباره ۱۰ دقیقه می‌شود. خروجی‌های در استفاده برای این کار تست نمی‌شوند.
  • خروجیِ در استراحتی که به تستی با تگ خودش پاسخ بدهد (کاربر فهرست را تست می‌کند)، اگر جا باشد، همان لحظه به استفاده برمی‌گردد.
  • خروجی‌ای که ۳۰ ثانیه پس از شروع مرحله‌اش نتیجه ندارد «بی‌پاسخ» حساب می‌شود (برای دسته‌های بزرگ‌تر از ۱۰، به ازای هر ۱۰ خروجی ۱۰ ثانیه بیشتر).
  • بارگذاری مجدد تا وقتی نگه‌داشته‌شده‌ها تغییر نکرده‌اند انتخاب را نگه می‌دارد؛ خروجیِ جایگزین‌شده یا حذف‌شده انتخاب تازه‌ای شروع می‌کند که پاسخ‌دهنده‌ها را نگه می‌دارد. خودِ تنظیمات keep_top را هم می‌توان با بارگذاری مجدد تغییر داد، اضافه یا حذف کرد.
  • تستِ یک گروه، اعضای در استفاده را تست می‌کند. تستِ یک خروجی با تگ خودش در حال استراحت هم اجرا می‌شود.
  • وقتی تعداد خروجی‌های تنبل از count بیشتر نیست و answering و countries هم تنظیم نشده، چیزی استراحت نمی‌کند.

خط‌های لاگ با KEEP TOP شروع می‌شوند.

پیکربندی

{
  "outbounds": [
    {"type": "vless", "tag": "p1", "lazy": true, "server": "..."},
    {"type": "trojan", "tag": "p2", "lazy": true, "server": "..."},
    {"type": "balancer", "tag": "lowest", "strategy": "lowest-delay", "outbounds": ["p1", "p2"]},
    {"type": "selector", "tag": "select", "outbounds": ["lowest", "p1", "p2"]}
  ],
  "experimental": {
    "monitoring": {
      "keep_top": {
        "count": 3,
        "batch": 10,
        "quick": true
      }
    }
  }
}
فیلد خروجی: | فیلد | نوع | پیش‌فرض | معنی | |---|---|---|---| | `lazy` | bool | `false` | خروجی با اولین استفاده ساخته و در بی‌کاری بسته می‌شود. | `experimental.monitoring.keep_top`: | فیلد | نوع | پیش‌فرض | معنی | |---|---|---|---| | `count` | int | `0` | چند خروجی تنبل در استفاده بماند: سریع‌ترین‌ها. `0` همراه با `answering` یا `countries` یعنی همهٔ آن‌هایی که با آن شرط‌ها جور باشند. | | `answering` | bool | `false` | هر خروجی تنبلی که پاسخ می‌دهد نگه داشته می‌شود و آن‌که دیگر پاسخ ندهد به استراحت می‌رود. `count` به کار نمی‌رود. | | `countries` | list of strings | | فقط خروجی‌هایی که خروجشان در یکی از این کشورهاست (کد دوحرفی)، بر اساس جست‌وجوی IP در تست، یا پیش از آن بر اساس پرچمِ داخل تگ. | | `batch` | int | `10` | هر بار چند خروجی، کنار بهترین‌های تا این‌جا، تست شود. کمتر از `0`: همه با هم. | | `quick` | bool | `false` | انتخاب وقتی تمام شود که خروجی‌های مانده در آخرین تستشان کندتر از پیداشده‌ها بوده‌اند. | | `pinned` | list of strings | | تگ خروجی‌های تنبلی که با هر پینگی همیشه در استفاده می‌مانند، مثل خروجیِ انتخاب‌شده در selector. | ## نکته‌ها - برای انتخاب خودکار از متعادل‌کننده استفاده کنید. گروه `urltest` اعضایش را خودش تست می‌کند و نمی‌داند کدام در استراحت‌اند. - خروجی‌ای را که برای کار کردن زمان زیادی لازم دارد (Psiphon، Tor، تونل‌های DNS) تنبل نکنید: با هر استفاده از نو شروع می‌کند. - بدون `keep_top`، خروجی‌های تنبل مثل بقیه در چرخه‌ها تست می‌شوند: هر کدام برای تستش ساخته و پس از آن بسته می‌شود. ## همچنین ببینید - [پایش](monitoring.md) - [متعادل‌کننده](balancer.md) *[HTML]: Hyper Text Markup Language *[W3C]: World Wide Web Consortium
اخرین بروزرسانی: 13 نوامبر 2026

نظرات