الهدف من هذه الصفحة هو توفير الخطوات والرموز لإعادة إنتاج نتائج الورقة التالية:
M. Savasci ، et al.
أدناه ، نصف بالتفصيل:
ندير Ubuntu Ubuntu 20.04 LTS على خوادمنا المادية. تم اختبار التكوين الموضح أدناه فقط لهذا الإصدار الخاص من نظام التشغيل.
استخدمنا Python الإصدار 3.8.10 في الإعداد لدينا. لذلك ، نقترح عليك استخدام نفس الإصدار.
يتطلب السلطة السلوقية وحدات Python التالية:
لقد أنشأنا المتطلبات. txt للحصول على وحدات Python المطلوبة باستثناء وحدة RAPL لأنها وحدة خارجية تم الحصول عليها من هنا.
نقترح عليك إنشاء بيئة افتراضية Python وتثبيت وحدات داخل هذه البيئة الافتراضية. للتثبيت من requirements.txt ، قم بتشغيل الأمر التالي:
pip install -r /path/to/requirements.txt
لتثبيت وحدة RAPL ، استنساخ الريبو أولاً
git clone https://github.com/wkatsak/py-rapl.git
ثم انتقل إلى داخل الدليل وركض
pip install .
سيستخدم هذا الأمر setup.py لتثبيت وحدة RAPL.
استخدمنا الإصدار LXD 5.19 للتجميع وبالتالي نشر التطبيق. يمكن تثبيت LXD باستخدام Snap Package Manager. لتثبيته ،
sudo snap install lxd --channel=5.19/stable
إذا كان لديك بالفعل LXD في جهازك ، فيمكنك التبديل إلى الإصدار 5.19 باستخدام الأمر التالي
sudo snap refresh lxd --channel=5.19/stable
نحن نقدم ملف json للسماح لـ Slo-Power Manager بمعرفة الآلات الموجودة في المجموعة. لهذا الغرض ، يرجى الاطلاع على ملف cluster_machines.json أو single_machine.json وتحديثه.
لتجاربنا ، استخدمنا MediaWiki الألمانية مع memcached. يمكنك تنزيل الصورة من هنا:
بدلاً من ذلك ، يمكنك تنزيله باستخدام أمر gdown التالي:
gdown 1nZ0pMFGASFhaA4tthHhLlgdFP-RGt5tH
للحصول على تفاصيل التثبيت من gdown ، يرجى الاطلاع على Github repo.
بعد تنزيل Tarball صورة الحاوية ، تحتاج إلى استعادة وإنشاء حاوية منها. للقيام بذلك ، قم بتشغيل الأوامر التالية:
PS قبل تشغيل الأوامر أعلاه ، تحتاج إلى التأكد من تشغيل lxd init لغرض التهيئة.
lxc image import mediawiki_german_with_memcached.tar.gz --alias {IMAGE_NAME}
lxc launch {IMAGE_NAME} {CONTAINER_NAME}
لمعرفة ما إذا كانت الحاوية ترتفع ، يرجى التشغيل
lxc list
commmand وتأكد من تشغيل الحاوية.
بالإضافة إلى الخطوات المذكورة أعلاه ، نضيف وكيلًا إلى الحاوية لتلقي طلبات من Haproxy. نحن في الأساس نفعل إعادة توجيه المنفذ هنا.
لإضافة وكيل ، يرجى تشغيل الأمر التالي.
lxc config device add {CONTAINER_NAME} {PROXY_NAME} proxy listen=tcp:0.0.0.0:{PORT_NUMBER} connect=tcp:127.0.0.1:80
نستخدم haproxy v2.7.10 أمام خوادم الخلفية لموازنة الحمل. تحتاج إلى تثبيت haproxy أولاً. يمكن تثبيته
sudo apt install haproxy=2.7.10-1ppa1~bionic
للتحقق من تثبيته ، تنفيذ:
haproxy -v
يجب أن يعرض هذا الأمر رقم الإصدار من Haproxy المثبت.
بعد تثبيت Haproxy ، يجب تحرير ملف التكوين الخاص به على /etc/haproxy/haproxy.cfg . للراحة ، أثبتنا ملف التكوين هذا كـ haproxy.cfg. في هذا الملف ، يجب توفير معلمات CONTAINER_NAME ، IP_ADDRESS_OF_MACHINE_HOSTING_CONTAINER ، و PORT_NUMBER_OF_CONTAINER . هنا ، CONTAINER_NAME هي الحاوية التي أنشأناها في وقت سابق والتي تستضيف تطبيق MediaWiki. بالإضافة إلى ذلك ، يجب أن يكون PORT_NUMBER_OF_CONTAINER هو نفسه عند إنشاء الوكيل للحاوية.
قمنا بتهيئة المعلمات أعلاه مع بعض القيم في هذه الصورة. لذلك ، تحتاج إلى تعيينها بالقيم الصحيحة.
كما نقدم صورة Haproxy LXC لراحتك. يمكن تنزيله من هنا
بدلاً من ذلك ، يمكنك تنزيله باستخدام أمر gdown التالي:
gdown 1KtDZeMU-2enfnRhV5l147G-VW8CjHJHE
بعد تنزيل Tarball صورة الحاوية ، تحتاج إلى استعادة وإنشاء حاوية منها. للقيام بذلك ، قم بتشغيل الأوامر التالية:
lxc image import haproxy_container.tar.gz --alias {IMAGE_NAME}
lxc launch {IMAGE_NAME} {CONTAINER_NAME}
يتم توفير مولد عبء العمل في دليل مولد عبء العمل. يعتمد مولد عبء العمل لدينا على مولد عبء عمل HTTPMON. للحصول على تفاصيل التثبيت ، يرجى الاطلاع هنا. استخدام مولد عبء العمل كما يلي (افترض أنه يسمى دليل مولد workload-generator داخل العمل):
./generator $1 $2 $3 $4 where
$1 --> path to the binary of the httpmon
$2 --> IP address of HAProxy server (Listening port number can be provided as `IP_address:port_number`)
$3 --> workload trace file
$4 --> version of the workload generator's output that is logged
على سبيل المثال ، الأمر التالي
./generator.sh /workspace/httpmon 0.0.0.0 /SLO-Power/workload-traces/single_node_level_scaled_wikipedia_traces.out v1
يبدأ مولد عبء عمل HTTPMON ، باستخدام دليل ثنائي موجود في /workspace ، باستخدام آثار single_node_level_scaled_wikipedia_traces.out ، إرسال طلبات إلى استضافة Haproxy على IP من 0.0.0.0 (قم بتغييره وفقًا لتكوين شبكتك) ، وتوفير إخراج مولد العمل v1 . بشكل افتراضي ، يتم حفظ إخراج مولد عبء العمل تحت دليل /tmp .
استخدمنا اثنين من عبء العمل الحقيقي: آثار ويكيبيديا و Azure. قمنا بتدوين كل من آثار ويكيبيديا وآزور مع الأخذ في الاعتبار حجم الكتلة لدينا. بالنسبة إلى ويكيبيديا ، قمنا بتوسيع نطاق الآثار بين 60 و 240 ، بينما قمنا بتدوين ما بين 100 و 240 لآثار Azure. كل هذه الآثار تحت دليل عبء العمل. بالإضافة إلى آثار عبء العمل على مستوى الكتلة ، قدمنا آثار عبء العمل على مستوى العقدة في نفس المجلد أيضًا. يجب عليك اختيارهم وفقًا لذلك بناءً على الإعداد الخاص بك.
تقع رموز المصدر من السلطة السلو تحت دليل SRC. في ما يلي ، سنعرض كيفية تشغيل السلطة السلو.
لدى Slo-Agent وحدتان: Power Capper و Core Minocator.
sudo ) usage: power_capper_server.py [-h] [-p PORT] [-w WORKERS] [-e POWER]
Power Capping Server
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT Network port (default: 8088)
-w WORKERS, --workers WORKERS
Max Number of workers (default: 10)
-e POWER, --power POWER
Default power (default: 85000000)
usage: dynamic_core_allocator.py [-h] [-H HOST] [-p PORT] [-w WORKERS] [-d DOMAIN] [-c CORES]
Dynamic Core Allocator
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST Network host (default: 0.0.0.0)
-p PORT, --port PORT Network port (default: 8090)
-w WORKERS, --workers WORKERS
Max number of workers (default: 10)
-d DOMAIN, --domain DOMAIN
Default container (default: mediawiki-51-1)
-c CORES, --cores CORES
Default number of cores (default: 16)
قمنا أيضًا بتطوير خدمتين لتوفير قياس الطاقة عبر واجهة Intel Rapl ومعلومات الحاوية مثل قياس استخدام وحدة المعالجة المركزية. يمكن تشغيل هاتين الخدمتين على النحو التالي.
sudo ) usage: rapl_power_monitor_server.py [-h] [-p PORT] [-w WORKERS]
Container Service Server
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT Network port (default: 8091)
-w WORKERS, --workers WORKERS
Max Number of workers (default: 10)
usage: container_service_server.py [-h] [-H HOST] [-p PORT] [-w WORKERS]
Container Service Server
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST Network host (default: 0.0.0.0)
-p PORT, --port PORT Network port (default: 8089)
-w WORKERS, --workers WORKERS
Max Number of workers (default: 10)
تحذير: قبل تشغيل مدير الطاقة السلوك ، تأكد من تسخين التطبيق عن طريق إرسال طلبات من مولد عبء العمل. على سبيل المثال ، الأمر التالي
/workspace/httpmon --url http://0.0.0.0/gw/index.php/Mehmed_II. --concurrency 40 --thinktime 1 --open
يبدأ مولد عبء عمل HTTPMON ، باستخدام ثنائي موجود في /workspace ، وإرسال طلبات إلى Haproxy استضافة على IP بقيمة 0.0.0.0 مع مسار تطبيق gw/index.php/ ، وطلب Mehmed_II. صفحة 40 times per second . يمكن العثور على مزيد من تفاصيل هذا الأمر هنا.
نحن نقدم نص Bash لتشغيل ملف Python Manager Slo-Power. استخدام البرنامج النصي كما يلي:
./run_slo_power_manager $1 $2 $3 $4 where
$1 --> filepath where experiment files are saved to
$2 --> target SLO (in terms of ms)
$3 --> time granularity that SLO-Power works (1s in our experiments)
$4 --> filepath where HAProxy log file is (Default is /var/log/haproxy.log)
في run_slo_power_manager ، قد تحتاج إلى تغيير أمر python في السطر 31 بناءً على الإعداد الخاص بك. على سبيل المثال ، إذا كانت مكالمة python الخاصة بك مثل python3 ، فستحل محل python بـ python3 . أيضًا ، تأكد من تنفيذ برنامج run_slo_power_manager.sh داخل دليل src .
على سبيل المثال ، الأوامر التالية
cd SLO-Power/src/
./run_slo_power_manager.sh artifact_eval/test2/ 250 1 /var/log/haproxy.log
يغير دليل العمل الحالي إلى SLO-Power/src ، يبدأ التجربة ، مما يؤدي إلى توفير النتائج في artifact_eval/test2/ ، مع تكوين الهدف ليكون 250 مللي ثانية مع نتائج حبيبية من 1 ثانية. سوف ينتج عينة ناتج:
Min core: 2, Max core: 16
Current core info of containers: {('192.168.245.51', 'mediawiki-51-1'): 3}
Controller max power limit for node: {('192.168.245.51', 'mediawiki-51-1'): 55}
Target response time of the application: 250 ms
Ref_input: 250
slo_guard: 0.8
Guarded SLO target: 200.0
HAProxy log file is cleared for the initialization purpose.
Initial resource calibration is in progress...
Arrival rate: 41, service rate: 9, expected response time: 0.2 s
Proactive estimated number of core is 11.
Proactively estimated number of core for cluster: 11
{('192.168.245.51', 'mediawiki-51-1'): 0.06}
{('192.168.245.51', 'mediawiki-51-1'): 11}
11 core(s) has been allocated to mediawiki-51-1 hosted on 192.168.245.51.
Power has been set to 77 Watts on 192.168.245.51 due to change in number of core by the proactive scaler.
Initial resource calibration is done :)
Iteration: 1, Estimated number of request: 41, Average response time: 125.66666666666667, Tail response time: 140.9
Proactively scaling up decision is gonna be taken...
To be increased # cores: 0
12 core(s) has been allocated to mediawiki-51-1 hosted on 192.168.245.51.
Power is being set to 80 Watts (increase)
Power has been set to 80 Watts on 192.168.245.51 (Due to inner power scaler loop).
لاحظ أنه تم تعيين IP الخاص بنا على 192.168.245.51 ويختلف بين الآلات.
أخيرًا ، نقدم ملفين للتكوين المطلوب لتعيينه إذا تم تشغيل التجربة على مستوى الجهاز الواحد أو مستوى الكتلة. ملفات التكوين هذه هي Single_machine.json و cluster_machines.json. يجب تعديل هذه الملفات بناءً على الإعداد الخاص بك. قمنا بتشغيل ملف التكوين هذا في slo_power_manager.py في line 28 باسم machines_config_file = "./single_machine.json" . يجب تحديث هذا السطر باستخدام ملف التكوين الذي يعتمد على الإعداد الخاص بك أو إعداد العقدة الفردية أو إعداد الكتلة. قد يتم تغيير مسار ملف التكوين هذا في حالة عدم العثور على خطأ.
بالإضافة إلى ذلك ، لدى Slo-Power معلمات لإعدادها. يمكن إعداد هذه المعلمات في ملف التكوين. من ملف التكوين هذا ، هناك بعض المعلمات خاصة بالإعداد (مستوى الجهاز المفرد أو مستوى الكتلة). وترد هذه المعلمات أدناه ويجب تعيينها وفقًا لذلك.
cluster_size يذكر عدد الآلات المستخدمة في التجربة (العدد الإجمالي للآلات المذكورة في single_machine.json ، أي 1 أو في cluster_machines.json )
service_rate يحتفظ معدل خدمة التطبيق ضمن الإعداد.
PS POWER_MANAGER_CONFIG.JSON يتم تشويهها في line 29 باسم config_file = "./power_manager_config.json . قد تحتاج إلى تحديث مساره بناءً على دليل العمل الحالي الخاص بك إذا لم يكن لديك أي ملف لم يتم العثور عليه.