خروجیهای تنبل (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 شروع میشوند.