此页面的目的是提供步骤和代码,以重现以下论文的结果:
M. Savasci等人,“ Slo-Power:SLO和Power-Waise Web服务的弹性缩放”,2024年IEEE/ACM 24届国际集群,云和Internet Computing(CCGRID)的国际研讨会,美国费城,美国,2024年。
下面,我们详细描述:
我们在物理服务器上运行Ubuntu Ubuntu 20.04 LTS。以下所述的配置仅针对该特定版本的操作系统进行了测试。
我们在设置中使用了Python版本3.8.10。因此,我们建议您使用相同的版本。
SLO-Power需要以下Python模块:
我们生成了要求的python模块,除了RAPL模块外,我们生成了需求。因为它是从此处获得的外部模块。
我们建议您创建一个虚拟环境并在此虚拟环境中安装模块。要从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进行聚类,因此使用了应用程序部署。可以使用SNAP软件包管理器安装LXD。要安装它,
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的安装详细信息,请参阅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是我们之前创建的容器,哪个host 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。有关安装详细信息,请参阅此处。使用工作负载生成器的使用如下(假设它在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
使用位于/workspace目录的二进制文件启动HTTPMON Workload Generator,使用single_node_level_scaled_wikipedia_traces.out的痕迹,将请求发送到IP上的Haproxy Hosting 0.0.0.0 (根据您的网络配置进行更改)(根据您的网络配置),并保存Workload General Exputator fation v1 portfix portfix。默认情况下,工作负载生成器输出在/tmp目录下保存。
我们使用了两个真正的工作负载轨迹:Wikipedia和Azure Traces。考虑到我们的集群大小,我们缩放了Wikipedia和Azure痕迹。对于Wikipedia,我们在60到240之间缩放了痕迹,而我们为Azure痕迹缩放了100至240。所有这些痕迹都在工作负载轨迹目录下。除了群集级别的工作负载轨迹外,我们还提供了同一文件夹中的单节点级别工作负载跟踪。您应该根据您的设置相应地选择它们。
SLO-Power的源代码位于SRC目录下。在下文中,我们将展示如何运行Slo-Power。
我们的Slo-Agent有两个模块:电源帽和核心分配器。
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接口和容器信息(例如其CPU利用测量)提供功率测量。这两个服务可以如下运行。
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)
警告:在运行SLO-PTOR经理之前,请确保通过从工作负载生成器发送请求来加热应用程序。例如,以下命令
/workspace/httpmon --url http://0.0.0.0/gw/index.php/Mehmed_II. --concurrency 40 --thinktime 1 --open
使用位于/workspace目录的二进制文件启动HTTPMON Workload Generator,将请求发送给IP上的Haproxy托管0.0.0.0 ,并带有gw/index.php/的应用程序路径,并请求Mehmed_II. 40 times per second 。此命令的更多详细信息可以在此处找到。
我们提供一个BASH脚本来运行Slo-Power Manager Python文件。脚本的使用如下:
./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中,您可能需要根据设置在第31行更改python命令。例如,如果您的python调用为python3 ,请用python3替换python 。另外,请确保您在src目录中执行run_slo_power_manager.sh脚本。
例如,以下两个命令
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 ms,结果为1 s。样本输出将产生:
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。这些文件应根据您自己的设置进行修改。我们在line 28中的slo_power_manager.py中的该配置文件进行了硬编码,以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 。