کنترل پهنای باند در لینوکس با Trickle
موضوعاتی که در این مقاله به آنها پرداخته خواهد شد، به شرح زیر است:
کنترل پهنای باند در لینوکس با استفاده از Trickle
کنترل پهنای باند در لینوکس با Trickle، آیا تا به حال با موقعیتهایی مواجه شدهاید که یک برنامه تمام پهنای باند شبکه شما را اشغال کرده باشد؟ اگر در شرایطی بودهاید که یک برنامه تمامی ترافیک شما را مصرف کرده باشد، اهمیت ابزار تنظیمکننده پهنای باند Trickle را درک خواهید کرد.
در آموزش کنترل پهنای باند در لینوکس با استفاده از Trickleچه شما یک مدیر سیستم باشید و چه یک کاربر عادی لینوکس، باید یاد بگیرید چگونه سرعتهای بارگذاری و بارگیری برنامهها را کنترل کنید تا اطمینان حاصل کنید که پهنای باند شبکه شما به وسیله یک برنامه واحد مصرف نشود.
کنترل پهنای باند در لینوکس با استفاده از Trickle: ابزاری برای مدیریت پهنای باند برنامهها
Trickle یک ابزار تنظیمکننده پهنای باند شبکه است که به ما امکان میدهد سرعتهای بارگذاری و بارگیری برنامهها را مدیریت کنیم تا از اشغال تمامی (یا اکثر) پهنای باند موجود توسط یک برنامه واحد جلوگیری کنیم.
به عبارت دیگر، Trickle به شما اجازه میدهد نرخ ترافیک شبکه را به صورت جداگانه برای هر برنامه کنترل کنید، برخلاف کنترلهای سطح کاربر که نمونه کلاسیک تنظیم پهنای باند در محیطهای کلاینت-سرور است و احتمالاً با آن آشنا هستیم.
نحوه کار Trickle و مدیریت پهنای باند در لینوکس
علاوه بر کنترل پهنای باند، Trickle به ما امکان میدهد اولویتهایی را برای هر برنامه به صورت جداگانه تعریف کنیم. به این ترتیب، وقتی محدودیتهای کلی برای کل سیستم تعیین شده است، برنامههای اولویتدار به طور خودکار پهنای باند بیشتری دریافت خواهند کرد.
برای انجام این کار، Trickle محدودیتهای ترافیک را بر اساس نحوه ارسال و دریافت دادهها از طریق سوکتهایی که از اتصالات TCP استفاده میکنند، اعمال میکند. باید توجه داشت که Trickle، به جز نرخ انتقال داده، رفتار فرآیندی که در حال مدیریت آن است را به هیچ وجه تغییر نمیدهد.
محدودیتهای Trickle در کنترل پهنای باند در لینوکس
تنها محدودیت Trickle این است که با برنامههای بهصورت ایستا لینک شده یا باینریهایی که بیتهای SUID یا SGID فعال دارند، کار نمیکند. دلیل این موضوع این است که Trickle از لینکدهی و بارگذاری پویا استفاده میکند تا خود را بین فرآیند کنترلشده و سوکت شبکه مربوطه قرار دهد. Trickle در این حالت بهعنوان یک پروکسی بین این دو جزء نرمافزاری عمل میکند.
از آنجا که برای اجرای Trickle نیاز به دسترسیهای مدیریتی (superuser) نیست، کاربران میتوانند محدودیتهای ترافیک خود را تنظیم کنند. با این حال، اگر این قابلیت نامطلوب باشد، میتوانیم محدودیتهای کلیای را تنظیم کنیم که کاربران سیستم قادر به تجاوز از آن نباشند. به عبارت دیگر، کاربران میتوانند نرخ ترافیک خود را مدیریت کنند، اما همیشه در چارچوبی که توسط مدیر سیستم تعیین شده است.
محیط تست: محدودسازی پهنای باند شبکه در سرور لینوکس با استفاده از Trickle
در این آموزش، نحوه محدود کردن پهنای باند شبکه مورد استفاده توسط برنامهها در یک سرور لینوکسی با استفاده از Trickle را توضیح خواهیم داد.
برای تولید ترافیک لازم، از ابزارهای `ncftpput` و `ncftpget` (هر دو ابزار با نصب بسته ncftp در دسترس هستند) در سمت کلاینت (سرور CentOS – dev1: 192.168.0.17) و از `vsftpd` در سمت سرور (Debian – dev2: 192.168.0.15) به عنوان سرور FTP برای اهداف نمایشی استفاده خواهیم کرد.
همین دستورالعملها برای توزیعهای مبتنی بر RHEL و Debian مانند Ubuntu و Linux Mint نیز کار میکنند.
آموزش نصب ncftp و vsftpd در توزیعهای لینوکسی مبتنی بر RedHat
۱. برای توزیعهای مبتنی بر RedHat، باید مخزن EPEL را فعال کنید. این مخزن شامل نرمافزارهای آزاد و منبعباز با کیفیت بالا است که توسط پروژه فدورا نگهداری میشود.
به منظور نصب EPEL در RHEL 9، دستور زیر را اجرا کنید:
sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
جهت نصب EPEL در CentOS 9، AlmaLinux 9 و Rocky Linux 9، دستور زیر را اجرا کنید:
sudo dnf config-manager --set-enabled crb sudo dnf install epel-release
به منظور نصب EPEL در RHEL 8، دستور زیر را اجرا کنید:
sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rp
برای نصب EPEL در CentOS 8، AlmaLinux 8 و Rocky Linux 8، دستور زیر را اجرا کنید:
sudo dnf config-manager --set-enabled powertools sudo dnf install epel-release
۲. سپس، ncftp را به صورت زیر نصب کنید:
sudo dnf install ncftp [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install ncftp [On Debian, Ubuntu and Mint]
۳. راهاندازی یک سرور FTP در یک سرور مجزا
اگرچه FTP به صورت ذاتی از لحاظ امنیتی ضعیف است، اما همچنان در مواردی که نیازی به امنیت بالا برای آپلود یا دانلود فایلها نیست، به طور گستردهای استفاده میشود.
در این آموزش، از FTP به عنوان نمونهای استفاده کردهایم تا قدرتهای ابزار trickle را به نمایش بگذاریم. دلیل استفاده از FTP این است که سرعت انتقال فایلها را به صورت خروجی استاندارد در سمت کلاینت نمایش میدهد. بحث درباره اینکه آیا FTP باید استفاده شود یا خیر، به فرصتی دیگر موکول میشود.
sudo dnf install vsftpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install vsftpd [On Debian, Ubuntu and Mint]
اکنون فایل پیکربندی سرور FTP را با دستور زیر ویرایش کنید. برای این کار، فایل /etc/vsftpd/vsftpd.conf را باز کرده و تنظیمات زیر را اعمال کنید:
$ sudo nano /etc/vsftpd/vsftpd.conf OR $ sudo nano /etc/vsftpd.conf
برای اعمال تغییرات زیر در فایل پیکربندی سرور FTP، مراحل زیر را دنبال کنید:
anonymous_enable=NO local_enable=YES chroot_local_user=YES allow_writeable_chroot=YES
پس از اعمال تغییرات در فایل پیکربندی، باید سرور FTP را برای session کنونی راهاندازی کرده و آن را برای شروع خودکار در بوتهای آینده فعال کنید. برای این کار دستورات زیر را اجرا کنید:
sudo systemctl start vsftpd sudo systemctl enable vsftpd sudo systemctl status vsftpd
توجه:
۴. اگر تصمیم دارید سرور FTP را در یک سیستم CentOS/RHEL با استفاده از کلیدهای SSH برای دسترسی از راه دور راهاندازی کنید، باید یک حساب کاربری محافظت شده با رمز عبور ایجاد کنید که دارای مجوزهای مناسب برای آپلود و دانلود محتوا در خارج از دایرکتوری خانگی root باشد.
ftp://192.168.0.15
آی پی آدرس خودتون را به آی پی 192.168.0.15 بالا عوض کنید و در مرورگر وارد کنید در صورت موفقیت آمیز بودن فرآیند احراز، شما میتوانید محتوای دایرکتوری خانگی خود را مشاهده کنید. در ادامه این آموزش، قادر خواهید بود صفحه مرورگر را بازخوانی (refresh) کنید تا فایلهایی که در مراحل قبلی آپلود کردهاید، نمایش داده شوند.
نصب Trickle مدیریت پهنای باند در لینوکس
برای نصب Trickle در توزیعهای مختلف لینوکس میتوانید از مدیریت بستههای مربوطه (yum یا apt) استفاده کنید. پیش از نصب Trickle، بهتر است بستههای نصب شده در سیستم خود را بهروز کنید تا مطمئن شوید فرآیند نصب بدون مشکل انجام میشود.
sudo yum -y update && sudo yum install trickle [On RedHat based systems] sudo apt -y update && sudo apt install trickle [On Debian based systems]
به منظور اطمینان از اینکه Trickle با برنامه مورد نظر کار میکند، باید بررسی کنیم که آیا برنامه از کتابخانههای پویا یا مشترک استفاده میکند یا خیر. همانطور که قبلاً توضیح دادیم، Trickle فقط با باینریهایی که از کتابخانههای پویا (dynamic or shared libraries) استفاده میکنند، سازگار است.
جهت بررسی اینکه آیا میتوانیم از این ابزار با یک برنامه خاص استفاده کنیم، از ابزار ldd (list dynamic dependencies) استفاده میکنیم. بهطور خاص، به دنبال حضور glibc (کتابخانه C GNU) در لیست وابستگیهای پویا هستیم، زیرا این کتابخانه شامل فراخوانیهای سیستمی مربوط به ارتباط از طریق سوکتها است.
دستور بررسی:
به منظور بررسی اینکه آیا Trickle میتواند پهنای باند یک برنامه خاص را شکل دهد، دستور زیر را برای باینری مورد نظر اجرا کنید:
sudo ldd $(which [binary]) | grep libc.so
به طور مثال:
sudo ldd $(which ncftp) | grep libc.so
که خروجی آن میشود:
sudo libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)
رشتهای که در پرانتزها ( ) در خروجی دستور `ldd` مشاهده میشود ممکن است از سیستمی به سیستم دیگر و حتی بین اجرای متوالی همان دستور تغییر کند، زیرا این رشته نشاندهنده آدرس بارگذاری کتابخانه در حافظه فیزیکی است.
اگر اجرای دستور `ldd` برای یک باینری خاص هیچ نتیجهای بازنگرداند، به این معناست که آن باینری از کتابخانه `libc` استفاده نمیکند و در این صورت، Trickle نمیتواند به عنوان ابزار کنترل پهنای باند برای آن برنامه استفاده شود.
نتیجه:
آموزش استفاده از Trickle مدیریت پهنای باند در لینوکس
سادهترین روش استفاده از Trickle در حالت standalone (مستقل) است. در این حالت، میتوانید به صورت صریح سرعت دانلود و آپلود یک برنامه را تعریف کنید. همانطور که پیشتر توضیح دادیم، برای اختصار در این آموزش، از یک برنامه برای آزمایش هر دو حالت دانلود و آپلود استفاده خواهیم کرد.
اجرای Trickle در حالت Standalone
نحوه اجرای Trickle در حالت Standalone:
از دستور زیر جهت اجرای Trickle در حالت مستقل استفاده میشود
sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
جهت اجرای مثالهای زیر به صورت شخصی، اطمینان حاصل کنید که ابزارهای trickle و ncftp روی ماشین کلاینت (در این مثال با IP آدرس 192.168.0.17) نصب شده باشند.
برای اجرای مثال 1:
آپلود یک فایل 2.8 مگابایتی با و بدون استفاده از Trickle، از فایل PDF توزیع آزاد Linux Fundamentals استفاده میکنیم. این فایل را میتوانید بهصورت رایگان دانلود کنید.
دانلود فایل با استفاده از دستور wget:
به منظور دانلود این فایل به دایرکتوری فعلی کاری خود، دستور زیر را اجرا کنید:
wget http://linux-training.be/files/books/LinuxFun.pdf
به منظور آپلود یک فایل به سرور FTP بدون استفاده از Trickle، از دستور ncftp استفاده میکنیم. سینتکس آپلود فایل به این شکل است:
sudo ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename
در اینجا، /remote_directory مسیر دایرکتوری آپلود نسبت به خانه کاربر است و local-filename یک فایل در دایرکتوری کاری فعلی شما است.
به طور خاص، بدون trickle، ما به سرعت آپلود اوج 52.02 MB/s دست مییابیم (لطفا توجه داشته باشید که این سرعت واقعی متوسط آپلود نیست، بلکه یک اوج شروع فوری است)، و فایل تقریباً به طور آنی آپلود میشود:
sudo ncftpput -u username -p password 192.168.0.15 /testdir LinuxFun.pdf
خروجی:
LinuxFun.pdf: 2.79 MB 52.02 MB/s
با استفاده از Trickle، سرعت انتقال آپلود را به 5 KB/s محدود میکنیم. پیش از آپلود مجدد فایل، باید آن را از دایرکتوری مقصد حذف کنیم.
در غیر این صورت، ncftp به ما اطلاع میدهد که فایل موجود در دایرکتوری مقصد همان فایلی است که قصد آپلود آن را داریم و انتقال انجام نخواهد شد.
rm /absolute/path/to/destination/directory/LinuxFun.pdf
سپس:
trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf
خروجی:
LinuxFun.pdf: 2.79 MB 4.94 kB/s
در مثال بالا میبینیم که میانگین سرعت آپلود به حدود 5 کیلوبایت بر ثانیه کاهش یافت.
مثال ۲: دانلود همان فایل 2.8 مگابایتی با و بدون استفاده از Trickle
ابتدا به خاطر داشته باشید که فایل PDF را از دایرکتوری اصلی منبع حذف کنید تا بتوانید آن را مجدداً دانلود کنید.
rm /absolute/path/to/source/directory/LinuxFun.pdf
توجه داشته باشید که در مثالهای زیر، فایل از سرور راه دور به دایرکتوری فعلی در ماشین کلاینت دانلود میشود. این موضوع با نقطه (‘.’) که بعد از آدرس IP سرور FTP ظاهر میشود، نشان داده شده است.
دانلود بدون استفاده از Trickle:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
خروجی:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
دانلود با استفاده از Trickle و محدود کردن سرعت به 20 KB/s:
trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
خروجی:
LinuxFun.pdf: 2.79 MB 17.76 kB/s
اجرای Trickle در حالت Supervised (مدیریت نشده)
Trickle کنترل پهنای باند در لینوکس میتواند در حالت unmanaged نیز اجرا شود که از طریق تنظیمات تعریف شده در فایل /etc/trickled.conf عمل میکند. این فایل نحوه رفتار و مدیریت trickled (دیمون) را تعریف میکند.
علاوه بر این، اگر بخواهیم تنظیمات کلی را برای تمام برنامهها اعمال کنیم، میتوانیم از دستور trickled استفاده کنیم. این دستور دیمون را اجرا میکند و به ما اجازه میدهد محدودیتهای دانلود و آپلود را به صورت جهانی برای تمام برنامههای اجرا شده از طریق Trickle تنظیم کنیم، بدون اینکه نیاز باشد هر بار محدودیتها را بهطور جداگانه مشخص کنیم.
مثال:
برای اجرای trickled با محدودیتهای کلی دانلود و آپلود:
trickled -d 50 -u 10
این دستور باعث میشود که سرعت دانلود و آپلود هر برنامهای که از طریق Trickle اجرا میشود، به ترتیب به ۳۰ کیلوبایت بر ثانیه و ۱۰ کیلوبایت بر ثانیه محدود شود.
توجه داشته باشید که میتوانید در هر زمان بررسی کنید که آیا trickled در حال اجراست و با چه آرگومانهایی اجرا شده است:
ps -ef | grep trickled | grep -v grep
خروجی:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
مثال ۳: بارگذاری یک فایل MP4 به حجم ۱۹ مگابایت بر روی سرور FTP با استفاده از Trickle
در این مثال، از ویدئوی “He is the gift” که به صورت رایگان قابل توزیع است و میتوانید آن را از این لینک دانلود کنید، استفاده خواهیم کرد.
ابتدا این فایل را به دایرکتوری کاری فعلی شما با استفاده از فرمان زیر دانلود خواهیم کرد:
wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4
در اول، daemon مربوط به trickled را با استفاده از فرمان ذکر شده در بالا راهاندازی خواهیم کرد:
trickled -d 30 -u 10
بدون استفاده از trickle:
ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
خروجی:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 36.31 MB/s
با استفاده از trickle:
trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
خروجی:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 9.51 kB/s
همانطور که در خروجی بالا مشاهده میکنیم، نرخ انتقال بارگذاری به حدود ۱۰ کیلوبایت در ثانیه کاهش یافته است.
مثال ۴: دانلود همان ویدیو با استفاده از Trickle
همانند مثال ۲، فایل را به دایرکتوری کاری فعلی دانلود خواهیم کرد.
بدون استفاده از trickle:
ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
خروجی:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 108.34 MB/s
با استفاده از trickle:
trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
خروجی:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 29.28 kB/s
که مطابق با محدودیت دانلود تعیینشده قبلی (۳۰ کیلوبایت در ثانیه) است.
توجه:
همانطور که قبلاً اشاره کردیم، میتوان شکلدهی پهنای باند trickle را از طریق فایل trickled.conf بیشتر شخصیسازی کرد. یک بخش معمولی در این فایل شامل موارد زیر است:
[service] Priority = <value> Time-Smoothing = <value> Length-Smoothing = <value>
که در آن،
[service]
نام برنامهای را نشان میدهد که قصد داریم استفاده از پهنای باند آن را تنظیم کنیم.
Priority
به ما اجازه میدهد تا یک سرویس را نسبت به دیگری اولویت بالاتری دهیم، بنابراین از این طریق از اشغال تمام پهنای باند توسط یک برنامه جلوگیری میشود. هرچه عدد کمتر باشد، پهنای باند بیشتری به [service] اختصاص داده میشود.
Time-Smoothing [به ثانیه]:
زمانبندیهایی را تعریف میکند که trickled سعی خواهد کرد اجازه دهد برنامه دادهها را انتقال و یا دریافت کند. مقادیر کوچکتر (بین ۰.۱ تا ۱ ثانیه) برای برنامههای تعاملی ایدهآل هستند و منجر به یک جلسه پیوسته (صاف) میشوند، در حالی که مقادیر کمی بزرگتر (بین ۱ تا ۱۰ ثانیه) برای برنامههایی که نیاز به انتقال عمده دارند، بهتر است. اگر مقداری مشخص نشود، مقدار پیشفرض (۵ ثانیه) استفاده میشود.
Length-Smoothing [به کیلوبایت]:
ایده مشابهی با Time-Smoothing دارد، اما بر اساس طول یک عملیات I/O است. اگر مقداری مشخص نشود، مقدار پیشفرض (۱۰ کیلوبایت) استفاده میشود.
تغییر مقادیر smoothing به این معنی است که برنامه مشخصشده توسط [service] از نرخهای انتقال در یک بازه استفاده میکند، به جای یک مقدار ثابت. متأسفانه، فرمولی برای محاسبه حد پایین و بالا این بازه وجود ندارد زیرا عمدتاً به هر سناریوی خاص بستگی دارد.
در زیر نمونهای از فایل trickled.conf در کلاینت CentOS 7 (۱۹۲.۱۶۸.۰.۱۷) آورده شده است:
[ssh] Priority = 1 Time-Smoothing = 0.1 Length-Smoothing = 2 [ftp] Priority = 2 Time-Smoothing = 1 Length-Smoothing = 3
با استفاده از این تنظیمات، trickled اولویت را به اتصالات SSH نسبت به انتقالهای FTP میدهد. توجه داشته باشید که یک فرآیند تعاملی مانند SSH از مقادیر کوچکتری برای time-smoothing استفاده میکند، در حالی که سرویسی که انتقال دادههای عمده (FTP) را انجام میدهد، از مقدار بزرگتری استفاده میکند.
مقادیر smoothing مسئول عدم تطابق سرعتهای دانلود و بارگذاری در مثال قبلی ما با مقدار دقیق مشخصشده توسط daemon trickled هستند و در عوض در یک بازه نزدیک به آن حرکت میکنند.
نتیجه گیری:
در این مقاله مدیریت پهنای باند در لینوکس ، به بررسی نحوه محدود کردن پهنای باند استفاده شده توسط برنامهها با استفاده از trickle در توزیعهای مبتنی بر Fedora و Debian و مشتقات آن پرداختیم. موارد استفاده دیگر در زیر اشاره میکنیم،( اما محدود به موارد زیر نیستند):
- محدود کردن سرعت دانلود از طریق ابزارهایی مانند wget یا کلاینتهای تورنت.
- محدود کردن سرعت بهروزرسانی سیستم از طریق `yum` (یا `aptitude` در سیستمهای مبتنی بر Debian) که به عنوان سیستم مدیریت بسته عمل میکند.
- اگر سرور شما پشت یک پراکسی یا فایروال قرار داشته باشد (یا خود آنها باشد)، میتوانید از trickle برای تعیین محدودیتها در سرعت دانلود و بارگذاری یا سرعت ارتباط با کلاینتها و دنیای بیرونی استفاده کنید.
سوالات و نظرات شما بسیار خوش آمد است. لطفاً از فرم زیر برای ارسال آنها استفاده کنید.