هل واجهت يومًا ما مواقف حيث سيطرت تطبيق واحد على عرض النطاق الترددي في شبكتك؟ إذا كنت قد واجهت يومًا ما موقفًا حيث استهلك أحد التطبيقات كل حركة مرورك، فسوف تقدر دور تطبيق التحكم في عرض النطاق الترددي بشكل طفيف.
سواء كنت مسؤول نظام أو مستخدم لينكس عاديًا، فإنك بحاجة إلى تعلم كيفية التحكم في سرعات التحميل والتنزيل للتطبيقات للتأكد من عدم حرق عرض النطاق الترددي لشبكتك بواسطة تطبيق واحد.
ما هو Trickle؟
Trickle هو أداة تشكيل عرض النطاق الترددي في الشبكة تُمكِّننا من إدارة سرعات التحميل والتنزيل للتطبيقات لمنع أي منها من التملك بكل (أو معظم) عرض النطاق الترددي المتاح.
كيف يعمل Trickle؟
بالإضافة إلى ذلك، يمكن لـ trickle مساعدتنا في تحديد الأولويات على أساس التطبيق حتى عندما يتم تعيين حدود عامة للنظام بأكمله، ستحصل التطبيقات ذات الأولوية على المزيد من عرض النطاق تلقائيًا.
لتحقيق هذه المهمة، يحدد trickle حدود حركة المرور لطريقة إرسال البيانات إلى واستقبالها من المقابس باستخدام اتصالات TCP. يجب أن نلاحظ أن trickle، بخلاف معدلات نقل البيانات، لا يقوم بتعديل أي نوع من أنواع سلوك العملية التي يتم تشكيلها في أي لحظة محددة.
ما الذي لا يستطيع Trickle فعله؟
القيود الوحيدة، إن كان بالإمكان القول بها، هي أن trickle لن يعمل مع التطبيقات المرتبطة بشكل ثابت أو البرامج الثنائية التي تحتوي على بتات SUID أو SGID حيث يستخدم التحميل والربط الديناميكي لوضع نفسه بين العملية المشكلة ومقبس الشبكة المرتبط بها. ثم يعمل Trickle كوكيل بين هاتين العنصرين البرمجيين.
لأن التسريب لا يتطلب Privileges المُساهمين للتشغيل، يمكن للمستخدمين تعيين قواسمهم الخاصة للتردد. وبما أن هذا قد لا يكون مرغوباً فسنبحث عن كيفية تعيين القواسم العامة التي لا يتجاوزها يمكن للمستخدمين من خلالها. بعبارة أخرى، سيتم إمكانية تنظيم معدلات التردد الخاصة بالمستخدمين ما عدا الحدود التي يضعها مسؤول النظام.
البيئة التجاربية
في هذه المقالة سنشرح كيفية تنظيم سعة الباقة التي يستخدمها التطبيقات في سيرفر لينكس مع trickle.
لإنتاج التردد الضروري، سنستخدم ncftpput و ncftpget (كلاهما متاحة عن طريق تثبيت ncftp) على المستخدم الخاص (سيرفر CentOS – dev1: 192.168.0.17) و vsftpd على السيرفر (ديبيان – dev2: 192.168.0.15) لأغراض التمثيل.
تلك التعليمات تنفيذ أيضًا في توزيعات بنية RHEL و توزيعات بنية Debian مثل أوبونتو و لينكس مينت.
كيفية تثبيت ncftp و vsftpd في اللينكس
1. بالنسبة للتوزيعات القائمة على RedHat، تحتاج إلى تمكين مستودع EPEL، وهو مستودع للبرمجيات المفتوحة المصدر والمجانية عالية الجودة يتم الاعتناء به من قبل مشروع Fedora.
تثبيت 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.rpm
تثبيت EPEL على CentOS 8، AlmaLinux 8، Rocky Linux 8:
sudo dnf config-manager --set-enabled powertools sudo dnf install epel-release
2. بعد ذلك، قم بتثبيت ncftp على النحو التالي.
sudo dnf install ncftp [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install ncftp [On Debian, Ubuntu and Mint]
3. قم بإعداد خادم FTP في خادم منفصل. يرجى ملاحظة أنه على الرغم من أن FTP غير آمن بشكل أساسي، إلا أنه لا يزال يستخدم على نطاق واسع في الحالات التي لا تتطلب الأمان في تحميل أو تنزيل الملفات.
نحن نستخدمه في هذه المقالة لتوضيح فوائد trickle ولأنه يظهر معدلات النقل في stdout على العميل، وسنترك مناقشة ما إذا كان يجب استخدامه أم لا لموعد ووقت آخر.
sudo dnf install vsftpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install vsftpd [On Debian, Ubuntu and Mint]
الآن، قم بتحرير ملف /etc/vsftpd/vsftpd.conf على خادم FTP على النحو التالي:
$ sudo nano /etc/vsftpd/vsftpd.conf OR $ sudo nano /etc/vsftpd.conf
قم بعمل التغييرات التالية:
anonymous_enable=NO local_enable=YES chroot_local_user=YES allow_writeable_chroot=YES
بعد ذلك، تأكد من بدء تشغيل vsftpd لجلستك الحالية وتمكينه للبدء التلقائي في التمهيدات المستقبلية:
sudo systemctl start vsftpd sudo systemctl enable vsftpd sudo systemctl status vsftpd
4. إذا اخترت إعداد خادم FTP في غريبة CentOS/RHEL بمفاتيح SSH للوصول عن بُعد، ستحتاج إلى حساب مستخدم محمي بكلمة مرور مع الصلاحيات المناسبة للمجلد وملف لتحميل وتنزيل المحتوى المطلوب خارج مجلد المستخدم الجذر.
يمكنك بعد ذلك تصفح مجلد المستخدم الجذر من خلال إدخال الرابط التالي في متصفحك. ستظهر نافذة تسجيل الدخول لتطلب منك حساب مستخدم صالح وكلمة مرور على خادم FTP.
ftp://192.168.0.15
إذا نجحت عملية المصادقة، سترى محتويات مجلد المستخدم الجذر. في وقت لاحق في هذا البرنامج التعليمي، ستكون قادرًا على تحديث تلك الصفحة لعرض الملفات التي تم تحميلها خلال الخطوات السابقة.

كيفية تثبيت Trickle في Linux
الآن قم بتثبيت trickle عبر yum أو apt.
لضمان نجاح التثبيت، يعتبر من الممارسات الجيدة التأكد من أن الحزم المثبتة حاليًا مُحدَّثة (باستخدام yum update) قبل تثبيت الأداة نفسها.
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 سيعمل فقط مع الثنائيات التي تستخدم المكتبات الديناميكية أو المشتركة.
للتحقق مما إذا كان يمكننا استخدام هذه الأداة مع تطبيق معين، يمكننا استخدام أداة معروفة ldd، حيث ldd تعني سرد التبعيات الديناميكية.
على وجه التحديد، سنبحث عن وجود glibc (مكتبة جنو الـ C) في قائمة التبعيات الديناميكية لأي برنامج معين لأن هذه المكتبة هي التي تعرف المكالمات البرمجية المعنية في التواصل عبر الوكيليات.
قم بتشغيل الأمر التالي ضد ملف ثنائي معين لمعرفة ما إذا كان يمكن استخدام trickle لتشكيل سعرتها:
sudo ldd $(which [binary]) | grep libc.so
على سبيل المثال،
sudo ldd $(which ncftp) | grep libc.so
الذي ينتج:
sudo libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)
قد يتغير السلسلة بين الأقواس في الإخراج من نظام لآخر وحتى بين تشغيلات متتالية من نفس الأمر حيث تمثل عنوان تحميل المكتبة في الذاكرة المادية.
إذا لم يعطي الأمر أي نتائج أعلاه، فهذا يعني أن الملف الثنائي الذي تم تشغيله ضده لا يستخدم libc، وبالتالي لا يمكن استخدام trickle كمشكل سعرة في هذه الحالة.
تعرف على كيفية استخدام Trickle في Linux
أسهل استخدام لـ trickle هو في الوضع المستقل. باستخدام هذا الأسلوب، يتم استخدام trickle لتحديد سرعات التنزيل والرفع لتطبيق معين. كما شرحنا سابقًا، من أجل الاستغناء، سنستخدم نفس التطبيق للاختبارات التنزيل والرفع.
تشغيل Trickle في الوضع المستقل
سنقارن سرعة التنزيل والرفع باستخدام ودون استخدام trickle. يشير الخيار -d
إلى سرعة التنزيل بالكيلوبايت في الثانية، بينما يوجه العلم -u
trickle لتقييد سرعة الرفع بنفس الوحدة. علاوة على ذلك، سنستخدم العلم -s
، الذي يحدد أن trickle يجب أن يعمل في وضع مستقل.
بناء جملة استدعاء trickle في وضع مستقل كما يلي:
sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
لإجراء الأمثلة التالية بنفسك، تأكد من تثبيت trickle و ncftp على جهاز العميل (192.168.0.17 في حالتي).
مثال 1: رفع ملف 2.8 ميغا باستخدام ودون استخدام Trickle
نستخدم ملف Linux Fundamentals PDF على نطاق حر (متاح من هنا) للاختبارات التالية.
يمكنك تنزيل هذا الملف إلى دليل العمل الحالي باستخدام الأمر wget التالي:
wget http://linux-training.be/files/books/LinuxFun.pdf
بناء جملة لرفع ملف إلى خادم FTP بدون trickle كما يلي:
sudo ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename
حيث /remote_directory هو مسار الدليل المرافق للرفع بالنسبة لمسكن المستخدم، و local-filename هو ملف في دليل العمل الحالي.
بالتحديد، بدون تدفق، نحصل على سرعة التحميل الأعلى من 52.02 ميغابايت/ث (يرجى ملاحظة أن هذه ليست السرعة المتوسطة الحقيقية للتحميل، ولكنها نقطة أولية عالية)، ويتم تحميل الملف تقريبًا على الفور:
sudo ncftpput -u username -p password 192.168.0.15 /testdir LinuxFun.pdf
الناتج:
LinuxFun.pdf: 2.79 MB 52.02 MB/s
مع تدفق، سنحد من معدل نقل التحميل إلى 5 كيلوبايت/ث. قبل تحميل الملف للمرة الثانية، نحتاج إلى حذفه من الدليل الهدف.
خلاف ذلك، 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: تنزيل نفس الملف 2.8 ميغابايت بها وبدون تدفق
أولاً، تذكر حذف ملف PDF من الدليل الأصلي:
rm /absolute/path/to/source/directory/LinuxFun.pdf
يرجى ملاحظة أن الحالات التالية ستقوم بتنزيل الملف البعيد إلى الدليل الحالي في جهاز العميل. يشار إلى هذه الحقيقة بواسطة الفترة (‘.‘) التي تظهر بعد عنوان IP خادم الـFTP.
بدون تدفق:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
الناتج:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
مع تدفق، وتحديد سرعة التنزيل عند 20 كيلوبايت/ث:
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
تشغيل تدفق في وضع الإشراف [غير المُدار]
يمكن أيضًا تشغيل تدفق في وضع غير مُدار، بعد سلسلة من المعلمات المحددة في /etc/trickled.conf. يحدد هذا الملف كيف يتصرف trickled (الحارس) ويدير تدفق.
علاوة على ذلك، إذا أردنا تعيين إعدادات عالمية ليتم استخدامها بشكل عام من قبل جميع التطبيقات، سنحتاج إلى استخدام أمر trickled. يعمل هذا الأمر التابع الخادم ويسمح لنا بتحديد حدود التنزيل والرفع التي ستشترك فيها جميع التطبيقات التي يتم تشغيلها من خلال trickle بدون الحاجة إلى تحديد الحدود في كل مرة.
على سبيل المثال، التشغيل:
trickled -d 50 -u 10
هذا سيجبر سرعات التنزيل والرفع لأي تطبيق يتم تشغيله من خلال trickle على الحد من 30 كيلوبايت/ثانية و 10 كيلوبايت/ثانية على التوالي.
يرجى ملاحظة أنه يمكنك التحقق في أي وقت مما إذا كان trickled يعمل وما هي الحجج:
ps -ef | grep trickled | grep -v grep
الناتج:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
مثال 3: تحميل ملف MP4 بحجم 19 ميغابايت إلى خادم 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
أولاً، سنبدأ التابع 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
كما يمكننا رؤية في الناتج أعلاه، انخفض معدل نقل الرفع إلى حوالي 10 كيلوبايت/ثانية.
مثال 4: تنزيل نفس الفيديو باستخدام Trickle
كما في مثال 2، سنقوم بتنزيل الملف إلى الدليل الحالي الذي نعمل فيه.
بدون 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
وهو في استيفاء لحد التنزيل المحدد مسبقًا (30 كيلوبايت/ث).
ملاحظة: أنه بمجرد بدء المهام، ليس هناك حاجة لتحديد حدود فردية لكل تطبيق يستخدم trickle.
كما ذكرنا سابقًا، يمكن للمرء تخصيص تشكيل سرعة trickle عبر trickled.conf. يتكون قسم نموذجي في هذا الملف من ما يلي:
[service] Priority = <value> Time-Smoothing = <value> Length-Smoothing = <value>
حيث،
- [service] يشير إلى اسم التطبيق الذي نهدف إلى تشكيل استخدامه للنطاق.
- الأولوية يتيح لنا تحديد خدمة لديها أولوية أعلى مقارنة بأخرى، وبالتالي لا يسمح لتطبيق واحد باستغلال كل النطاق الذي يديره المهام. كلما كان الرقم أقل، كلما تم تخصيص المزيد من النطاق لـ [service].
- التجانس الزمني [بالثواني]: يعرّف مع ما فترات زمنية سيحاول trickled تمكين التطبيق من نقل و/أو استقبال البيانات. القيم الأصغر (في النطاق من 0.1 إلى 1 ثانية) مثالية للتطبيقات التفاعلية وستؤدي إلى جلسة أكثر استمرارية (متناغمة) بينما القيم الأكبر قليلاً (من 1 إلى 10 ثوان) أفضل للتطبيقات التي تحتاج إلى نقل كميات كبيرة. إذا لم يتم تحديد قيمة، يتم استخدام القيمة الافتراضية (5 ثوان).
- تجانس الطول [في كيلوبايت]: الفكرة هي نفسها في تجانس الوقت، ولكنها تعتمد على طول عملية الإدخال / الإخراج. إذا لم يتم تحديد قيمة، يتم استخدام القيمة الافتراضية (10 كيلوبايت).
تغيير قيم التجانس سيؤدي إلى استخدام التطبيق المحدد بواسطة [الخدمة] معدلات التحويل داخل فترة بدلاً من قيمة ثابتة. للأسف، لا يوجد صيغة لحساب الحدود الأدنى والأعلى لهذه الفترة لأنها تعتمد في الغالب على سيناريو كل حالة.
التالي هو ملف عينة trickled.conf في عميل CentOS 7 (192.168.0.17):
[ssh] Priority = 1 Time-Smoothing = 0.1 Length-Smoothing = 2 [ftp] Priority = 2 Time-Smoothing = 1 Length-Smoothing = 3
باستخدام هذا الإعداد، سيوجه trickled الاتصالات SSH على أكثر أولوية من تحويلات FTP. لاحظ أن العملية التفاعلية، مثل SSH، تستخدم قيم أصغر لتجانس الوقت، بينما تستخدم الخدمة التي تنفذ تحويلات كمية كبيرة من البيانات (FTP) قيمة أكبر.
تتحمل قيم التجانس مسؤولية سرعة التنزيل والرفع في المثال السابق ولا تتطابق مع القيمة الدقيقة المحددة بواسطة وحدة trickled ولكنها تتحرك في فترة تقترب منها.
[ قد ترغب أيضًا: كيفية تأمين وتصون خادم OpenSSH ]
الخاتمة
في هذه المقالة، تعرفنا على كيفية الحد من إنتاجية التطبيقات باستخدام trickle على توزيعات Fedora-based و Debian / derivatives. قد تشمل الاستخدامات الممكنة الأخرى، ولكنها ليست مقتصرة عليها:
- يمكنك التقييد سرعة التنزيل عن طريق أداة منظمة النظام مثل wget أو عن طريق عميل التورنت على سبيل المثال.
- يمكنك أيضًا التقييد سرعة التحديث التلقائي للنظام عن طريق “yum” (أو “aptitude” إذا كنت في نظام يعتمد على Debian)، وهو نظام إدارة الحزم.
- إذا كانت خادمك خلف عامل توجيه الواب أو حرس الحدود (أو هو عامل توجيه الواب أو حرس الحدود نفسه)، يمكنك استخدام trickle لتعيين حدود على كل من سرعة التنزيل والرفع أو سرعة الاتصال مع العملاء أو الخارج.
نرحب بأي أسئلة وتعليقات. لا تتردد في استخدام النموذج أدناه لإرسالها إلينا.
Source:
https://www.tecmint.com/limit-linux-network-bandwidth-usage-with-trickle/