-
Notifications
You must be signed in to change notification settings - Fork 106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
راه حل موقت برای رفع مشکل کندی و پر شدن رم و سی پی یو #173
Comments
ممنون از اینکه وقت گزاشتید و کامل توضیح دادین با جزیات ؛ من با اجازتون اینو داکیومنت میکنم و اضافه میکنم در صفحه اصلی البته این نکته رو هم بگم که haproxy در حالت مالتی پورت خیلی بعیده کار کنه و اگرم قرار باشه کار کنه ستاپ کردنش پیچیده هست |
خواهش میکنم . حتما قرار بدید که همه استفاده کنن
درسته من خودم چون از این استفاده نمیکنم اصلا یادم نبود . البته فکر کنم haproxy این امکان رو داره که به یک range لسن کنه ولی پیاده سازیش یکم سخت میشه و نیاز داره که با lua براش یکم کد زد و به haproxy فهموند دقیقا چطوری انتقال بده به RTT |
سلام وقت بخیر دوست گلم |
طبق این لاگ ؛ به نظرم با تغییر sni مشکلتون حل میشه |
اگر از haproxy استفاده نمیکنید دستوری که دارید برای سرور ایران استفاده میکنید اشتباه هست
دقت کنید که پورت 443 باید باز باشه . اگر از ufw استفاده میکنید با دستور زیر میشه باز کرد :
برای اینکه مطمئن بشید پورت باز هست وارد ادرس زیر بشید و ایپی سرور ایران وارد کنید و پورت 443 وارد کنید باید سبز نشون بده |
سلام آقای اکرمی وقت شما بخیر |
اپدیت به زودی منتشر میشه ؛ بعد اپدیت میام مشکلات رو برسی میکنیم دقیق تر |
سلام مهندس روز بخیر |
سلام لطفا نسخه جدید هم این رو تست کنید اگه هنوز مشکل پابرجا بگید |
مهندس این رو وقت کردی یه تست بزن با haproxy من با نسخه 6.1 هم تست کردم درست نشده هنوز |
سلام شرمنده اگه سوالام گاهی مبتدی هستن ، چون خیلی از لینوکس و مسائل مربوط بهش سردرنمیارم. |
انجام این روش برای پنل خیلی دردسر داره و شاید نشدنی باشه |
مهندس جان سلام خسته نباشی دیدم نسخه 6.2 رو منتشر کردید گفتم با اینم تست کنم ولی مشکل همچنان هست . |
سلام بله سر فرصت تستش میکنم متاسفانه تا قبل از این خیلی با گوست کار میکردم و از haproxy استفاده زیادی نداشتم، میرم سروقتش حتما |
سلام مهندس خسته نباشی |
سلام امروز حتما میرم سروقتش ، البته انگار haproxy به جز nat کردن داره یه حرکتایی میزنه ولیلی دقیق ترشو میفهمم که چه اتفاقی داره میفته لطفا کامند هایی که (رو haproxy ( تست کردین و جواب ندادو خیلی ساده لیست کنین اگه وقت داشتین... تشکر |
کامند خاصی نبوده همون فایل کانفیگ که در بالا قرار دادم تنها نکتش این هست که باید mode روی tcp باشه که RTT بتونه کار کنه این خطای close رو اگر یه بررسی کنید شاید به نتیجه برسه که چرا رخ میده |
اوکی من الان میرم اینو تست میکنم ببینم چیزی میفهمم یا نه ؛ نتیجه رو همینجا میگم |
دلیلشو فهمیدم ؛ چون که haproxy با ایپی 127.0.0.1 ارتباط میگیره با RTT و خود RTT از طریق یه جدول ایپی تمایز میکنه کاربر و peer را و خوب وقتی با haproxy کانکت میشیم ؛ هم کاربر هم سرور خارج با ایپی 127.0.0.1 میرسن به RTT و به همین دیلی توی تشخیص کاربر یا سرور دچار مشکل میشه درمورد راه حلش باید پیاده سازی رو تغییر داد و جای فکر داره ؛ اما به هر حال الان به نظرم مشکل cpu حل شده از نسخه 6 و مصرف به شکل قابل توجهی کاهش داشته اما هنوز مالتی کور نیست ... |
درسته ممنون از پیگیری شما |
درسته ولی ارتباط خارج روی پورت های ۴۴۳ دریافت نمیشه و این از لحاظ امنیت پوئن منفی محسوب میشه ؛ به نظرم خود RTT مالتی ترد باشه خیلی بهتر از اینه هست که با haproxy درستش کنیم چون یه برنامه واسطه کمتر میشه و ۲ تا تونل داخلی در نتیجه کمتر میشه ؛ و پینگ و سرعت خیلی بهتری میشه بدست اورد حتی اگه تصور کنیم واسطه ی ما که haproxy یا حتی gost باشه کاملا ایده ال پیدا سازی شده باشه |
اره این که 100 درصد حرف شما درست هست |
درود فراوان
|
البته اینم بگم که حتی میشه از ایپی های واقعی استفاده کرد و به جای 127 از ایپی خود درخواست کننده استفاده کنه |
سلام آقای اکرمی وقت بخیر بنظر شما مشکل کار کجاست؟ |
اینطوری که من متوجه شدم کانکشن پیادار نیست و قبل از اینکه tls handshake انجام بده داره close میشه |
مهندس این وقت کردید لطفا تست کنید که اگر اوکی هست من هم اموزش رو اپدیت کنم و هم یه ابزار درست کنم راحت خودش ایپی سرور ایران و خارج رو بگیره کد مناسب رو تولید کنه براشون که راحت هر کس خواست استفاده کنه |
سلام من متن پیامو خوندم، حرکت خیلی جالبی هست نمیدونستم میشه با ها پروکسی اینکارو هم کرد، و به نظرم بدون تست میشه گفت که اوکیه و کار میکنه چون مشکل همین ایپی ها و یکی بودنشون بود . و لطف میکنید وقت بزارید اموزشو در یه ایشیو جدید ببان کنید و من در داک اضافه میکنم، ممنون ازتون که وقت میزارید البته اینو من سر فرصت تست میکنم خودم ولی اگه خودتون جواب گرفتین پس 100 درصد اوکیه |
چشم حتما امشب درست میکنم |
سلام آقای اکرمی وقت بخیر |
سلام آقای اکرمی وقت شما بخیر |
اگر درست انجام داده باشید باید کار کنه چون من تست کردم اوکی بود |
سلام عرض ادب وقت شما بخیر کد ها هم بخش بهینه سازی رو کاملا انجام میدم و بعد از تست عدد 1048576 دریافت میکنم بعدش HaProxy رو نصب میکنم و با استفاده از کد زیر آیپی خارجمو داخل کد قرار میدم و وارد بخش کانفیگ برنامه Haproxy میکنم بعدش هم میشه تنظیم RTT اگر ممکنه ابزاری برای تنظیم این موارد طراحی کنین هزینش رو بنده پرداخت میکنم |
یه راه حل جدید بهتون میگم انجام بدید تست کنید
این مرحله خیلی مهم هست و با دقت بخونید
حالا باید یه تغییر کوچیک توی RTT هم بدیم . در تمامی 4 RTT که تعریف کردید تنظیم تمام . الان باید بتونید وصل بشید تست کنید اگر کار نکرد یا خطا داد حتما عکس از خطا با توضیحات کامل ارسال کنید که سریع تر بتونیم مشکل رو حل کنیم |
سرور خارج اصلا مهم نیست . فقط ایران مهمه |
در پیام قبلی اشتباه نوشتم خارج . منظورم تمامی کد هایی بود که در سرور ایران زدید |
سلام عرض ادب وقت شما بخیر |
2 تا مشکل الان هست
نکته دوم اینکه شما 4 تا رول تعریف کردید ولی فقط 1 RTT اجرا کردید |
سلام مجدد وقت بخیر در مورد اجرا کردن فقط 1 RTT من هر 4 RTT رو اجرا کردم اما بازم متصل نشد لاگ سرور خارج: ببخشید مشکل نمیتونه از این باشه که موقع وارد کردن رول های فایروال بنده فقط tcp رو وارد میکنم کانفیگ من Vless + ws هستش نیازی به وارد کردن رول UDP هستش؟ |
نه مشکل از udp نیست چون vless کلا روی tcp هست |
مشکلی نداره تلگرام خدمتتون پیام ارسال میکنم چشم |
سلام آقامهدی وقت بخیر |
سلام جناب بنده یه چیزی رو متوجه نشدم متاسفانه الان کد هایی که گذاشتین برای هسته ایکس ری هست یا سینگ باکس؟و اینکه پنلم مرزبان و روی سرور ایران چیزی نصب ندارم نباید مشکلی پیش بیاد؟ |
سلام |
سلام وقت بخیر |
سلام مهدی جان خوبی؟ میشه ازت بخوام تلگرام آنلاین بشی؟ یک کار خیلی واجب باهات دارم |
سلام دوستان
کسانی که تعداد کاربر خیلی بالایی دارن احتمالا به مشکل بخورن توی هندل کردن درخواست ها
البته طبق تست هایی که داشتم این داستان زیاد ربطی به RTT نداره . هرچند شاید بشه تا بهینه کردن کد ها و اضافه شدن Multithreading به RTT این مشکل رو حل کرد ولی بازم من مطمئن هستم که به مشکل میخوره
بزارید کامل براتون توضیح بدم که متوجه بشید چرا بازم به مشکل میخوره
با توجه به اینکه بنده دانش فنی و تسلط کافی در بحث لینوکس و شبکه رو ندارم ممکن هست بعضی از گفته های بنده اشتباه باشه که پیشاپیش از شما معذرت میخوام و از اساتید محترم میخوام که بنده رو اصلاح کنن و مشکلات رو بگید که ویرایش کنم
اگر حوصله ندارید و کلا براتون مهم نیست که درک کنید مشکل چیه و چطوری حل میشه مقدمه رو نخونید .مستقیم برید راه حل رو بخونید
تمامی کد های زیر رو باید در سرور ایران اجرا کنید . البته بخش بهینه سازی رو میتونید در سرور خارج هم اجرا کنید
مقدمه و درک مشکل
من خودم از sing-box استفاده میکنم . حالت Multithreading همین الان هم داخل ساین باکس هست
یعنی شما 1 بار ساین باکس رو اجرا میکنی ولی اون خودش میاد چندین پراسس دیگه که میشه child process رو اجرا میکنه
چرا این کار رو میکنه ؟ برای اینکه بتونه بهتر مدیریت کنه درخواست ها رو و درخواست های ورودی رو بین چندین پراسس پخش میکنه تا هندل بشن و مثلا اگر شما 2 تا هسته داری از توان هر 2 هسته cpu شما استفاده بشه
حالا چرا برنامه ها از حالت Multithreading پشتیبانی نمیکنن ؟ چون پیاده سازی همچین چیزی به این راحتی ها نیست و مدیریت کردن انجام شدن درخواست ها به صورت موازی یکم پیچیده هست که از دانش من هم خارج هست صرفا طبق چیز هایی که مطالعه کردم میدونم که سخت هست
خب گفتیم که ساین باکس برای هندل کردن درخواست ها از چندین ترد که ایجاد کرده استفاده میکنه ولی بازم وقتی تعداد درخواست بالا میره به مشکل میخوره ساین باکس و نمیتونه مدیریت کنه
اینکه چرا اینطوری میشه رو من دقیق نمیدونم شاید به خاطر این باشه که سیستم عامل بهش اجازه نمیده و یا محدودیت های نرم افزاری باشه یا چیز های دیگه
در هر صورت من این راه حل به ذهنم رسید که بیام و به جای 1 ساین باکس چندین ساین باکس اجرا کنم و درخواست ها رو بین اینا پخش کنم
حالا شما فرض کن خود ساین باکس هم ترد داره و اینطوری شما یه لود بالانس دستی درست کردی که یه تعداد زیادی ترد اماده هستن به درخواست های شما جواب بدن :)
اینم بگم که این روش به این خاطر به ذهن من رسید که دیدم درصد استفاده از منابع سرور اصلا بالا نرفتن ولی وقتی درخواست ها زیاد میشه ساین باکس دیگه جواب نمیده . اینجا خب فکر کردم شاید محدودیت نرم افزاری باشه و اگر چند تا ساین باکس اجرا کنیم مشکل حل بشه که همین طور هم شد
سرور من 8 گیگ رم و 2 تا هسته فرکانس 5.7 داره که به این راحتی پر نمیشه ولی جالب بود که با این همه منابع بازم ساین باکس به مشکل میخورد
این نشون میده که کد هاش یا بهینه نیست یا درست نمیتونه از منابع سیستم استفاده کنه
حالا شاید بگید چطوری فهمیدم که مشکل از RTT نیست و از ساین باکس هست ؟
من اومدم یک socks داخل ساین باکس تعریف کردم روی پورت مثلا 1080 روی 127 تا تست کنم اصلا ساین باکس میتونه به درخواست های داخلی جواب بده یا نه . چ برسه به درخواست هایی که از سرور ایران براش میاد
بعدش کد زیر رو برای تست اجرا کردم
که خب تایم اوت میخورد
این یعنی ساین باکس اصلا توان هندل یه درخواست داخلی هم نداشت و مشکل از RTT نیست
پس بهترین کار این هست که چند تا ساین باکس اجرا کنیم و یه طوری حل کنیم این مشکل رو
حالا این راه حل رو میشه برای بقیه برنامه ها هم زد . مثل RTT یا هر چیز دیگه
برای درک بهتر به عکس بالا دقت کنید که . بخش سفید رنگ ساین باکس هست که ران شده و اون سبز ها ترد هاش هستن
حالا عکس زیر رو دقت کنید
این عکس هم مربوط به RTT هست که همین طور که مشاهده میکنید چون هنوز از ترد پشتیبانی نمیکنه هیچ تردی نداره و خودش همه درخواست ها رو با استفاده از 1 هسته cpu هندل میکنه . یعنی ممکن هست شما 4 تا هسته داشته باشی ولی RTT فقط از 1 هسته cpu شما استفاده میکنه
اینطوری همه فشار روی 1 هسته هست و از تمام توان cpu شما استفاده نمیشه
حالا فرض کنیم که RTT اپدیت بده و مثل ساین باکس ترد بهش اضافه بشه . به احتمال زیاد مشکل به صورت موقت حل میشه ولی امکان داره اون مشکل که برای ساین باکس گفتم برای RTT هم پیش بیاد یعنی حتی با وجود ترد امکان داره که درخواست ها بازم در ابعاد بالا به مشکل بخورن
پس این راه حل که میگم میتونه یه راه حل خوبی باشه که شما بتونی تعداد کاربر بالا رو با این روش هندل کنید و کاربران هم به مشکل نخورن
راه حل
خب بریم سراغ راه حل . چیزی که من به ذهنم اومد این بود که RTT رو چندین بار اجرا کنیم تا اینطوری خودمون دستی حالت ترد رو پیاده سازی کرده باشیم
ولی خب یه مشکلی که پیش میاد این هست که چندین برنامه نمیتونن به صورت هم زمان از یک پورت مثلا 443 استفاده کنن
یعنی فرض کن شما توی سرور ایران به RTT گفتی که به 443 لسن کنه وقتی بخوای 4 تا RTT اجرا کنی دیگه نمیشه هر 4 تا از 443 لسن کنن و هر RTT باید از یک پورت جدا لسن کنه
که اینجا برای حل این مشکل از haprpxy استفاده میکنیم . این haproxy یه برنامه قوی برای درست کردن لود بالانس هست .
حالا این یعنی چی ؟
شما فرض کن من میخوام RTT رو 4 بار اجرا کنم . میام این 4 تا رو روی پورت های مختلف اجرا میکنم . مثلا پورت های زیر :
1010
2020
3030
4040
بعدش به haproxy میگم تو روی 443 لسن کن و هر درخواستی که به 443 اومده بین این 4 تا RTT پخش کن . به همین سادگی !
خب شاید بگید که الان مشکل RTT و ساین باکس برای haproxy چرا پیش نمیاد ؟ یعنی ممکن هست این وسط haproxy هم هنگ کنه و نتونه درخواست ها رو هندل کنه ولی خب اینطوری نیست چون haproxy یه برنامه قدیمی هست که اصلا کارش مدیریت کردن تعداد درخواست بالا هست و ساخته شده برای اینکار و طوری طراحی شده که کم نمیاره
بهینه سازی سرور
قبل از اینکه شروع کنیم چند تا کد زیر رو اجرا کنید که بتونید از تمامی توان نرم افزاری و سخت افزاری سرور استفاده کنید چون پیشفرض خیلی از چیز ها محدود هست . اگر نیاز بود بگید توضیح بدم که کد های زیر دقیقا چیکار میکنن ولی یه توضیح کوچیک زیر هر کدوم میدم .
پیاده سازی haproxy
کد بالا چند تا پارامتر مهم داره .
پارامتر nbthread تعداد ترد هایی هست که haproxy ایجاد میکنه تا بتونه درخواست ها رو جواب بده . بهتر هست مقدارش با تعداد هسته cpu هایی که دارید یکسان باشه . مثلا اگر 2 هسته دارید این هم 2 قرار بدید
پارامتر cpu-map هم مشخص میکنه هر ترد به کدوم هسته از cpu متصل بشه در پارامتر قبلی چون 2 تا ترد تنظیم کردیم پس 2 تا مپ هم میکنیم یعنی میگیم ترد 1 رو به هسته 0 متصل کن و ترد 2 رو به هسته 1 . سیستم عامل هسته ها رو از 0 شروع میکنه
پارامتر maxconn خیلی مهم هست . این رو بر اساس توان شبکه و سرور خودتون کم و زیاد کنید . من قرار دادم که به 500 هزار درخواست بتونه جواب بده . که تعداد خیلی بالایی هست. شما میتونید این مقدار رو کم یا زیاد کنید ولی پیشنهاد میکنیم همون 500 بزارید باشه .
شاید بگید اگر از 500 هزار تا بیشتر شد چیکار میکنه ؟ سادش میشه اینکه میاد درخواست ها رو داخل pool قرار میده یعنی یه delay ایجاد میشه تا وقتی که درخواست های قبلی انجام بشن و فضا برای انجام درخواست های جدید باز بشه . یه حالت صف تشکیل میده
یه بخش bind هم داره که گفیتم به پورت 443 گوش بده و در خط های بعدی هم اومدیم RTT ها رو اضافه کردیم که من 4 تا اضافه کردم شما میتونید بیشتر اضافه کنید
نکته جالب اینکه میتونید بهش بگید درخواست ها رو فقط به RTT هایی ارسال کنه که up هستن یعنی اگر یک RTT به هر دلیلی براش مشکل پیش بیاد درخواست رو به RTT های دیگه ارسال میکنه . دقت کنید یه 2s زدم یعنی هر 2 ثانیه چک کنید این RTT کار میکنه یا نه اگر کار نکنه برای یه مدت از لیست حذفش میکنه و درخواست رو به RTT های دیگه ارسال میکنه
خوبی این مورد برای وقتی هست که شما RTT ها رو ری استارت کردید و برای چند لحظه کوچیک درخواست ها drop میشن و کاربر لگ میخوره ولی با این قابلیت تا حد زیادی این لگ رفع میشه
به این نکته هم دقت کنید که در ادامه ما تنظیم میکنیم که سرویس RTT هر یه مدت ری استارت بشه تا مشکل رم که پرم میشه حل بشه
حالا اینجا یه مشکل پیش میاد . اگر ما هر 4 تا RTT رو هم زمان ری استارت کنیم پس 4 تا RTT که تنظیم کردیم down میشن و درخواست ها drop میشن برای چند لحظه
پس باید هر RTT رو با یک فاصله زمانی متفاوت ری استارت کنید تا همیشه حداقل یک RTT وجود داشته باشه که به درخواست ها جواب بده
اگر یک RTT ری استارت بشه خود haproxy میاد کاربران قدیمی رو به RTT بعدی منتقل میکنه . خیلی زیباست مگه نه ؟
تنظیم RTT ها
خب الان وقت این هست که RTT ها رو هم تنظیم کنیم که مثلا 4 تا RTT اجرا کنیم روی پورت های مختلف . برای اینکار اول از همه برید اگر از قبل RTT رو به صورت سرویس اجرا کردید خاموش کنید و سرویس رو disable کنید تا تداخل ایجاد نشه و پورت 443 رو اشغال نکنه
حالا کد زیر رو که مخصوص اجرای 4 تا RTT هست اجرا کنید . متناسب با نیاز خودتون میتونید تعداد بیشتری از RTT اجرا کنید کافی هست پورت رو تغییر بدید و RTT جدید رو هم به haproxy اضافه کنید
یادتون نره که مقدار sni , password رو متناسب با نیاز خودتون تغییر بدید !
در کد های زیر در داخل سرویس من از پارامتر RuntimeMaxSec برای ری استارت خودکار RTT استفاده کردم که باید به ثانیه بهش مقدار بدید و مشخص میکنه سرویس بعد از چند ثانیه ری استارت بشه . و من 3600 رو دادم یعنی 1 ساعت ولی برای سرویس بعدی 100 ثانیه بهش اضافه کردم همون طور که توضیح دادم باید برای ری استارت یه فاصله ایجاد کنید که همه RTT ها با هم ری استارت نشن پس من هر سرویس رو تنظیم کردم که با فاصله 100 ثانیه ری استارت بشه .
خب الان باید همه چیز بدون مشکل کار کنه . اگر مشکلی بود حتما بگید . اگر راه حل دیگه ای هم سراغ دارید حتما بگید
نکته مهم
یه نکته بگم و تاکید کنم باز که من اصلا با RTT مشکل رم و سی پی یو ندارم و این مشکل روفقط با هسته های xray و sing-box داشتم و این راه حل رو روی اونا پیاده کرده بودم و جواب گرفتم . ولی چون یه تعداد گفتن که RTT رم رو اشغال میکنه راه حل رو برای RTT در کد های بالا قرار دادم
ولی شما میتونید همین راه حل رو برای هسته هایی مثل ساین باکس هم پیاده سازی کنید که خیلی تاثیر داره
The text was updated successfully, but these errors were encountered: