The mobile processing unit support as well as a sample application are added.
The mobile processing units are simulated via CloudSim. It is assumed that the mobile devices operate Hosts and VMs like a server. Therefore, the classes located in the mobile_processing_unit package have a similar naming convention to the other Cloud and Edge components.
This commit is contained in:
parent
38b122ae6c
commit
95edf172fe
@ -12,16 +12,16 @@ function [] = plotTaskFailureReason()
|
|||||||
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
plotGenericResult(5, 4, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
plotGenericResult(5, 5, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
plotGenericResult(5, 6, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
plotGenericResult(5, 7, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
end
|
end
|
@ -12,22 +12,22 @@ function [] = plotTaskFailureReason()
|
|||||||
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
plotGenericResult(5, 4, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
plotGenericResult(5, 5, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(5, 4, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
plotGenericResult(5, 5, 'Failed Tasks due to MAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
plotGenericResult(5, 6, 'Failed Tasks due to MAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
plotGenericResult(5, 5, {'Failed Tasks due to MAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
plotGenericResult(5, 6, {'Failed Tasks due to MAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
plotGenericResult(5, 5, {'Failed Tasks due to MAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
plotGenericResult(5, 6, {'Failed Tasks due to MAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
plotGenericResult(5, 5, {'Failed Tasks due to MAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(5, 6, {'Failed Tasks due to MAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(5, 5, {'Failed Tasks due to MAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(5, 6, {'Failed Tasks due to MAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
plotGenericResult(5, 6, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
plotGenericResult(5, 7, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
plotGenericResult(5, 6, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
end
|
end
|
59
scripts/sample_app3/config/applications.xml
Normal file
59
scripts/sample_app3/config/applications.xml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<applications>
|
||||||
|
<application name="AUGMENTED_REALITY">
|
||||||
|
<usage_percentage>30</usage_percentage>
|
||||||
|
<prob_cloud_selection>20</prob_cloud_selection>
|
||||||
|
<poisson_interarrival>2</poisson_interarrival>
|
||||||
|
<active_period>40</active_period>
|
||||||
|
<idle_period>20</idle_period>
|
||||||
|
<data_upload>1500</data_upload>
|
||||||
|
<data_download>250</data_download>
|
||||||
|
<task_length>12000</task_length>
|
||||||
|
<required_core>1</required_core>
|
||||||
|
<vm_utilization_on_edge>8</vm_utilization_on_edge>
|
||||||
|
<vm_utilization_on_cloud>0.8</vm_utilization_on_cloud>
|
||||||
|
<vm_utilization_on_mobile>20</vm_utilization_on_mobile>
|
||||||
|
</application>
|
||||||
|
<application name="HEALTH_APP">
|
||||||
|
<usage_percentage>20</usage_percentage>
|
||||||
|
<prob_cloud_selection>20</prob_cloud_selection>
|
||||||
|
<poisson_interarrival>3</poisson_interarrival>
|
||||||
|
<active_period>45</active_period>
|
||||||
|
<idle_period>90</idle_period>
|
||||||
|
<data_upload>200</data_upload>
|
||||||
|
<data_download>1250</data_download>
|
||||||
|
<task_length>6000</task_length>
|
||||||
|
<required_core>1</required_core>
|
||||||
|
<vm_utilization_on_edge>4</vm_utilization_on_edge>
|
||||||
|
<vm_utilization_on_cloud>0.4</vm_utilization_on_cloud>
|
||||||
|
<vm_utilization_on_mobile>10</vm_utilization_on_mobile>
|
||||||
|
</application>
|
||||||
|
<application name="HEAVY_COMP_APP">
|
||||||
|
<usage_percentage>20</usage_percentage>
|
||||||
|
<prob_cloud_selection>40</prob_cloud_selection>
|
||||||
|
<poisson_interarrival>20</poisson_interarrival>
|
||||||
|
<active_period>60</active_period>
|
||||||
|
<idle_period>120</idle_period>
|
||||||
|
<data_upload>2500</data_upload>
|
||||||
|
<data_download>200</data_download>
|
||||||
|
<task_length>30000</task_length>
|
||||||
|
<required_core>1</required_core>
|
||||||
|
<vm_utilization_on_edge>20</vm_utilization_on_edge>
|
||||||
|
<vm_utilization_on_cloud>2</vm_utilization_on_cloud>
|
||||||
|
<vm_utilization_on_mobile>50</vm_utilization_on_mobile>
|
||||||
|
</application>
|
||||||
|
<application name="INFOTAINMENT_APP">
|
||||||
|
<usage_percentage>30</usage_percentage>
|
||||||
|
<prob_cloud_selection>10</prob_cloud_selection>
|
||||||
|
<poisson_interarrival>7</poisson_interarrival>
|
||||||
|
<active_period>30</active_period>
|
||||||
|
<idle_period>45</idle_period>
|
||||||
|
<data_upload>250</data_upload>
|
||||||
|
<data_download>1000</data_download>
|
||||||
|
<task_length>15000</task_length>
|
||||||
|
<required_core>1</required_core>
|
||||||
|
<vm_utilization_on_edge>10</vm_utilization_on_edge>
|
||||||
|
<vm_utilization_on_cloud>1</vm_utilization_on_cloud>
|
||||||
|
<vm_utilization_on_mobile>25</vm_utilization_on_mobile>
|
||||||
|
</application>
|
||||||
|
</applications>
|
43
scripts/sample_app3/config/default_config.properties
Normal file
43
scripts/sample_app3/config/default_config.properties
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#default config file
|
||||||
|
simulation_time=33
|
||||||
|
warm_up_period=3
|
||||||
|
vm_load_check_interval=0.1
|
||||||
|
vm_location_check_interval=0.1
|
||||||
|
file_log_enabled=true
|
||||||
|
deep_file_log_enabled=false
|
||||||
|
|
||||||
|
min_number_of_mobile_devices=200
|
||||||
|
max_number_of_mobile_devices=2000
|
||||||
|
mobile_device_counter_size=200
|
||||||
|
|
||||||
|
wan_propogation_delay=0.1
|
||||||
|
lan_internal_delay=0.005
|
||||||
|
wlan_bandwidth=0
|
||||||
|
wan_bandwidth=0
|
||||||
|
gsm_bandwidth=0
|
||||||
|
|
||||||
|
#all the host on cloud runs on a single datacenter
|
||||||
|
number_of_host_on_cloud_datacenter=1
|
||||||
|
number_of_vm_on_cloud_host=4
|
||||||
|
core_for_cloud_vm=4
|
||||||
|
mips_for_cloud_vm=100000
|
||||||
|
ram_for_cloud_vm=32000
|
||||||
|
storage_for_cloud_vm=1000000
|
||||||
|
|
||||||
|
#each mobile device has one host which serves one VM
|
||||||
|
#all the host runs on a single datacenter due to the out of memory (oom) issue
|
||||||
|
core_for_mobile_vm=1
|
||||||
|
mips_for_mobile_vm=4000
|
||||||
|
ram_for_mobile_vm=2000
|
||||||
|
storage_for_mobile_vm=32000
|
||||||
|
|
||||||
|
#use ',' for multiple values
|
||||||
|
orchestrator_policies=ONLY_EDGE,ONLY_MOBILE,HYBRID
|
||||||
|
|
||||||
|
#use ',' for multiple values
|
||||||
|
simulation_scenarios=MOBILE_PROCESSING_SCENARIO
|
||||||
|
|
||||||
|
#mean waiting time in seconds
|
||||||
|
attractiveness_L1_mean_waiting_time=480
|
||||||
|
attractiveness_L2_mean_waiting_time=300
|
||||||
|
attractiveness_L3_mean_waiting_time=120
|
983
scripts/sample_app3/config/edge_devices.xml
Normal file
983
scripts/sample_app3/config/edge_devices.xml
Normal file
@ -0,0 +1,983 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<edge_devices>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>1</x_pos>
|
||||||
|
<y_pos>1</y_pos>
|
||||||
|
<wlan_id>0</wlan_id>
|
||||||
|
<attractiveness>0</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>2</x_pos>
|
||||||
|
<y_pos>2</y_pos>
|
||||||
|
<wlan_id>1</wlan_id>
|
||||||
|
<attractiveness>0</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>3</x_pos>
|
||||||
|
<y_pos>3</y_pos>
|
||||||
|
<wlan_id>2</wlan_id>
|
||||||
|
<attractiveness>1</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>4</x_pos>
|
||||||
|
<y_pos>4</y_pos>
|
||||||
|
<wlan_id>3</wlan_id>
|
||||||
|
<attractiveness>1</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>5</x_pos>
|
||||||
|
<y_pos>5</y_pos>
|
||||||
|
<wlan_id>4</wlan_id>
|
||||||
|
<attractiveness>1</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>6</x_pos>
|
||||||
|
<y_pos>6</y_pos>
|
||||||
|
<wlan_id>5</wlan_id>
|
||||||
|
<attractiveness>1</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>7</x_pos>
|
||||||
|
<y_pos>7</y_pos>
|
||||||
|
<wlan_id>6</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>8</x_pos>
|
||||||
|
<y_pos>8</y_pos>
|
||||||
|
<wlan_id>7</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>9</x_pos>
|
||||||
|
<y_pos>9</y_pos>
|
||||||
|
<wlan_id>8</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>10</x_pos>
|
||||||
|
<y_pos>10</y_pos>
|
||||||
|
<wlan_id>9</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>11</x_pos>
|
||||||
|
<y_pos>11</y_pos>
|
||||||
|
<wlan_id>10</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>12</x_pos>
|
||||||
|
<y_pos>12</y_pos>
|
||||||
|
<wlan_id>11</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>13</x_pos>
|
||||||
|
<y_pos>13</y_pos>
|
||||||
|
<wlan_id>12</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
<datacenter arch="x86" os="Linux" vmm="Xen">
|
||||||
|
<costPerBw>0.1</costPerBw>
|
||||||
|
<costPerSec>3.0</costPerSec>
|
||||||
|
<costPerMem>0.05</costPerMem>
|
||||||
|
<costPerStorage>0.1</costPerStorage>
|
||||||
|
<location>
|
||||||
|
<x_pos>14</x_pos>
|
||||||
|
<y_pos>14</y_pos>
|
||||||
|
<wlan_id>13</wlan_id>
|
||||||
|
<attractiveness>2</attractiveness>
|
||||||
|
</location>
|
||||||
|
<hosts>
|
||||||
|
<host>
|
||||||
|
<core>16</core>
|
||||||
|
<mips>80000</mips>
|
||||||
|
<ram>16000</ram>
|
||||||
|
<storage>400000</storage>
|
||||||
|
<VMs>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
<VM vmm="Xen">
|
||||||
|
<core>2</core>
|
||||||
|
<mips>10000</mips>
|
||||||
|
<ram>2000</ram>
|
||||||
|
<storage>50000</storage>
|
||||||
|
</VM>
|
||||||
|
</VMs>
|
||||||
|
</host>
|
||||||
|
</hosts>
|
||||||
|
</datacenter>
|
||||||
|
</edge_devices>
|
53
scripts/sample_app3/matlab/getConfiguration.m
Normal file
53
scripts/sample_app3/matlab/getConfiguration.m
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
%--------------------------------------------------------------
|
||||||
|
%description
|
||||||
|
% returns a value according to the given argumentssss
|
||||||
|
%--------------------------------------------------------------
|
||||||
|
function [ret_val] = getConfiguration(argType)
|
||||||
|
if(argType == 1)
|
||||||
|
ret_val = 'D:\sim_results';
|
||||||
|
elseif(argType == 2)
|
||||||
|
ret_val = 10; %Number of iterations
|
||||||
|
elseif(argType == 3)
|
||||||
|
ret_val = 200; %min number of mobile device
|
||||||
|
elseif(argType == 4)
|
||||||
|
ret_val = 200; %step size of mobile device count
|
||||||
|
elseif(argType == 5)
|
||||||
|
ret_val =2000; %max number of mobile device
|
||||||
|
elseif(argType == 6)
|
||||||
|
ret_val = 1; %xTickLabelCoefficient
|
||||||
|
elseif(argType == 7)
|
||||||
|
ret_val = {'ONLY_EDGE','ONLY_MOBILE','HYBRID'};
|
||||||
|
elseif(argType == 8)
|
||||||
|
ret_val = {'only edge','only mobile','hybrid'};
|
||||||
|
elseif(argType == 9)
|
||||||
|
ret_val=[10 3 12 12]; %position of figure
|
||||||
|
elseif(argType == 10)
|
||||||
|
ret_val = 'Number of Mobile Devices'; %Common text for x axis
|
||||||
|
elseif(argType == 11)
|
||||||
|
ret_val = 1; %return 1 if you want to save figure as pdf
|
||||||
|
elseif(argType == 12)
|
||||||
|
ret_val = 0; %return 1 if you want to plot errors
|
||||||
|
elseif(argType == 20)
|
||||||
|
ret_val=1; %return 1 if graph is plotted colerful
|
||||||
|
elseif(argType == 21)
|
||||||
|
ret_val=[0.55 0 0]; %color of first line
|
||||||
|
elseif(argType == 22)
|
||||||
|
ret_val=[0 0.15 0.6]; %color of second line
|
||||||
|
elseif(argType == 23)
|
||||||
|
ret_val=[0 0.23 0]; %color of third line
|
||||||
|
elseif(argType == 24)
|
||||||
|
ret_val=[0.6 0 0.6]; %color of fourth line
|
||||||
|
elseif(argType == 25)
|
||||||
|
ret_val=[0.08 0.08 0.08]; %color of fifth line
|
||||||
|
elseif(argType == 26)
|
||||||
|
ret_val=[0 0.8 0.8]; %color of sixth line
|
||||||
|
elseif(argType == 27)
|
||||||
|
ret_val=[0.8 0.4 0]; %color of seventh line
|
||||||
|
elseif(argType == 28)
|
||||||
|
ret_val=[0.8 0.8 0]; %color of eighth line
|
||||||
|
elseif(argType == 40)
|
||||||
|
ret_val={'-k*','-ko','-ks','-kv','-kp','-kd','-kx','-kh'}; %line style (marker) of the colerless line
|
||||||
|
elseif(argType == 50)
|
||||||
|
ret_val={':k*',':ko',':ks',':kv',':kp',':kd',':kx',':kh'}; %line style (marker) of the colerfull line
|
||||||
|
end
|
||||||
|
end
|
21
scripts/sample_app3/matlab/plotAvgFailedTask.m
Normal file
21
scripts/sample_app3/matlab/plotAvgFailedTask.m
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
function [] = plotAvgFailedTask()
|
||||||
|
|
||||||
|
plotGenericResult(1, 2, 'Failed Tasks (%)', 'ALL_APPS', 'percentage_for_all');
|
||||||
|
plotGenericResult(1, 2, {'Failed Tasks for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
|
||||||
|
plotGenericResult(1, 2, 'Failed Tasks for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(1, 2, {'Failed Tasks for';'Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(1, 2, 'Failed Tasks for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
|
||||||
|
|
||||||
|
plotGenericResult(2, 2, 'Failed Tasks on Edge (%)', 'ALL_APPS', 'percentage_for_all');
|
||||||
|
plotGenericResult(2, 2, {'Failed Tasks on Edge';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
|
||||||
|
plotGenericResult(2, 2, 'Failed Tasks on Edge for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(2, 2, 'Failed Tasks on Edge for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(2, 2, 'Failed Tasks on Edge for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
|
||||||
|
|
||||||
|
plotGenericResult(4, 2, 'Failed Tasks on Mobile (%)', 'ALL_APPS', 'percentage_for_all');
|
||||||
|
plotGenericResult(4, 2, {'Failed Tasks on Mobile for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all');
|
||||||
|
plotGenericResult(4, 2, 'Failed Tasks on Mobile for Health App (%)', 'HEALTH_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(4, 2, 'Failed Tasks on Mobile for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all');
|
||||||
|
plotGenericResult(4, 2, 'Failed Tasks on Mobile for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all');
|
||||||
|
|
||||||
|
end
|
14
scripts/sample_app3/matlab/plotAvgNetworkDelay.m
Normal file
14
scripts/sample_app3/matlab/plotAvgNetworkDelay.m
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
function [] = plotAvgNetworkDelay()
|
||||||
|
|
||||||
|
plotGenericResult(1, 7, 'Average Network Delay (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(1, 7, {'Average Network Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(1, 7, 'Average Network Delay for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(1, 7, {'Average Network Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(1, 7, {'Average Network Delay';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(5, 1, 'Average WLAN Delay (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(5, 1, {'Average WLAN Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(5, 1, 'Average WLAN Delay for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(5, 1, {'Average WLAN Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(5, 1, {'Average WLAN Delay';'for Heavy Comp. App %(sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
end
|
21
scripts/sample_app3/matlab/plotAvgProcessingTime.m
Normal file
21
scripts/sample_app3/matlab/plotAvgProcessingTime.m
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
function [] = plotAvgProcessingTime()
|
||||||
|
|
||||||
|
plotGenericResult(1, 6, 'Processing Time (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(1, 6, 'Processing Time for Augmented Reality App (sec)', 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(1, 6, 'Processing Time for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(1, 6, 'Processing Time for Infotainment App (sec)', 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(1, 6, 'Processing Time for Heavy Comp. App (sec)', 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(2, 6, 'Processing Time on Edge (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(2, 6, {'Processing Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(2, 6, {'Processing Time on Edge';'for Health App (sec)'}, 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(2, 6, {'Processing Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(2, 6, {'Processing Time on Edge';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(4, 6, 'Processing Time on Mobile (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(4, 6, {'Processing Time on Mobile';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(4, 6, {'Processing Time on Mobile';'for Health App (sec)'}, 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(4, 6, {'Processing Time on Mobile';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(4, 6, {'Processing Time on Mobile';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
end
|
21
scripts/sample_app3/matlab/plotAvgServiceTime.m
Normal file
21
scripts/sample_app3/matlab/plotAvgServiceTime.m
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
function [] = plotAvgServiceTime()
|
||||||
|
|
||||||
|
plotGenericResult(1, 5, 'Service Time (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(1, 5, {'Service Time for';'Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(1, 5, 'Service Time for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(1, 5, 'Service Time for Infotainment App (sec)', 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(1, 5, {'Service Time for';'Compute Intensive App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(2, 5, 'Service Time on Edge (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(2, 5, {'Service Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(2, 5, 'Service Time on Edge for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(2, 5, {'Service Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(2, 5, {'Service Time on Edge';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(4, 5, 'Service Time on Mobile (sec)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(4, 5, {'Service Time on Mobile';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(4, 5, 'Service Time on Mobile for Health App (sec)', 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(4, 5, {'Service Time on Mobile';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(4, 5, {'Service Time on Mobile';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
end
|
14
scripts/sample_app3/matlab/plotAvgVmUtilization.m
Normal file
14
scripts/sample_app3/matlab/plotAvgVmUtilization.m
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
function [] = plotAvgVmUtilization()
|
||||||
|
|
||||||
|
plotGenericResult(2, 8, 'Average VM Utilization of Edge (%)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(2, 8, {'Average VM Utilization of Edge';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(2, 8, {'Average VM Utilization of Edge';'for Health App (%)'}, 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(2, 8, {'Average VM Utilization of Edge';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(2, 8, {'Average VM Utilization of Edge';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
|
||||||
|
plotGenericResult(4, 8, 'Average VM Utilization of Mobile(%)', 'ALL_APPS', '');
|
||||||
|
plotGenericResult(4, 8, {'Average VM Utilization of Mobile';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', '');
|
||||||
|
plotGenericResult(4, 8, {'Average VM Utilization of Mobile';'for Health App (%)'}, 'HEALTH_APP', '');
|
||||||
|
plotGenericResult(4, 8, {'Average VM Utilization of Mobile';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', '');
|
||||||
|
plotGenericResult(4, 8, {'Average VM Utilization of Mobile';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', '');
|
||||||
|
end
|
149
scripts/sample_app3/matlab/plotGenericResult.m
Normal file
149
scripts/sample_app3/matlab/plotGenericResult.m
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
function [] = plotGenericResult(rowOfset, columnOfset, yLabel, appType, calculatePercentage)
|
||||||
|
folderPath = getConfiguration(1);
|
||||||
|
numOfSimulations = getConfiguration(2);
|
||||||
|
startOfMobileDeviceLoop = getConfiguration(3);
|
||||||
|
stepOfMobileDeviceLoop = getConfiguration(4);
|
||||||
|
endOfMobileDeviceLoop = getConfiguration(5);
|
||||||
|
xTickLabelCoefficient = getConfiguration(6);
|
||||||
|
|
||||||
|
scenarioType = getConfiguration(7);
|
||||||
|
legends = getConfiguration(8);
|
||||||
|
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||||
|
|
||||||
|
pos=getConfiguration(9);
|
||||||
|
|
||||||
|
all_results = zeros(numOfSimulations, size(scenarioType,2), numOfMobileDevices);
|
||||||
|
min_results = zeros(size(scenarioType,2), numOfMobileDevices);
|
||||||
|
max_results = zeros(size(scenarioType,2), numOfMobileDevices);
|
||||||
|
|
||||||
|
for s=1:numOfSimulations
|
||||||
|
for i=1:size(scenarioType,2)
|
||||||
|
for j=1:numOfMobileDevices
|
||||||
|
try
|
||||||
|
mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
|
||||||
|
filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_MOBILE_PROCESSING_SCENARIO_',char(scenarioType(i)),'_',int2str(mobileDeviceNumber),'DEVICES_',appType,'_GENERIC.log');
|
||||||
|
|
||||||
|
readData = dlmread(filePath,';',rowOfset,0);
|
||||||
|
value = readData(1,columnOfset);
|
||||||
|
if(strcmp(calculatePercentage,'percentage_for_all'))
|
||||||
|
readData = dlmread(filePath,';',1,0);
|
||||||
|
totalTask = readData(1,1)+readData(1,2);
|
||||||
|
value = (100 * value) / totalTask;
|
||||||
|
elseif(strcmp(calculatePercentage,'percentage_for_completed'))
|
||||||
|
readData = dlmread(filePath,';',1,0);
|
||||||
|
totalTask = readData(1,1);
|
||||||
|
value = (100 * value) / totalTask;
|
||||||
|
elseif(strcmp(calculatePercentage,'percentage_for_failed'))
|
||||||
|
readData = dlmread(filePath,';',1,0);
|
||||||
|
totalTask = readData(1,2);
|
||||||
|
value = (100 * value) / totalTask;
|
||||||
|
end
|
||||||
|
|
||||||
|
all_results(s,i,j) = value;
|
||||||
|
catch err
|
||||||
|
error(err)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if(numOfSimulations == 1)
|
||||||
|
results = all_results;
|
||||||
|
else
|
||||||
|
results = mean(all_results); %still 3d matrix but 1xMxN format
|
||||||
|
end
|
||||||
|
|
||||||
|
results = squeeze(results); %remove singleton dimensions
|
||||||
|
|
||||||
|
for i=1:size(scenarioType,2)
|
||||||
|
for j=1:numOfMobileDevices
|
||||||
|
x=all_results(:,i,j); % Create Data
|
||||||
|
SEM = std(x)/sqrt(length(x)); % Standard Error
|
||||||
|
ts = tinv([0.05 0.95],length(x)-1); % T-Score
|
||||||
|
CI = mean(x) + ts*SEM; % Confidence Intervals
|
||||||
|
|
||||||
|
if(CI(1) < 0)
|
||||||
|
CI(1) = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
if(CI(2) < 0)
|
||||||
|
CI(2) = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
min_results(i,j) = results(i,j) - CI(1);
|
||||||
|
max_results(i,j) = CI(2) - results(i,j);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
types = zeros(1,numOfMobileDevices);
|
||||||
|
for i=1:numOfMobileDevices
|
||||||
|
types(i)=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||||
|
end
|
||||||
|
|
||||||
|
hFig = figure;
|
||||||
|
set(hFig, 'Units','centimeters');
|
||||||
|
set(hFig, 'Position',pos);
|
||||||
|
set(0,'DefaultAxesFontName','Times New Roman');
|
||||||
|
set(0,'DefaultTextFontName','Times New Roman');
|
||||||
|
set(0,'DefaultAxesFontSize',10);
|
||||||
|
set(0,'DefaultTextFontSize',12);
|
||||||
|
if(getConfiguration(20) == 1)
|
||||||
|
for i=1:1:numOfMobileDevices
|
||||||
|
xIndex=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||||
|
|
||||||
|
markers = getConfiguration(50);
|
||||||
|
for j=1:size(scenarioType,2)
|
||||||
|
plot(xIndex, results(j,i),char(markers(j)),'MarkerFaceColor',getConfiguration(20+j),'color',getConfiguration(20+j));
|
||||||
|
hold on;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for j=1:size(scenarioType,2)
|
||||||
|
if(getConfiguration(12) == 1)
|
||||||
|
errorbar(types, results(j,:), min_results(j,:),max_results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5);
|
||||||
|
else
|
||||||
|
plot(types, results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5);
|
||||||
|
end
|
||||||
|
hold on;
|
||||||
|
end
|
||||||
|
|
||||||
|
set(gca,'color','none');
|
||||||
|
else
|
||||||
|
markers = getConfiguration(40);
|
||||||
|
for j=1:size(scenarioType,2)
|
||||||
|
if(getConfiguration(12) == 1)
|
||||||
|
errorbar(types, results(j,:),min_results(j,:),max_results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2);
|
||||||
|
else
|
||||||
|
plot(types, results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2);
|
||||||
|
end
|
||||||
|
hold on;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
lgnd = legend(legends,'Location','NorthWest');
|
||||||
|
if(getConfiguration(20) == 1)
|
||||||
|
set(lgnd,'color','none');
|
||||||
|
end
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
axis square
|
||||||
|
xlabel(getConfiguration(10));
|
||||||
|
set(gca,'XTick', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop);
|
||||||
|
set(gca,'XTickLabel', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop);
|
||||||
|
ylabel(yLabel);
|
||||||
|
set(gca,'XLim',[startOfMobileDeviceLoop-5 endOfMobileDeviceLoop+5]);
|
||||||
|
|
||||||
|
set(get(gca,'Xlabel'),'FontSize',12)
|
||||||
|
set(get(gca,'Ylabel'),'FontSize',12)
|
||||||
|
set(lgnd,'FontSize',11)
|
||||||
|
|
||||||
|
if(getConfiguration(11) == 1)
|
||||||
|
set(hFig, 'PaperUnits', 'centimeters');
|
||||||
|
set(hFig, 'PaperPositionMode', 'manual');
|
||||||
|
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||||
|
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||||
|
filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType);
|
||||||
|
saveas(gcf, filename, 'pdf');
|
||||||
|
end
|
||||||
|
end
|
20
scripts/sample_app3/matlab/plotTaskFailureReason.m
Normal file
20
scripts/sample_app3/matlab/plotTaskFailureReason.m
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
function [] = plotTaskFailureReason()
|
||||||
|
|
||||||
|
plotGenericResult(1, 10, 'Failed Task due to VM Capacity (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
|
plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
|
plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
|
plotGenericResult(1, 11, 'Failed Task due to Mobility (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
|
||||||
|
plotGenericResult(1, 4, 'Failed Tasks due to Network failure (%)', 'ALL_APPS', 'percentage_for_failed');
|
||||||
|
plotGenericResult(1, 4, {'Failed Tasks due to Network failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'for_failed');
|
||||||
|
plotGenericResult(1, 4, {'Failed Tasks due to Network failure';'for Health App (%)'}, 'HEALTH_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 4, {'Failed Tasks due to Network failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'for_failed');
|
||||||
|
plotGenericResult(1, 4, {'Failed Tasks due to Network failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'for_failed');
|
||||||
|
end
|
@ -19,6 +19,8 @@ import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager;
|
|||||||
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_client.DefaultMobileDeviceManager;
|
import edu.boun.edgecloudsim.edge_client.DefaultMobileDeviceManager;
|
||||||
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.DefaultMobileServerManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||||
import edu.boun.edgecloudsim.mobility.NomadicMobility;
|
import edu.boun.edgecloudsim.mobility.NomadicMobility;
|
||||||
import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
|
import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
|
||||||
@ -72,7 +74,13 @@ public class SampleScenarioFactory implements ScenarioFactory {
|
|||||||
return new DefaultCloudServerManager();
|
return new DefaultCloudServerManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public MobileDeviceManager getMobileDeviceManager() throws Exception {
|
public MobileDeviceManager getMobileDeviceManager() throws Exception {
|
||||||
return new DefaultMobileDeviceManager();
|
return new DefaultMobileDeviceManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MobileServerManager getMobileServerManager() {
|
||||||
|
return new DefaultMobileServerManager();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
|||||||
import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager;
|
import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.DefaultMobileServerManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||||
import edu.boun.edgecloudsim.mobility.NomadicMobility;
|
import edu.boun.edgecloudsim.mobility.NomadicMobility;
|
||||||
import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
|
import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
|
||||||
@ -73,4 +75,9 @@ public class SampleScenarioFactory implements ScenarioFactory {
|
|||||||
public MobileDeviceManager getMobileDeviceManager() throws Exception {
|
public MobileDeviceManager getMobileDeviceManager() throws Exception {
|
||||||
return new SampleMobileDeviceManager();
|
return new SampleMobileDeviceManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MobileServerManager getMobileServerManager() {
|
||||||
|
return new DefaultMobileServerManager();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
131
src/edu/boun/edgecloudsim/applications/sample_app3/MainApp.java
Normal file
131
src/edu/boun/edgecloudsim/applications/sample_app3/MainApp.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Main Application
|
||||||
|
*
|
||||||
|
* Description: Main application for Sample App3
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Log;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.ScenarioFactory;
|
||||||
|
import edu.boun.edgecloudsim.core.SimManager;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||||
|
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||||
|
|
||||||
|
public class MainApp {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates main() to run this example
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//disable console output of cloudsim library
|
||||||
|
Log.disable();
|
||||||
|
|
||||||
|
//enable console ourput and file output of this application
|
||||||
|
SimLogger.enablePrintLog();
|
||||||
|
|
||||||
|
int iterationNumber = 1;
|
||||||
|
String configFile = "";
|
||||||
|
String outputFolder = "";
|
||||||
|
String edgeDevicesFile = "";
|
||||||
|
String applicationsFile = "";
|
||||||
|
if (args.length == 5){
|
||||||
|
configFile = args[0];
|
||||||
|
edgeDevicesFile = args[1];
|
||||||
|
applicationsFile = args[2];
|
||||||
|
outputFolder = args[3];
|
||||||
|
iterationNumber = Integer.parseInt(args[4]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
SimLogger.printLine("Simulation setting file, output folder and iteration number are not provided! Using default ones...");
|
||||||
|
configFile = "scripts/sample_app3/config/default_config.properties";
|
||||||
|
applicationsFile = "scripts/sample_app3/config/applications.xml";
|
||||||
|
edgeDevicesFile = "scripts/sample_app3/config/edge_devices.xml";
|
||||||
|
outputFolder = "sim_results/ite" + iterationNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
//load settings from configuration file
|
||||||
|
SimSettings SS = SimSettings.getInstance();
|
||||||
|
if(SS.initialize(configFile, edgeDevicesFile, applicationsFile) == false){
|
||||||
|
SimLogger.printLine("cannot initialize simulation settings!");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SS.getFileLoggingEnabled()){
|
||||||
|
SimLogger.enableFileLog();
|
||||||
|
SimUtils.cleanOutputFolder(outputFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
|
||||||
|
Date SimulationStartDate = Calendar.getInstance().getTime();
|
||||||
|
String now = df.format(SimulationStartDate);
|
||||||
|
SimLogger.printLine("Simulation started at " + now);
|
||||||
|
SimLogger.printLine("----------------------------------------------------------------------");
|
||||||
|
|
||||||
|
for(int j=SS.getMinNumOfMobileDev(); j<=SS.getMaxNumOfMobileDev(); j+=SS.getMobileDevCounterSize())
|
||||||
|
{
|
||||||
|
for(int k=0; k<SS.getSimulationScenarios().length; k++)
|
||||||
|
{
|
||||||
|
for(int i=0; i<SS.getOrchestratorPolicies().length; i++)
|
||||||
|
{
|
||||||
|
String simScenario = SS.getSimulationScenarios()[k];
|
||||||
|
String orchestratorPolicy = SS.getOrchestratorPolicies()[i];
|
||||||
|
Date ScenarioStartDate = Calendar.getInstance().getTime();
|
||||||
|
now = df.format(ScenarioStartDate);
|
||||||
|
|
||||||
|
SimLogger.printLine("Scenario started at " + now);
|
||||||
|
SimLogger.printLine("Scenario: " + simScenario + " - Policy: " + orchestratorPolicy + " - #iteration: " + iterationNumber);
|
||||||
|
SimLogger.printLine("Duration: " + SS.getSimulationTime()/60 + " min (warm up period: "+ SS.getWarmUpPeriod()/60 +" min) - #devices: " + j);
|
||||||
|
SimLogger.getInstance().simStarted(outputFolder,"SIMRESULT_" + simScenario + "_" + orchestratorPolicy + "_" + j + "DEVICES");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// First step: Initialize the CloudSim package. It should be called
|
||||||
|
// before creating any entities.
|
||||||
|
int num_user = 2; // number of grid users
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
boolean trace_flag = false; // mean trace events
|
||||||
|
|
||||||
|
// Initialize the CloudSim library
|
||||||
|
CloudSim.init(num_user, calendar, trace_flag, 0.01);
|
||||||
|
|
||||||
|
// Generate EdgeCloudsim Scenario Factory
|
||||||
|
ScenarioFactory sampleFactory = new SampleScenarioFactory(j,SS.getSimulationTime(), orchestratorPolicy, simScenario);
|
||||||
|
|
||||||
|
// Generate EdgeCloudSim Simulation Manager
|
||||||
|
SimManager manager = new SimManager(sampleFactory, j, simScenario, orchestratorPolicy);
|
||||||
|
|
||||||
|
// Start simulation
|
||||||
|
manager.startSimulation();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
SimLogger.printLine("The simulation has been terminated due to an unexpected error");
|
||||||
|
e.printStackTrace();
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Date ScenarioEndDate = Calendar.getInstance().getTime();
|
||||||
|
now = df.format(ScenarioEndDate);
|
||||||
|
SimLogger.printLine("Scenario finished at " + now + ". It took " + SimUtils.getTimeDifference(ScenarioStartDate,ScenarioEndDate));
|
||||||
|
SimLogger.printLine("----------------------------------------------------------------------");
|
||||||
|
}//End of orchestrators loop
|
||||||
|
}//End of scenarios loop
|
||||||
|
}//End of mobile devices loop
|
||||||
|
|
||||||
|
Date SimulationEndDate = Calendar.getInstance().getTime();
|
||||||
|
now = df.format(SimulationEndDate);
|
||||||
|
SimLogger.printLine("Simulation finished at " + now + ". It took " + SimUtils.getTimeDifference(SimulationStartDate,SimulationEndDate));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Edge Orchestrator
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* SampleEdgeOrchestrator offloads tasks to proper server
|
||||||
|
* In this scenario mobile devices can also execute tasks
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Vm;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
import org.cloudbus.cloudsim.core.SimEvent;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimManager;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||||
|
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.Task;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileVM;
|
||||||
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||||
|
|
||||||
|
public class SampleEdgeOrchestrator extends EdgeOrchestrator {
|
||||||
|
|
||||||
|
private int numberOfHost; //used by load balancer
|
||||||
|
|
||||||
|
public SampleEdgeOrchestrator(String _policy, String _simScenario) {
|
||||||
|
super(_policy, _simScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
numberOfHost=SimSettings.getInstance().getNumOfEdgeHosts();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator#getDeviceToOffload(edu.boun.edgecloudsim.edge_client.Task)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int getDeviceToOffload(Task task) {
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
if(policy.equals("ONLY_EDGE")){
|
||||||
|
result = SimSettings.GENERIC_EDGE_DEVICE_ID;
|
||||||
|
}
|
||||||
|
else if(policy.equals("ONLY_MOBILE")){
|
||||||
|
result = SimSettings.MOBILE_DATACENTER_ID;
|
||||||
|
}
|
||||||
|
else if(policy.equals("HYBRID")){
|
||||||
|
List<MobileVM> vmArray = SimManager.getInstance().getMobileServerManager().getVmList(task.getMobileDeviceId());
|
||||||
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(0).getVmType());
|
||||||
|
double targetVmCapacity = (double) 100 - vmArray.get(0).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||||
|
|
||||||
|
if (requiredCapacity <= targetVmCapacity)
|
||||||
|
result = SimSettings.MOBILE_DATACENTER_ID;
|
||||||
|
else
|
||||||
|
result = SimSettings.GENERIC_EDGE_DEVICE_ID;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Unknow edge orchestrator policy! Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vm getVmToOffload(Task task, int deviceId) {
|
||||||
|
Vm selectedVM = null;
|
||||||
|
|
||||||
|
if (deviceId == SimSettings.MOBILE_DATACENTER_ID) {
|
||||||
|
List<MobileVM> vmArray = SimManager.getInstance().getMobileServerManager().getVmList(task.getMobileDeviceId());
|
||||||
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(0).getVmType());
|
||||||
|
double targetVmCapacity = (double) 100 - vmArray.get(0).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||||
|
|
||||||
|
if (requiredCapacity <= targetVmCapacity)
|
||||||
|
selectedVM = vmArray.get(0);
|
||||||
|
}
|
||||||
|
else if(deviceId == SimSettings.GENERIC_EDGE_DEVICE_ID){
|
||||||
|
//Select VM on edge devices via Least Loaded algorithm!
|
||||||
|
double selectedVmCapacity = 0; //start with min value
|
||||||
|
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||||
|
List<EdgeVM> vmArray = SimManager.getInstance().getEdgeServerManager().getVmList(hostIndex);
|
||||||
|
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||||
|
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||||
|
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||||
|
if(requiredCapacity <= targetVmCapacity && targetVmCapacity > selectedVmCapacity){
|
||||||
|
selectedVM = vmArray.get(vmIndex);
|
||||||
|
selectedVmCapacity = targetVmCapacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
SimLogger.printLine("Unknown device id! The simulation has been terminated.");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return selectedVM;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processEvent(SimEvent arg0) {
|
||||||
|
// Nothing to do!
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutdownEntity() {
|
||||||
|
// Nothing to do!
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startEntity() {
|
||||||
|
// Nothing to do!
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,299 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Mobile Device Manager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Mobile Device Manager is one of the most important component
|
||||||
|
* in EdgeCloudSim. It is responsible for creating the tasks,
|
||||||
|
* submitting them to the related VM with respect to the
|
||||||
|
* Edge Orchestrator decision, and takes proper actions when
|
||||||
|
* the execution of the tasks are finished. It also feeds the
|
||||||
|
* SimLogger with the relevant results.
|
||||||
|
|
||||||
|
* SampleMobileDeviceManager sends tasks to the edge servers or
|
||||||
|
* mobile device processing unit.
|
||||||
|
*
|
||||||
|
* If you want to use different topology, you should modify
|
||||||
|
* the flow implemented in this class.
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.UtilizationModel;
|
||||||
|
import org.cloudbus.cloudsim.UtilizationModelFull;
|
||||||
|
import org.cloudbus.cloudsim.Vm;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSimTags;
|
||||||
|
import org.cloudbus.cloudsim.core.SimEvent;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimManager;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings.NETWORK_DELAY_TYPES;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings.VM_TYPES;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.Task;
|
||||||
|
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||||
|
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||||
|
import edu.boun.edgecloudsim.utils.Location;
|
||||||
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||||
|
|
||||||
|
public class SampleMobileDeviceManager extends MobileDeviceManager {
|
||||||
|
private static final int BASE = 100000; //start from base in order not to conflict cloudsim tag!
|
||||||
|
|
||||||
|
private static final int REQUEST_RECEIVED_BY_EDGE_DEVICE = BASE + 1;
|
||||||
|
private static final int REQUEST_RECEIVED_BY_MOBILE_DEVICE = BASE + 2;
|
||||||
|
private static final int RESPONSE_RECEIVED_BY_MOBILE_DEVICE = BASE + 3;
|
||||||
|
|
||||||
|
private int taskIdCounter=0;
|
||||||
|
|
||||||
|
public SampleMobileDeviceManager() throws Exception{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UtilizationModel getCpuUtilizationModel() {
|
||||||
|
return new CpuUtilizationModel_Custom();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startEntity() {
|
||||||
|
super.startEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit cloudlets to the created VMs.
|
||||||
|
*
|
||||||
|
* @pre $none
|
||||||
|
* @post $none
|
||||||
|
*/
|
||||||
|
protected void submitCloudlets() {
|
||||||
|
//do nothing!
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a cloudlet return event.
|
||||||
|
*
|
||||||
|
* @param ev a SimEvent object
|
||||||
|
* @pre ev != $null
|
||||||
|
* @post $none
|
||||||
|
*/
|
||||||
|
protected void processCloudletReturn(SimEvent ev) {
|
||||||
|
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||||
|
Task task = (Task) ev.getData();
|
||||||
|
|
||||||
|
SimLogger.getInstance().taskExecuted(task.getCloudletId());
|
||||||
|
|
||||||
|
if(task.getAssociatedDatacenterId() == SimSettings.GENERIC_EDGE_DEVICE_ID){
|
||||||
|
double delay = networkModel.getDownloadDelay(task.getAssociatedDatacenterId(), task.getMobileDeviceId(), task);
|
||||||
|
|
||||||
|
if(delay > 0)
|
||||||
|
{
|
||||||
|
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock()+delay);
|
||||||
|
if(task.getSubmittedLocation().getServingWlanId() == currentLocation.getServingWlanId())
|
||||||
|
{
|
||||||
|
networkModel.downloadStarted(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||||
|
SimLogger.getInstance().setDownloadDelay(task.getCloudletId(), delay, NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||||
|
|
||||||
|
schedule(getId(), delay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock(), NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(task.getAssociatedDatacenterId() == SimSettings.MOBILE_DATACENTER_ID) {
|
||||||
|
SimLogger.getInstance().taskEnded(task.getCloudletId(), CloudSim.clock());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: In this scenario device to device (D2D) communication is ignored.
|
||||||
|
* If you want to consider D2D communication, you should transmit the result
|
||||||
|
* of the task to the sender mobile device. Hence, you should calculate
|
||||||
|
* D2D_DELAY here and send the following event:
|
||||||
|
*
|
||||||
|
* schedule(getId(), delay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||||
|
*
|
||||||
|
* Please not that you should deal with the mobility and D2D delay calculation.
|
||||||
|
* The task can be failed due to the network bandwidth or the nobility.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Unknown datacenter id! Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processOtherEvent(SimEvent ev) {
|
||||||
|
if (ev == null) {
|
||||||
|
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - an event is null! Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||||
|
|
||||||
|
switch (ev.getTag()) {
|
||||||
|
case REQUEST_RECEIVED_BY_MOBILE_DEVICE:
|
||||||
|
{
|
||||||
|
Task task = (Task) ev.getData();
|
||||||
|
submitTaskToVm(task, SimSettings.VM_TYPES.MOBILE_VM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case REQUEST_RECEIVED_BY_EDGE_DEVICE:
|
||||||
|
{
|
||||||
|
Task task = (Task) ev.getData();
|
||||||
|
networkModel.uploadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||||
|
submitTaskToVm(task, SimSettings.VM_TYPES.EDGE_VM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RESPONSE_RECEIVED_BY_MOBILE_DEVICE:
|
||||||
|
{
|
||||||
|
Task task = (Task) ev.getData();
|
||||||
|
|
||||||
|
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||||
|
|
||||||
|
SimLogger.getInstance().taskEnded(task.getCloudletId(), CloudSim.clock());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
SimLogger.printLine(getName() + ".processOtherEvent(): " + "Error - event unknown by this DatacenterBroker. Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void submitTask(EdgeTask edgeTask) {
|
||||||
|
double delay = 0;
|
||||||
|
int nextEvent = 0;
|
||||||
|
int nextDeviceForNetworkModel = 0;
|
||||||
|
VM_TYPES vmType = null;
|
||||||
|
NETWORK_DELAY_TYPES delayType = null;
|
||||||
|
|
||||||
|
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||||
|
|
||||||
|
//create a task
|
||||||
|
Task task = createTask(edgeTask);
|
||||||
|
|
||||||
|
Location currentLocation = SimManager.getInstance().getMobilityModel().
|
||||||
|
getLocation(task.getMobileDeviceId(), CloudSim.clock());
|
||||||
|
|
||||||
|
//set location of the mobile device which generates this task
|
||||||
|
task.setSubmittedLocation(currentLocation);
|
||||||
|
|
||||||
|
//add related task to log list
|
||||||
|
SimLogger.getInstance().addLog(task.getCloudletId(),
|
||||||
|
task.getTaskType(),
|
||||||
|
(int)task.getCloudletLength(),
|
||||||
|
(int)task.getCloudletFileSize(),
|
||||||
|
(int)task.getCloudletOutputSize());
|
||||||
|
|
||||||
|
int nextHopId = SimManager.getInstance().getEdgeOrchestrator().getDeviceToOffload(task);
|
||||||
|
|
||||||
|
if(nextHopId == SimSettings.GENERIC_EDGE_DEVICE_ID){
|
||||||
|
delay = networkModel.getUploadDelay(task.getMobileDeviceId(), nextHopId, task);
|
||||||
|
vmType = SimSettings.VM_TYPES.EDGE_VM;
|
||||||
|
nextEvent = REQUEST_RECEIVED_BY_EDGE_DEVICE;
|
||||||
|
delayType = NETWORK_DELAY_TYPES.WLAN_DELAY;
|
||||||
|
nextDeviceForNetworkModel = SimSettings.GENERIC_EDGE_DEVICE_ID;
|
||||||
|
}
|
||||||
|
else if(nextHopId == SimSettings.MOBILE_DATACENTER_ID){
|
||||||
|
vmType = VM_TYPES.MOBILE_VM;
|
||||||
|
nextEvent = REQUEST_RECEIVED_BY_MOBILE_DEVICE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: In this scenario device to device (D2D) communication is ignored.
|
||||||
|
* If you want to consider D2D communication, you should calculate D2D
|
||||||
|
* network delay here.
|
||||||
|
*
|
||||||
|
* You should also add D2D_DELAY to the following enum in SimSettings
|
||||||
|
* public static enum NETWORK_DELAY_TYPES { WLAN_DELAY, MAN_DELAY, WAN_DELAY }
|
||||||
|
*
|
||||||
|
* If you want to get statistics of the D2D networking, you should modify
|
||||||
|
* SimLogger in a way to consider D2D_DELAY statistics.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Unknown nextHopId! Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(delay>0 || nextHopId == SimSettings.MOBILE_DATACENTER_ID){
|
||||||
|
|
||||||
|
Vm selectedVM = SimManager.getInstance().getEdgeOrchestrator().getVmToOffload(task, nextHopId);
|
||||||
|
|
||||||
|
if(selectedVM != null){
|
||||||
|
//set related host id
|
||||||
|
task.setAssociatedDatacenterId(nextHopId);
|
||||||
|
|
||||||
|
//set related host id
|
||||||
|
task.setAssociatedHostId(selectedVM.getHost().getId());
|
||||||
|
|
||||||
|
//set related vm id
|
||||||
|
task.setAssociatedVmId(selectedVM.getId());
|
||||||
|
|
||||||
|
//bind task to related VM
|
||||||
|
getCloudletList().add(task);
|
||||||
|
bindCloudletToVm(task.getCloudletId(), selectedVM.getId());
|
||||||
|
|
||||||
|
SimLogger.getInstance().taskStarted(task.getCloudletId(), CloudSim.clock());
|
||||||
|
|
||||||
|
if(nextHopId != SimSettings.MOBILE_DATACENTER_ID) {
|
||||||
|
networkModel.uploadStarted(task.getSubmittedLocation(), nextDeviceForNetworkModel);
|
||||||
|
SimLogger.getInstance().setUploadDelay(task.getCloudletId(), delay, delayType);
|
||||||
|
}
|
||||||
|
|
||||||
|
schedule(getId(), delay, nextEvent, task);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||||
|
SimLogger.getInstance().rejectedDueToVMCapacity(task.getCloudletId(), CloudSim.clock(), vmType.ordinal());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||||
|
SimLogger.getInstance().rejectedDueToBandwidth(task.getCloudletId(), CloudSim.clock(), vmType.ordinal(), delayType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void submitTaskToVm(Task task, SimSettings.VM_TYPES vmType) {
|
||||||
|
//SimLogger.printLine(CloudSim.clock() + ": Cloudlet#" + task.getCloudletId() + " is submitted to VM#" + task.getVmId());
|
||||||
|
schedule(getVmsToDatacentersMap().get(task.getVmId()), 0, CloudSimTags.CLOUDLET_SUBMIT, task);
|
||||||
|
|
||||||
|
SimLogger.getInstance().taskAssigned(task.getCloudletId(),
|
||||||
|
task.getAssociatedDatacenterId(),
|
||||||
|
task.getAssociatedHostId(),
|
||||||
|
task.getAssociatedVmId(),
|
||||||
|
vmType.ordinal());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task createTask(EdgeTask edgeTask){
|
||||||
|
UtilizationModel utilizationModel = new UtilizationModelFull(); /*UtilizationModelStochastic*/
|
||||||
|
UtilizationModel utilizationModelCPU = getCpuUtilizationModel();
|
||||||
|
|
||||||
|
Task task = new Task(edgeTask.mobileDeviceId, ++taskIdCounter,
|
||||||
|
edgeTask.length, edgeTask.pesNumber,
|
||||||
|
edgeTask.inputFileSize, edgeTask.outputFileSize,
|
||||||
|
utilizationModelCPU, utilizationModel, utilizationModel);
|
||||||
|
|
||||||
|
//set the owner of this task
|
||||||
|
task.setUserId(this.getId());
|
||||||
|
task.setTaskType(edgeTask.taskType);
|
||||||
|
|
||||||
|
if (utilizationModelCPU instanceof CpuUtilizationModel_Custom) {
|
||||||
|
((CpuUtilizationModel_Custom)utilizationModelCPU).setTask(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Mobile Server Manager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* VehicularDefaultMobileServerManager is responsible for creating
|
||||||
|
* mobile datacenters, hosts and VMs.
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
|
||||||
|
import org.cloudbus.cloudsim.Datacenter;
|
||||||
|
import org.cloudbus.cloudsim.DatacenterCharacteristics;
|
||||||
|
import org.cloudbus.cloudsim.Host;
|
||||||
|
import org.cloudbus.cloudsim.Pe;
|
||||||
|
import org.cloudbus.cloudsim.Storage;
|
||||||
|
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||||
|
import org.cloudbus.cloudsim.VmSchedulerSpaceShared;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
|
||||||
|
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
|
||||||
|
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimManager;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileHost;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileVM;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileVmAllocationPolicy_Custom;
|
||||||
|
|
||||||
|
public class SampleMobileServerManager extends MobileServerManager{
|
||||||
|
private int numOfMobileDevices=0;
|
||||||
|
|
||||||
|
public SampleMobileServerManager(int _numOfMobileDevices) {
|
||||||
|
numOfMobileDevices=_numOfMobileDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> list, int dataCenterIndex) {
|
||||||
|
return new MobileVmAllocationPolicy_Custom(list, dataCenterIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startDatacenters() throws Exception {
|
||||||
|
//in the initial version, each mobile device has a separate datacenter
|
||||||
|
//however, this approach encounters with out of memory (oom) problem.
|
||||||
|
//therefore, we use single datacenter for all mobile devices!
|
||||||
|
localDatacenter = createDatacenter(SimSettings.MOBILE_DATACENTER_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void terminateDatacenters() {
|
||||||
|
localDatacenter.shutdownEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createVmList(int brockerId) {
|
||||||
|
//VMs should have unique IDs, so create Mobile VMs after Edge+Cloud VMs
|
||||||
|
int vmCounter=SimSettings.getInstance().getNumOfEdgeVMs() + SimSettings.getInstance().getNumOfCloudVMs();
|
||||||
|
|
||||||
|
//Create VMs for each hosts
|
||||||
|
//Note that each mobile device has one host with one VM!
|
||||||
|
for (int i = 0; i < numOfMobileDevices; i++) {
|
||||||
|
vmList.add(i, new ArrayList<MobileVM>());
|
||||||
|
|
||||||
|
String vmm = "Xen";
|
||||||
|
int numOfCores = SimSettings.getInstance().getCoreForMobileVM();
|
||||||
|
double mips = SimSettings.getInstance().getMipsForMobileVM();
|
||||||
|
int ram = SimSettings.getInstance().getRamForMobileVM();
|
||||||
|
long storage = SimSettings.getInstance().getStorageForMobileVM();
|
||||||
|
long bandwidth = 0;
|
||||||
|
|
||||||
|
//VM Parameters
|
||||||
|
MobileVM vm = new MobileVM(vmCounter, brockerId, mips, numOfCores, ram, bandwidth, storage, vmm, new CloudletSchedulerTimeShared());
|
||||||
|
vmList.get(i).add(vm);
|
||||||
|
vmCounter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getAvgUtilization() {
|
||||||
|
double totalUtilization = 0;
|
||||||
|
double vmCounter = 0;
|
||||||
|
|
||||||
|
List<? extends Host> list = localDatacenter.getHostList();
|
||||||
|
// for each host...
|
||||||
|
for (int hostIndex=0; hostIndex < list.size(); hostIndex++) {
|
||||||
|
List<MobileVM> vmArray = SimManager.getInstance().getMobileServerManager().getVmList(hostIndex);
|
||||||
|
//for each vm...
|
||||||
|
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||||
|
totalUtilization += vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||||
|
vmCounter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalUtilization / vmCounter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Datacenter createDatacenter(int index) throws Exception{
|
||||||
|
String arch = "x86";
|
||||||
|
String os = "Linux";
|
||||||
|
String vmm = "Xen";
|
||||||
|
double costPerBw = 0;
|
||||||
|
double costPerSec = 0;
|
||||||
|
double costPerMem = 0;
|
||||||
|
double costPerStorage = 0;
|
||||||
|
|
||||||
|
List<MobileHost> hostList=createHosts();
|
||||||
|
|
||||||
|
String name = "MobileDatacenter_" + Integer.toString(index);
|
||||||
|
double time_zone = 3.0; // time zone this resource located
|
||||||
|
LinkedList<Storage> storageList = new LinkedList<Storage>(); //we are not adding SAN devices by now
|
||||||
|
|
||||||
|
// 5. Create a DatacenterCharacteristics object that stores the
|
||||||
|
// properties of a data center: architecture, OS, list of
|
||||||
|
// Machines, allocation policy: time- or space-shared, time zone
|
||||||
|
// and its price (G$/Pe time unit).
|
||||||
|
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
|
||||||
|
arch, os, vmm, hostList, time_zone, costPerSec, costPerMem, costPerStorage, costPerBw);
|
||||||
|
|
||||||
|
// 6. Finally, we need to create a PowerDatacenter object.
|
||||||
|
Datacenter datacenter = null;
|
||||||
|
|
||||||
|
VmAllocationPolicy vm_policy = getVmAllocationPolicy(hostList,index);
|
||||||
|
datacenter = new Datacenter(name, characteristics, vm_policy, storageList, 0);
|
||||||
|
|
||||||
|
return datacenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MobileHost> createHosts(){
|
||||||
|
// Here are the steps needed to create a PowerDatacenter:
|
||||||
|
// 1. We need to create a list to store one or more Machines
|
||||||
|
List<MobileHost> hostList = new ArrayList<MobileHost>();
|
||||||
|
|
||||||
|
for (int i = 0; i < numOfMobileDevices; i++) {
|
||||||
|
|
||||||
|
int numOfCores = SimSettings.getInstance().getCoreForMobileVM();
|
||||||
|
double mips = SimSettings.getInstance().getMipsForMobileVM();
|
||||||
|
int ram = SimSettings.getInstance().getRamForMobileVM();
|
||||||
|
long storage = SimSettings.getInstance().getStorageForMobileVM();
|
||||||
|
long bandwidth = 0;
|
||||||
|
|
||||||
|
// 2. A Machine contains one or more PEs or CPUs/Cores. Therefore, should
|
||||||
|
// create a list to store these PEs before creating
|
||||||
|
// a Machine.
|
||||||
|
List<Pe> peList = new ArrayList<Pe>();
|
||||||
|
|
||||||
|
// 3. Create PEs and add these into the list.
|
||||||
|
//for a quad-core machine, a list of 4 PEs is required:
|
||||||
|
for(int j=0; j<numOfCores; j++){
|
||||||
|
peList.add(new Pe(j, new PeProvisionerSimple(mips))); // need to store Pe id and MIPS Rating
|
||||||
|
}
|
||||||
|
|
||||||
|
//4. Create Hosts with its id and list of PEs and add them to the list of machines
|
||||||
|
MobileHost host = new MobileHost(
|
||||||
|
//Hosts should have unique IDs, so create Mobile Hosts after Edge+Cloud Hosts
|
||||||
|
i+SimSettings.getInstance().getNumOfEdgeHosts()+SimSettings.getInstance().getNumOfCoudHost(),
|
||||||
|
new RamProvisionerSimple(ram),
|
||||||
|
new BwProvisionerSimple(bandwidth), //kbps
|
||||||
|
storage,
|
||||||
|
peList,
|
||||||
|
new VmSchedulerSpaceShared(peList)
|
||||||
|
);
|
||||||
|
|
||||||
|
host.setMobileDeviceId(i);
|
||||||
|
hostList.add(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hostList;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Network Model
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* SampleNetworkModel uses
|
||||||
|
* the result of an empirical study for the WLAN delay
|
||||||
|
* The experimental network model is developed
|
||||||
|
* by taking measurements from the real life deployments.
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimManager;
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.Task;
|
||||||
|
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||||
|
import edu.boun.edgecloudsim.utils.Location;
|
||||||
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||||
|
|
||||||
|
public class SampleNetworkModel extends NetworkModel {
|
||||||
|
private int[] wlanClients;
|
||||||
|
|
||||||
|
public static final double[] experimentalWlanDelay = {
|
||||||
|
/*1 Client*/ 88040.279 /*(Kbps)*/,
|
||||||
|
/*2 Clients*/ 45150.982 /*(Kbps)*/,
|
||||||
|
/*3 Clients*/ 30303.641 /*(Kbps)*/,
|
||||||
|
/*4 Clients*/ 27617.211 /*(Kbps)*/,
|
||||||
|
/*5 Clients*/ 24868.616 /*(Kbps)*/,
|
||||||
|
/*6 Clients*/ 22242.296 /*(Kbps)*/,
|
||||||
|
/*7 Clients*/ 20524.064 /*(Kbps)*/,
|
||||||
|
/*8 Clients*/ 18744.889 /*(Kbps)*/,
|
||||||
|
/*9 Clients*/ 17058.827 /*(Kbps)*/,
|
||||||
|
/*10 Clients*/ 15690.455 /*(Kbps)*/,
|
||||||
|
/*11 Clients*/ 14127.744 /*(Kbps)*/,
|
||||||
|
/*12 Clients*/ 13522.408 /*(Kbps)*/,
|
||||||
|
/*13 Clients*/ 13177.631 /*(Kbps)*/,
|
||||||
|
/*14 Clients*/ 12811.330 /*(Kbps)*/,
|
||||||
|
/*15 Clients*/ 12584.387 /*(Kbps)*/,
|
||||||
|
/*15 Clients*/ 12135.161 /*(Kbps)*/,
|
||||||
|
/*16 Clients*/ 11705.638 /*(Kbps)*/,
|
||||||
|
/*17 Clients*/ 11276.116 /*(Kbps)*/,
|
||||||
|
/*18 Clients*/ 10846.594 /*(Kbps)*/,
|
||||||
|
/*19 Clients*/ 10417.071 /*(Kbps)*/,
|
||||||
|
/*20 Clients*/ 9987.549 /*(Kbps)*/,
|
||||||
|
/*21 Clients*/ 9367.587 /*(Kbps)*/,
|
||||||
|
/*22 Clients*/ 8747.625 /*(Kbps)*/,
|
||||||
|
/*23 Clients*/ 8127.663 /*(Kbps)*/,
|
||||||
|
/*24 Clients*/ 7907.701 /*(Kbps)*/,
|
||||||
|
/*25 Clients*/ 7887.739 /*(Kbps)*/,
|
||||||
|
/*26 Clients*/ 7690.831 /*(Kbps)*/,
|
||||||
|
/*27 Clients*/ 7393.922 /*(Kbps)*/,
|
||||||
|
/*28 Clients*/ 7297.014 /*(Kbps)*/,
|
||||||
|
/*29 Clients*/ 7100.106 /*(Kbps)*/,
|
||||||
|
/*30 Clients*/ 6903.197 /*(Kbps)*/,
|
||||||
|
/*31 Clients*/ 6701.986 /*(Kbps)*/,
|
||||||
|
/*32 Clients*/ 6500.776 /*(Kbps)*/,
|
||||||
|
/*33 Clients*/ 6399.565 /*(Kbps)*/,
|
||||||
|
/*34 Clients*/ 6098.354 /*(Kbps)*/,
|
||||||
|
/*35 Clients*/ 5897.143 /*(Kbps)*/,
|
||||||
|
/*36 Clients*/ 5552.127 /*(Kbps)*/,
|
||||||
|
/*37 Clients*/ 5207.111 /*(Kbps)*/,
|
||||||
|
/*38 Clients*/ 4862.096 /*(Kbps)*/,
|
||||||
|
/*39 Clients*/ 4517.080 /*(Kbps)*/,
|
||||||
|
/*40 Clients*/ 4172.064 /*(Kbps)*/,
|
||||||
|
/*41 Clients*/ 4092.922 /*(Kbps)*/,
|
||||||
|
/*42 Clients*/ 4013.781 /*(Kbps)*/,
|
||||||
|
/*43 Clients*/ 3934.639 /*(Kbps)*/,
|
||||||
|
/*44 Clients*/ 3855.498 /*(Kbps)*/,
|
||||||
|
/*45 Clients*/ 3776.356 /*(Kbps)*/,
|
||||||
|
/*46 Clients*/ 3697.215 /*(Kbps)*/,
|
||||||
|
/*47 Clients*/ 3618.073 /*(Kbps)*/,
|
||||||
|
/*48 Clients*/ 3538.932 /*(Kbps)*/,
|
||||||
|
/*49 Clients*/ 3459.790 /*(Kbps)*/,
|
||||||
|
/*50 Clients*/ 3380.649 /*(Kbps)*/,
|
||||||
|
/*51 Clients*/ 3274.611 /*(Kbps)*/,
|
||||||
|
/*52 Clients*/ 3168.573 /*(Kbps)*/,
|
||||||
|
/*53 Clients*/ 3062.536 /*(Kbps)*/,
|
||||||
|
/*54 Clients*/ 2956.498 /*(Kbps)*/,
|
||||||
|
/*55 Clients*/ 2850.461 /*(Kbps)*/,
|
||||||
|
/*56 Clients*/ 2744.423 /*(Kbps)*/,
|
||||||
|
/*57 Clients*/ 2638.386 /*(Kbps)*/,
|
||||||
|
/*58 Clients*/ 2532.348 /*(Kbps)*/,
|
||||||
|
/*59 Clients*/ 2426.310 /*(Kbps)*/,
|
||||||
|
/*60 Clients*/ 2320.273 /*(Kbps)*/,
|
||||||
|
/*61 Clients*/ 2283.828 /*(Kbps)*/,
|
||||||
|
/*62 Clients*/ 2247.383 /*(Kbps)*/,
|
||||||
|
/*63 Clients*/ 2210.939 /*(Kbps)*/,
|
||||||
|
/*64 Clients*/ 2174.494 /*(Kbps)*/,
|
||||||
|
/*65 Clients*/ 2138.049 /*(Kbps)*/,
|
||||||
|
/*66 Clients*/ 2101.604 /*(Kbps)*/,
|
||||||
|
/*67 Clients*/ 2065.160 /*(Kbps)*/,
|
||||||
|
/*68 Clients*/ 2028.715 /*(Kbps)*/,
|
||||||
|
/*69 Clients*/ 1992.270 /*(Kbps)*/,
|
||||||
|
/*70 Clients*/ 1955.825 /*(Kbps)*/,
|
||||||
|
/*71 Clients*/ 1946.788 /*(Kbps)*/,
|
||||||
|
/*72 Clients*/ 1937.751 /*(Kbps)*/,
|
||||||
|
/*73 Clients*/ 1928.714 /*(Kbps)*/,
|
||||||
|
/*74 Clients*/ 1919.677 /*(Kbps)*/,
|
||||||
|
/*75 Clients*/ 1910.640 /*(Kbps)*/,
|
||||||
|
/*76 Clients*/ 1901.603 /*(Kbps)*/,
|
||||||
|
/*77 Clients*/ 1892.566 /*(Kbps)*/,
|
||||||
|
/*78 Clients*/ 1883.529 /*(Kbps)*/,
|
||||||
|
/*79 Clients*/ 1874.492 /*(Kbps)*/,
|
||||||
|
/*80 Clients*/ 1865.455 /*(Kbps)*/,
|
||||||
|
/*81 Clients*/ 1833.185 /*(Kbps)*/,
|
||||||
|
/*82 Clients*/ 1800.915 /*(Kbps)*/,
|
||||||
|
/*83 Clients*/ 1768.645 /*(Kbps)*/,
|
||||||
|
/*84 Clients*/ 1736.375 /*(Kbps)*/,
|
||||||
|
/*85 Clients*/ 1704.106 /*(Kbps)*/,
|
||||||
|
/*86 Clients*/ 1671.836 /*(Kbps)*/,
|
||||||
|
/*87 Clients*/ 1639.566 /*(Kbps)*/,
|
||||||
|
/*88 Clients*/ 1607.296 /*(Kbps)*/,
|
||||||
|
/*89 Clients*/ 1575.026 /*(Kbps)*/,
|
||||||
|
/*90 Clients*/ 1542.756 /*(Kbps)*/,
|
||||||
|
/*91 Clients*/ 1538.544 /*(Kbps)*/,
|
||||||
|
/*92 Clients*/ 1534.331 /*(Kbps)*/,
|
||||||
|
/*93 Clients*/ 1530.119 /*(Kbps)*/,
|
||||||
|
/*94 Clients*/ 1525.906 /*(Kbps)*/,
|
||||||
|
/*95 Clients*/ 1521.694 /*(Kbps)*/,
|
||||||
|
/*96 Clients*/ 1517.481 /*(Kbps)*/,
|
||||||
|
/*97 Clients*/ 1513.269 /*(Kbps)*/,
|
||||||
|
/*98 Clients*/ 1509.056 /*(Kbps)*/,
|
||||||
|
/*99 Clients*/ 1504.844 /*(Kbps)*/,
|
||||||
|
/*100 Clients*/ 1500.631 /*(Kbps)*/
|
||||||
|
};
|
||||||
|
|
||||||
|
public SampleNetworkModel(int _numberOfMobileDevices, String _simScenario) {
|
||||||
|
super(_numberOfMobileDevices, _simScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
wlanClients = new int[SimSettings.getInstance().getNumOfEdgeDatacenters()]; //we have one access point for each datacenter
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* source device is always mobile device in our simulation scenarios!
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public double getUploadDelay(int sourceDeviceId, int destDeviceId, Task task) {
|
||||||
|
double delay = 0;
|
||||||
|
|
||||||
|
//mobile device to edge device (wifi access point)
|
||||||
|
if (destDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
delay = getWlanUploadDelay(task.getSubmittedLocation(), task.getCloudletFileSize());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in getUploadDelay(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
return delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* destination device is always mobile device in our simulation scenarios!
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public double getDownloadDelay(int sourceDeviceId, int destDeviceId, Task task) {
|
||||||
|
double delay = 0;
|
||||||
|
|
||||||
|
Location accessPointLocation = SimManager.getInstance().getMobilityModel().getLocation(destDeviceId,CloudSim.clock());
|
||||||
|
|
||||||
|
//edge device (wifi access point) to mobile device
|
||||||
|
if (sourceDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
delay = getWlanDownloadDelay(accessPointLocation, task.getCloudletOutputSize());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in getDownloadDelay(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uploadStarted(Location accessPointLocation, int destDeviceId) {
|
||||||
|
if (destDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
wlanClients[accessPointLocation.getServingWlanId()]++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in uploadStarted(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uploadFinished(Location accessPointLocation, int destDeviceId) {
|
||||||
|
if (destDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
wlanClients[accessPointLocation.getServingWlanId()]--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in uploadFinished(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void downloadStarted(Location accessPointLocation, int sourceDeviceId) {
|
||||||
|
if(sourceDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
wlanClients[accessPointLocation.getServingWlanId()]++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in downloadStarted(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void downloadFinished(Location accessPointLocation, int sourceDeviceId) {
|
||||||
|
if(sourceDeviceId == SimSettings.GENERIC_EDGE_DEVICE_ID) {
|
||||||
|
wlanClients[accessPointLocation.getServingWlanId()]--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimLogger.printLine("Error - unknown device id in downloadFinished(). Terminating simulation...");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getWlanDownloadDelay(Location accessPointLocation, double dataSize) {
|
||||||
|
int numOfWlanUser = wlanClients[accessPointLocation.getServingWlanId()];
|
||||||
|
double taskSizeInKb = dataSize * (double)8; //KB to Kb
|
||||||
|
double result=0;
|
||||||
|
|
||||||
|
if(numOfWlanUser < 0)
|
||||||
|
System.out.println("--> ");
|
||||||
|
|
||||||
|
if(numOfWlanUser < experimentalWlanDelay.length)
|
||||||
|
result = taskSizeInKb /*Kb*/ / (experimentalWlanDelay[numOfWlanUser] * (double) 3 ) /*Kbps*/; //802.11ac is around 3 times faster than 802.11n
|
||||||
|
|
||||||
|
//System.out.println("--> " + numOfWlanUser + " user, " + taskSizeInKb + " KB, " +result + " sec");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//wlan upload and download delay is symmetric in this model
|
||||||
|
private double getWlanUploadDelay(Location accessPointLocation, double dataSize) {
|
||||||
|
return getWlanDownloadDelay(accessPointLocation, dataSize);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Scenario Factory
|
||||||
|
*
|
||||||
|
* Description: Sample scenario factory providing the default
|
||||||
|
* instances of required abstract classes
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.applications.sample_app3;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
|
||||||
|
import edu.boun.edgecloudsim.cloud_server.DefaultCloudServerManager;
|
||||||
|
import edu.boun.edgecloudsim.core.ScenarioFactory;
|
||||||
|
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||||
|
import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
|
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||||
|
import edu.boun.edgecloudsim.mobility.NomadicMobility;
|
||||||
|
import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator;
|
||||||
|
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
|
||||||
|
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||||
|
|
||||||
|
public class SampleScenarioFactory implements ScenarioFactory {
|
||||||
|
private int numOfMobileDevice;
|
||||||
|
private double simulationTime;
|
||||||
|
private String orchestratorPolicy;
|
||||||
|
private String simScenario;
|
||||||
|
|
||||||
|
SampleScenarioFactory(int _numOfMobileDevice,
|
||||||
|
double _simulationTime,
|
||||||
|
String _orchestratorPolicy,
|
||||||
|
String _simScenario){
|
||||||
|
orchestratorPolicy = _orchestratorPolicy;
|
||||||
|
numOfMobileDevice = _numOfMobileDevice;
|
||||||
|
simulationTime = _simulationTime;
|
||||||
|
simScenario = _simScenario;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LoadGeneratorModel getLoadGeneratorModel() {
|
||||||
|
return new IdleActiveLoadGenerator(numOfMobileDevice, simulationTime, simScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EdgeOrchestrator getEdgeOrchestrator() {
|
||||||
|
return new SampleEdgeOrchestrator(orchestratorPolicy, simScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MobilityModel getMobilityModel() {
|
||||||
|
return new NomadicMobility(numOfMobileDevice,simulationTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NetworkModel getNetworkModel() {
|
||||||
|
return new SampleNetworkModel(numOfMobileDevice, simScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EdgeServerManager getEdgeServerManager() {
|
||||||
|
return new DefaultEdgeServerManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CloudServerManager getCloudServerManager() {
|
||||||
|
return new DefaultCloudServerManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MobileDeviceManager getMobileDeviceManager() throws Exception {
|
||||||
|
return new SampleMobileDeviceManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MobileServerManager getMobileServerManager() {
|
||||||
|
return new SampleMobileServerManager(numOfMobileDevice);
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - CloudServerManager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* CloudServerManager is responsible for creating and terminating
|
||||||
|
* the cloud datacenters which operates the hosts and VMs.
|
||||||
|
* It also provides the list of VMs running on the hosts and
|
||||||
|
* the average utilization of all VMs.
|
||||||
|
*
|
||||||
|
* Please note that, EdgeCloudSim is built on top of CloudSim
|
||||||
|
* Therefore, all the computational units are handled by CloudSim
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
package edu.boun.edgecloudsim.cloud_server;
|
package edu.boun.edgecloudsim.cloud_server;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
||||||
* VM is created on which host locatied on the datacenters. For those
|
* VM is created on which host located on the datacenters. For those
|
||||||
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
||||||
* provide another concreate instance of VmAllocationPolicy via ScenarioFactory
|
* provide another concrete instance of VmAllocationPolicy via ScenarioFactory
|
||||||
*
|
*
|
||||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
@ -15,6 +15,7 @@ package edu.boun.edgecloudsim.core;
|
|||||||
|
|
||||||
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
|
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||||
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
||||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||||
@ -52,6 +53,11 @@ public interface ScenarioFactory {
|
|||||||
*/
|
*/
|
||||||
public CloudServerManager getCloudServerManager();
|
public CloudServerManager getCloudServerManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provides abstract Mobile Server Model
|
||||||
|
*/
|
||||||
|
public MobileServerManager getMobileServerManager();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* provides abstract Mobile Device Manager Model
|
* provides abstract Mobile Device Manager Model
|
||||||
*/
|
*/
|
||||||
|
@ -26,6 +26,7 @@ import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
|||||||
import edu.boun.edgecloudsim.edge_server.EdgeVmAllocationPolicy_Custom;
|
import edu.boun.edgecloudsim.edge_server.EdgeVmAllocationPolicy_Custom;
|
||||||
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
|
import edu.boun.edgecloudsim.cloud_server.CloudServerManager;
|
||||||
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||||
|
import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager;
|
||||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||||
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
|
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
|
||||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||||
@ -48,6 +49,7 @@ public class SimManager extends SimEntity {
|
|||||||
private EdgeOrchestrator edgeOrchestrator;
|
private EdgeOrchestrator edgeOrchestrator;
|
||||||
private EdgeServerManager edgeServerManager;
|
private EdgeServerManager edgeServerManager;
|
||||||
private CloudServerManager cloudServerManager;
|
private CloudServerManager cloudServerManager;
|
||||||
|
private MobileServerManager mobileServerManager;
|
||||||
private LoadGeneratorModel loadGeneratorModel;
|
private LoadGeneratorModel loadGeneratorModel;
|
||||||
private MobileDeviceManager mobileDeviceManager;
|
private MobileDeviceManager mobileDeviceManager;
|
||||||
|
|
||||||
@ -86,6 +88,10 @@ public class SimManager extends SimEntity {
|
|||||||
cloudServerManager = scenarioFactory.getCloudServerManager();
|
cloudServerManager = scenarioFactory.getCloudServerManager();
|
||||||
cloudServerManager.initialize();
|
cloudServerManager.initialize();
|
||||||
|
|
||||||
|
//Create Physical Servers on mobile devices
|
||||||
|
mobileServerManager = scenarioFactory.getMobileServerManager();
|
||||||
|
mobileServerManager.initialize();
|
||||||
|
|
||||||
//Create Client Manager
|
//Create Client Manager
|
||||||
mobileDeviceManager = scenarioFactory.getMobileDeviceManager();
|
mobileDeviceManager = scenarioFactory.getMobileDeviceManager();
|
||||||
mobileDeviceManager.initialize();
|
mobileDeviceManager.initialize();
|
||||||
@ -112,6 +118,10 @@ public class SimManager extends SimEntity {
|
|||||||
cloudServerManager.startDatacenters();
|
cloudServerManager.startDatacenters();
|
||||||
cloudServerManager.createVmList(mobileDeviceManager.getId());
|
cloudServerManager.createVmList(mobileDeviceManager.getId());
|
||||||
|
|
||||||
|
//Start Mobile Datacenters & Generate VMs
|
||||||
|
mobileServerManager.startDatacenters();
|
||||||
|
mobileServerManager.createVmList(mobileDeviceManager.getId());
|
||||||
|
|
||||||
CloudSim.startSimulation();
|
CloudSim.startSimulation();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +161,10 @@ public class SimManager extends SimEntity {
|
|||||||
return cloudServerManager;
|
return cloudServerManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MobileServerManager getMobileServerManager(){
|
||||||
|
return mobileServerManager;
|
||||||
|
}
|
||||||
|
|
||||||
public LoadGeneratorModel getLoadGeneratorModel(){
|
public LoadGeneratorModel getLoadGeneratorModel(){
|
||||||
return loadGeneratorModel;
|
return loadGeneratorModel;
|
||||||
}
|
}
|
||||||
@ -175,6 +189,11 @@ public class SimManager extends SimEntity {
|
|||||||
mobileDeviceManager.submitVmList(cloudServerManager.getVmList(i));
|
mobileDeviceManager.submitVmList(cloudServerManager.getVmList(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<numOfMobileDevice; i++){
|
||||||
|
if(mobileServerManager.getVmList(i) != null)
|
||||||
|
mobileDeviceManager.submitVmList(mobileServerManager.getVmList(i));
|
||||||
|
}
|
||||||
|
|
||||||
//Creation of tasks are scheduled here!
|
//Creation of tasks are scheduled here!
|
||||||
for(int i=0; i< loadGeneratorModel.getTaskList().size(); i++)
|
for(int i=0; i< loadGeneratorModel.getTaskList().size(); i++)
|
||||||
schedule(getId(), loadGeneratorModel.getTaskList().get(i).startTime, CREATE_TASK, loadGeneratorModel.getTaskList().get(i));
|
schedule(getId(), loadGeneratorModel.getTaskList().get(i).startTime, CREATE_TASK, loadGeneratorModel.getTaskList().get(i));
|
||||||
@ -212,7 +231,8 @@ public class SimManager extends SimEntity {
|
|||||||
SimLogger.getInstance().addVmUtilizationLog(
|
SimLogger.getInstance().addVmUtilizationLog(
|
||||||
CloudSim.clock(),
|
CloudSim.clock(),
|
||||||
edgeServerManager.getAvgUtilization(),
|
edgeServerManager.getAvgUtilization(),
|
||||||
cloudServerManager.getAvgUtilization());
|
cloudServerManager.getAvgUtilization(),
|
||||||
|
mobileServerManager.getAvgUtilization());
|
||||||
|
|
||||||
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
|
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
|
||||||
break;
|
break;
|
||||||
@ -247,5 +267,6 @@ public class SimManager extends SimEntity {
|
|||||||
public void shutdownEntity() {
|
public void shutdownEntity() {
|
||||||
edgeServerManager.terminateDatacenters();
|
edgeServerManager.terminateDatacenters();
|
||||||
cloudServerManager.terminateDatacenters();
|
cloudServerManager.terminateDatacenters();
|
||||||
|
mobileServerManager.terminateDatacenters();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,15 +36,16 @@ public class SimSettings {
|
|||||||
public static final double CLIENT_ACTIVITY_START_TIME = 10;
|
public static final double CLIENT_ACTIVITY_START_TIME = 10;
|
||||||
|
|
||||||
//enumarations for the VM types
|
//enumarations for the VM types
|
||||||
public static enum VM_TYPES { EDGE_VM, CLOUD_VM }
|
public static enum VM_TYPES { MOBILE_VM, EDGE_VM, CLOUD_VM }
|
||||||
|
|
||||||
//enumarations for the VM types
|
//enumarations for the VM types
|
||||||
public static enum NETWORK_DELAY_TYPES { WLAN_DELAY, MAN_DELAY, WAN_DELAY }
|
public static enum NETWORK_DELAY_TYPES { WLAN_DELAY, MAN_DELAY, WAN_DELAY }
|
||||||
|
|
||||||
//predifined IDs for the components.
|
//predifined IDs for the components.
|
||||||
public static final int CLOUD_DATACENTER_ID = 1000;
|
public static final int CLOUD_DATACENTER_ID = 1000;
|
||||||
public static final int EDGE_ORCHESTRATOR_ID = 1001;
|
public static final int MOBILE_DATACENTER_ID = 1001;
|
||||||
public static final int GENERIC_EDGE_DEVICE_ID = 1002;
|
public static final int EDGE_ORCHESTRATOR_ID = 1002;
|
||||||
|
public static final int GENERIC_EDGE_DEVICE_ID = 1003;
|
||||||
|
|
||||||
//delimiter for output file.
|
//delimiter for output file.
|
||||||
public static final String DELIMITER = ";";
|
public static final String DELIMITER = ";";
|
||||||
@ -78,6 +79,11 @@ public class SimSettings {
|
|||||||
private int RAM_FOR_CLOUD_VM; //MB
|
private int RAM_FOR_CLOUD_VM; //MB
|
||||||
private int STORAGE_FOR_CLOUD_VM; //Byte
|
private int STORAGE_FOR_CLOUD_VM; //Byte
|
||||||
|
|
||||||
|
private int CORE_FOR_VM;
|
||||||
|
private int MIPS_FOR_VM; //MIPS
|
||||||
|
private int RAM_FOR_VM; //MB
|
||||||
|
private int STORAGE_FOR_VM; //Byte
|
||||||
|
|
||||||
private String[] SIMULATION_SCENARIOS;
|
private String[] SIMULATION_SCENARIOS;
|
||||||
private String[] ORCHESTRATOR_POLICIES;
|
private String[] ORCHESTRATOR_POLICIES;
|
||||||
|
|
||||||
@ -152,6 +158,11 @@ public class SimSettings {
|
|||||||
RAM_FOR_CLOUD_VM = Integer.parseInt(prop.getProperty("ram_for_cloud_vm"));
|
RAM_FOR_CLOUD_VM = Integer.parseInt(prop.getProperty("ram_for_cloud_vm"));
|
||||||
STORAGE_FOR_CLOUD_VM = Integer.parseInt(prop.getProperty("storage_for_cloud_vm"));
|
STORAGE_FOR_CLOUD_VM = Integer.parseInt(prop.getProperty("storage_for_cloud_vm"));
|
||||||
|
|
||||||
|
RAM_FOR_VM = Integer.parseInt(prop.getProperty("ram_for_mobile_vm"));
|
||||||
|
CORE_FOR_VM = Integer.parseInt(prop.getProperty("core_for_mobile_vm"));
|
||||||
|
MIPS_FOR_VM = Integer.parseInt(prop.getProperty("mips_for_mobile_vm"));
|
||||||
|
STORAGE_FOR_VM = Integer.parseInt(prop.getProperty("storage_for_mobile_vm"));
|
||||||
|
|
||||||
ORCHESTRATOR_POLICIES = prop.getProperty("orchestrator_policies").split(",");
|
ORCHESTRATOR_POLICIES = prop.getProperty("orchestrator_policies").split(",");
|
||||||
|
|
||||||
SIMULATION_SCENARIOS = prop.getProperty("simulation_scenarios").split(",");
|
SIMULATION_SCENARIOS = prop.getProperty("simulation_scenarios").split(",");
|
||||||
@ -396,6 +407,38 @@ public class SimSettings {
|
|||||||
return STORAGE_FOR_CLOUD_VM;
|
return STORAGE_FOR_CLOUD_VM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns RAM of the mobile (processing unit) VMs
|
||||||
|
*/
|
||||||
|
public int getRamForMobileVM()
|
||||||
|
{
|
||||||
|
return RAM_FOR_VM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the number of cores for mobile VMs
|
||||||
|
*/
|
||||||
|
public int getCoreForMobileVM()
|
||||||
|
{
|
||||||
|
return CORE_FOR_VM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns MIPS of the mobile (processing unit) VMs
|
||||||
|
*/
|
||||||
|
public int getMipsForMobileVM()
|
||||||
|
{
|
||||||
|
return MIPS_FOR_VM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns Storage of the mobile (processing unit) VMs
|
||||||
|
*/
|
||||||
|
public int getStorageForMobileVM()
|
||||||
|
{
|
||||||
|
return STORAGE_FOR_VM;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns simulation screnarios as string
|
* returns simulation screnarios as string
|
||||||
*/
|
*/
|
||||||
@ -433,8 +476,9 @@ public class SimSettings {
|
|||||||
* [6] avg data download (KB)
|
* [6] avg data download (KB)
|
||||||
* [7] avg task length (MI)
|
* [7] avg task length (MI)
|
||||||
* [8] required # of cores
|
* [8] required # of cores
|
||||||
* [9] vm utilization on edge (%)
|
* [9] vm utilization on edge (%)
|
||||||
* [10] vm utilization on cloud (%)
|
* [10] vm utilization on cloud (%)
|
||||||
|
* [11] vm utilization on mobile (%)
|
||||||
*/
|
*/
|
||||||
public double[][] getTaskLookUpTable()
|
public double[][] getTaskLookUpTable()
|
||||||
{
|
{
|
||||||
@ -493,6 +537,7 @@ public class SimSettings {
|
|||||||
isElementPresent(appElement, "required_core");
|
isElementPresent(appElement, "required_core");
|
||||||
isElementPresent(appElement, "vm_utilization_on_edge");
|
isElementPresent(appElement, "vm_utilization_on_edge");
|
||||||
isElementPresent(appElement, "vm_utilization_on_cloud");
|
isElementPresent(appElement, "vm_utilization_on_cloud");
|
||||||
|
isElementPresent(appElement, "vm_utilization_on_mobile");
|
||||||
|
|
||||||
String taskName = appElement.getAttribute("name");
|
String taskName = appElement.getAttribute("name");
|
||||||
taskNames[i] = taskName;
|
taskNames[i] = taskName;
|
||||||
@ -508,6 +553,7 @@ public class SimSettings {
|
|||||||
double required_core = Double.parseDouble(appElement.getElementsByTagName("required_core").item(0).getTextContent());
|
double required_core = Double.parseDouble(appElement.getElementsByTagName("required_core").item(0).getTextContent());
|
||||||
double vm_utilization_on_edge = Double.parseDouble(appElement.getElementsByTagName("vm_utilization_on_edge").item(0).getTextContent());
|
double vm_utilization_on_edge = Double.parseDouble(appElement.getElementsByTagName("vm_utilization_on_edge").item(0).getTextContent());
|
||||||
double vm_utilization_on_cloud = Double.parseDouble(appElement.getElementsByTagName("vm_utilization_on_cloud").item(0).getTextContent());
|
double vm_utilization_on_cloud = Double.parseDouble(appElement.getElementsByTagName("vm_utilization_on_cloud").item(0).getTextContent());
|
||||||
|
double vm_utilization_on_mobile = Double.parseDouble(appElement.getElementsByTagName("vm_utilization_on_mobile").item(0).getTextContent());
|
||||||
|
|
||||||
taskLookUpTable[i][0] = usage_percentage; //usage percentage [0-100]
|
taskLookUpTable[i][0] = usage_percentage; //usage percentage [0-100]
|
||||||
taskLookUpTable[i][1] = prob_cloud_selection; //prob. of selecting cloud [0-100]
|
taskLookUpTable[i][1] = prob_cloud_selection; //prob. of selecting cloud [0-100]
|
||||||
@ -520,6 +566,7 @@ public class SimSettings {
|
|||||||
taskLookUpTable[i][8] = required_core; //required # of core
|
taskLookUpTable[i][8] = required_core; //required # of core
|
||||||
taskLookUpTable[i][9] = vm_utilization_on_edge; //vm utilization on edge vm [0-100]
|
taskLookUpTable[i][9] = vm_utilization_on_edge; //vm utilization on edge vm [0-100]
|
||||||
taskLookUpTable[i][10] = vm_utilization_on_cloud; //vm utilization on cloud vm [0-100]
|
taskLookUpTable[i][10] = vm_utilization_on_cloud; //vm utilization on cloud vm [0-100]
|
||||||
|
taskLookUpTable[i][11] = vm_utilization_on_mobile; //vm utilization on mobile vm [0-100]
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -36,6 +36,8 @@ public class CpuUtilizationModel_Custom implements UtilizationModel {
|
|||||||
int index = 9;
|
int index = 9;
|
||||||
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
||||||
index = 10;
|
index = 10;
|
||||||
|
else if(task.getAssociatedDatacenterId() == SimSettings.MOBILE_DATACENTER_ID)
|
||||||
|
index = 11;
|
||||||
|
|
||||||
return SimSettings.getInstance().getTaskLookUpTable()[task.getTaskType()][index];
|
return SimSettings.getInstance().getTaskLookUpTable()[task.getTaskType()][index];
|
||||||
}
|
}
|
||||||
@ -50,6 +52,8 @@ public class CpuUtilizationModel_Custom implements UtilizationModel {
|
|||||||
index = 9;
|
index = 9;
|
||||||
else if(_vmType == SimSettings.VM_TYPES.CLOUD_VM)
|
else if(_vmType == SimSettings.VM_TYPES.CLOUD_VM)
|
||||||
index = 10;
|
index = 10;
|
||||||
|
else if(_vmType == SimSettings.VM_TYPES.MOBILE_VM)
|
||||||
|
index = 11;
|
||||||
else{
|
else{
|
||||||
SimLogger.printLine("Unknown VM Type! Terminating simulation...");
|
SimLogger.printLine("Unknown VM Type! Terminating simulation...");
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
|
@ -154,7 +154,7 @@ public class DefaultMobileDeviceManager extends MobileDeviceManager {
|
|||||||
|
|
||||||
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
if(task.getAssociatedDatacenterId() == SimSettings.CLOUD_DATACENTER_ID)
|
||||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.CLOUD_DATACENTER_ID);
|
||||||
else
|
else if(task.getAssociatedDatacenterId() != SimSettings.MOBILE_DATACENTER_ID)
|
||||||
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
networkModel.downloadFinished(task.getSubmittedLocation(), SimSettings.GENERIC_EDGE_DEVICE_ID);
|
||||||
|
|
||||||
SimLogger.getInstance().taskEnded(task.getCloudletId(), CloudSim.clock());
|
SimLogger.getInstance().taskEnded(task.getCloudletId(), CloudSim.clock());
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Mobile Server Manager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* DefaultMobileServerManager is responsible for creating datacenters, hosts and VMs.
|
||||||
|
*
|
||||||
|
* Please note that the mobile processing units are simulated via
|
||||||
|
* CloudSim. It is assumed that the mobile devices operate Hosts
|
||||||
|
* and VMs like a server. That is why the class names are similar
|
||||||
|
* to other Cloud and Edge components (to provide consistency).
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.edge_client.mobile_processing_unit;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Host;
|
||||||
|
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||||
|
|
||||||
|
public class DefaultMobileServerManager extends MobileServerManager{
|
||||||
|
|
||||||
|
public DefaultMobileServerManager() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> list, int dataCenterIndex) {
|
||||||
|
return new MobileVmAllocationPolicy_Custom(list, dataCenterIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startDatacenters() throws Exception {
|
||||||
|
//local computation is not supported in default Mobile Device Manager
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void terminateDatacenters() {
|
||||||
|
//local computation is not supported in default Mobile Device Manager
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createVmList(int brockerId) {
|
||||||
|
//local computation is not supported in default Mobile Device Manager
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getAvgUtilization() {
|
||||||
|
//local computation is not supported in default Mobile Device Manager
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - MobileHost
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* MobileHost adds associated mobile device id information over CloudSim's Host class
|
||||||
|
*
|
||||||
|
* Please note that the mobile processing units are simulated via
|
||||||
|
* CloudSim. It is assumed that the mobile devices operate Hosts
|
||||||
|
* and VMs like a server. That is why the class names are similar
|
||||||
|
* to other Cloud and Edge components (to provide consistency).
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.edge_client.mobile_processing_unit;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Host;
|
||||||
|
import org.cloudbus.cloudsim.Pe;
|
||||||
|
import org.cloudbus.cloudsim.VmScheduler;
|
||||||
|
import org.cloudbus.cloudsim.provisioners.BwProvisioner;
|
||||||
|
import org.cloudbus.cloudsim.provisioners.RamProvisioner;
|
||||||
|
|
||||||
|
public class MobileHost extends Host {
|
||||||
|
private int mobileDeviceId;
|
||||||
|
|
||||||
|
public MobileHost(int id, RamProvisioner ramProvisioner,
|
||||||
|
BwProvisioner bwProvisioner, long storage,
|
||||||
|
List<? extends Pe> peList, VmScheduler vmScheduler) {
|
||||||
|
super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMobileDeviceId(int _mobileDeviceId){
|
||||||
|
mobileDeviceId=_mobileDeviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMobileDeviceId(){
|
||||||
|
return mobileDeviceId;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - MobileServerManager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* MobileServerManager is responsible for creating and terminating
|
||||||
|
* the mobile datacenters which operates the hosts and VMs.
|
||||||
|
* It also provides the list of VMs running on the hosts and
|
||||||
|
* the average utilization of all VMs.
|
||||||
|
*
|
||||||
|
* Please note that, EdgeCloudSim is built on top of CloudSim
|
||||||
|
* Therefore, all the computational units are handled by CloudSim
|
||||||
|
*
|
||||||
|
* The mobile processing units are simulated via CloudSim as well.
|
||||||
|
* It is assumed that the mobile devices operate Hosts and VMs
|
||||||
|
* like a server. That is why the class names are similar to other
|
||||||
|
* Cloud and Edge components.
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.edge_client.mobile_processing_unit;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Datacenter;
|
||||||
|
import org.cloudbus.cloudsim.Host;
|
||||||
|
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||||
|
|
||||||
|
public abstract class MobileServerManager {
|
||||||
|
protected Datacenter localDatacenter;
|
||||||
|
protected List<List<MobileVM>> vmList;
|
||||||
|
|
||||||
|
public MobileServerManager() {
|
||||||
|
vmList = new ArrayList<List<MobileVM>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MobileVM> getVmList(int hostId){
|
||||||
|
if(vmList.size() > hostId)
|
||||||
|
return vmList.get(hostId);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Datacenter getDatacenter(){
|
||||||
|
return localDatacenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialize edge server manager if needed
|
||||||
|
*/
|
||||||
|
public abstract void initialize();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* provides abstract Vm Allocation Policy for Mobile Datacenters
|
||||||
|
*/
|
||||||
|
public abstract VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> list, int dataCenterIndex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Starts Datacenters
|
||||||
|
*/
|
||||||
|
public abstract void startDatacenters() throws Exception;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Terminates Datacenters
|
||||||
|
*/
|
||||||
|
public abstract void terminateDatacenters();
|
||||||
|
/*
|
||||||
|
* Creates VM List
|
||||||
|
*/
|
||||||
|
public abstract void createVmList(int brockerId);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns average utilization of all VMs
|
||||||
|
*/
|
||||||
|
public abstract double getAvgUtilization();
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - MobileVM
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* MobileVM adds vm type information over CloudSim's VM class
|
||||||
|
*
|
||||||
|
* Please note that the mobile processing units are simulated via
|
||||||
|
* CloudSim. It is assumed that the mobile devices operate Hosts
|
||||||
|
* and VMs like a server. That is why the class names are similar
|
||||||
|
* to other Cloud and Edge components (to provide consistency).
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.edge_client.mobile_processing_unit;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.CloudletScheduler;
|
||||||
|
import org.cloudbus.cloudsim.Vm;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
|
||||||
|
public class MobileVM extends Vm {
|
||||||
|
private SimSettings.VM_TYPES type;
|
||||||
|
|
||||||
|
public MobileVM(int id, int userId, double mips, int numberOfPes, int ram,
|
||||||
|
long bw, long size, String vmm, CloudletScheduler cloudletScheduler) {
|
||||||
|
super(id, userId, mips, numberOfPes, ram, bw, size, vmm, cloudletScheduler);
|
||||||
|
|
||||||
|
type = SimSettings.VM_TYPES.MOBILE_VM;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimSettings.VM_TYPES getVmType(){
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - Custom VM Allocation Policy for Mobile Devices' VMs
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
||||||
|
* VM is created on which host located on the datacenters. For those
|
||||||
|
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
||||||
|
* provide another concrete instance of VmAllocationPolicy via ScenarioFactory
|
||||||
|
*
|
||||||
|
* Please note that the mobile processing units are simulated via
|
||||||
|
* CloudSim. It is assumed that the mobile devices operate Hosts
|
||||||
|
* and VMs like a server. That is why the class names are similar
|
||||||
|
* to other Cloud and Edge components (to provide consistency).
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
|
package edu.boun.edgecloudsim.edge_client.mobile_processing_unit;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.cloudbus.cloudsim.Host;
|
||||||
|
import org.cloudbus.cloudsim.Log;
|
||||||
|
import org.cloudbus.cloudsim.Vm;
|
||||||
|
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||||
|
import org.cloudbus.cloudsim.core.CloudSim;
|
||||||
|
|
||||||
|
import edu.boun.edgecloudsim.core.SimSettings;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Same as VmAllocationPolicySimple.
|
||||||
|
*/
|
||||||
|
public class MobileVmAllocationPolicy_Custom extends VmAllocationPolicy {
|
||||||
|
/** The vm table. */
|
||||||
|
private Map<String, Host> vmTable;
|
||||||
|
private static int createdVmNum;
|
||||||
|
private int DataCenterIndex;
|
||||||
|
|
||||||
|
public MobileVmAllocationPolicy_Custom(List<? extends Host> list, int _DataCenterIndex) {
|
||||||
|
super(list);
|
||||||
|
|
||||||
|
setVmTable(new HashMap<String, Host>());
|
||||||
|
DataCenterIndex = _DataCenterIndex;
|
||||||
|
createdVmNum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean allocateHostForVm(Vm vm) {
|
||||||
|
boolean result = false;
|
||||||
|
|
||||||
|
if (!getVmTable().containsKey(vm.getUid()) && vm instanceof MobileVM) { // if this vm was not created
|
||||||
|
int hostIndex = vm.getId() - SimSettings.getInstance().getNumOfEdgeVMs() - SimSettings.getInstance().getNumOfCloudVMs();
|
||||||
|
|
||||||
|
if(DataCenterIndex == SimSettings.MOBILE_DATACENTER_ID){
|
||||||
|
Host host = getHostList().get(hostIndex);
|
||||||
|
result = host.vmCreate(vm);
|
||||||
|
|
||||||
|
if (result) { // if vm were succesfully created in the host
|
||||||
|
getVmTable().put(vm.getUid(), host);
|
||||||
|
createdVmNum++;
|
||||||
|
Log.formatLine("%.2f: Mobile VM #" + vm.getId() + " has been allocated to the host #" + host.getId(),CloudSim.clock());
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean allocateHostForVm(Vm vm, Host host) {
|
||||||
|
if (host.vmCreate(vm)) { // if vm has been succesfully created in the host
|
||||||
|
getVmTable().put(vm.getUid(), host);
|
||||||
|
createdVmNum++;
|
||||||
|
|
||||||
|
Log.formatLine("%.2f: Mobile VM #" + vm.getId() + " has been allocated to the host #" + host.getId(),CloudSim.clock());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Map<String, Object>> optimizeAllocation(
|
||||||
|
List<? extends Vm> vmList) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deallocateHostForVm(Vm vm) {
|
||||||
|
Host host = getVmTable().remove(vm.getUid());
|
||||||
|
if (host != null) {
|
||||||
|
host.vmDestroy(vm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Host getHost(Vm vm) {
|
||||||
|
return getVmTable().get(vm.getUid());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Host getHost(int vmId, int userId) {
|
||||||
|
return getVmTable().get(Vm.getUid(userId, vmId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getCreatedVmNum(){
|
||||||
|
return createdVmNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the vm table.
|
||||||
|
*
|
||||||
|
* @return the vm table
|
||||||
|
*/
|
||||||
|
public Map<String, Host> getVmTable() {
|
||||||
|
return vmTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the vm table.
|
||||||
|
*
|
||||||
|
* @param vmTable the vm table
|
||||||
|
*/
|
||||||
|
protected void setVmTable(Map<String, Host> vmTable) {
|
||||||
|
this.vmTable = vmTable;
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Title: EdgeCloudSim - EdgeServerManager
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* EdgeServerManager is responsible for creating and terminating
|
||||||
|
* the edge datacenters which operates the hosts and VMs.
|
||||||
|
* It also provides the list of VMs running on the hosts and
|
||||||
|
* the average utilization of all VMs.
|
||||||
|
*
|
||||||
|
* Please note that, EdgeCloudSim is built on top of CloudSim
|
||||||
|
* Therefore, all the computational units are handled by CloudSim
|
||||||
|
*
|
||||||
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
*/
|
||||||
|
|
||||||
package edu.boun.edgecloudsim.edge_server;
|
package edu.boun.edgecloudsim.edge_server;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
||||||
* VM is created on which host locatied on the datacenters. For those
|
* VM is created on which host located on the datacenters. For those
|
||||||
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
||||||
* provide another concreate instance of VmAllocationPolicy via ScenarioFactory
|
* provide another concrete instance of VmAllocationPolicy via ScenarioFactory
|
||||||
*
|
*
|
||||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||||
|
@ -144,8 +144,8 @@ public class SimLogger {
|
|||||||
taskMap.get(taskId).taskFailedDueToMobility(time);
|
taskMap.get(taskId).taskFailedDueToMobility(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addVmUtilizationLog(double time, double loadOnEdge, double loadOnCloud) {
|
public void addVmUtilizationLog(double time, double loadOnEdge, double loadOnCloud, double loadOnMobile) {
|
||||||
vmLoadList.add(new VmLoadLogItem(time, loadOnEdge, loadOnCloud));
|
vmLoadList.add(new VmLoadLogItem(time, loadOnEdge, loadOnCloud, loadOnMobile));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void simStopped() throws IOException {
|
public void simStopped() throws IOException {
|
||||||
@ -166,32 +166,41 @@ public class SimLogger {
|
|||||||
int[] uncompletedTask = new int[numOfAppTypes + 1];
|
int[] uncompletedTask = new int[numOfAppTypes + 1];
|
||||||
int[] uncompletedTaskOnCloud = new int[numOfAppTypes + 1];
|
int[] uncompletedTaskOnCloud = new int[numOfAppTypes + 1];
|
||||||
int[] uncompletedTaskOnEdge = new int[numOfAppTypes + 1];
|
int[] uncompletedTaskOnEdge = new int[numOfAppTypes + 1];
|
||||||
|
int[] uncompletedTaskOnMobile = new int[numOfAppTypes + 1];
|
||||||
|
|
||||||
int[] completedTask = new int[numOfAppTypes + 1];
|
int[] completedTask = new int[numOfAppTypes + 1];
|
||||||
int[] completedTaskOnCloud = new int[numOfAppTypes + 1];
|
int[] completedTaskOnCloud = new int[numOfAppTypes + 1];
|
||||||
int[] completedTaskOnEdge = new int[numOfAppTypes + 1];
|
int[] completedTaskOnEdge = new int[numOfAppTypes + 1];
|
||||||
int[] completedTaskOnRemoteEdge = new int[numOfAppTypes + 1];
|
int[] completedTaskOnMobile = new int[numOfAppTypes + 1];
|
||||||
|
|
||||||
int[] failedTask = new int[numOfAppTypes + 1];
|
int[] failedTask = new int[numOfAppTypes + 1];
|
||||||
int[] failedTaskOnCloud = new int[numOfAppTypes + 1];
|
int[] failedTaskOnCloud = new int[numOfAppTypes + 1];
|
||||||
int[] failedTaskOnEdge = new int[numOfAppTypes + 1];
|
int[] failedTaskOnEdge = new int[numOfAppTypes + 1];
|
||||||
|
int[] failedTaskOnMobile = new int[numOfAppTypes + 1];
|
||||||
|
|
||||||
double[] networkDelay = new double[numOfAppTypes + 1];
|
double[] networkDelay = new double[numOfAppTypes + 1];
|
||||||
double[] wanDelay = new double[numOfAppTypes + 1];
|
double[] wanDelay = new double[numOfAppTypes + 1];
|
||||||
double[] manDelay = new double[numOfAppTypes + 1];
|
double[] manDelay = new double[numOfAppTypes + 1];
|
||||||
double[] lanDelay = new double[numOfAppTypes + 1];
|
double[] lanDelay = new double[numOfAppTypes + 1];
|
||||||
|
|
||||||
|
double[] wanUsage = new double[numOfAppTypes + 1];
|
||||||
|
double[] manUsage = new double[numOfAppTypes + 1];
|
||||||
|
double[] lanUsage = new double[numOfAppTypes + 1];
|
||||||
|
|
||||||
double[] serviceTime = new double[numOfAppTypes + 1];
|
double[] serviceTime = new double[numOfAppTypes + 1];
|
||||||
double[] serviceTimeOnCloud = new double[numOfAppTypes + 1];
|
double[] serviceTimeOnCloud = new double[numOfAppTypes + 1];
|
||||||
double[] serviceTimeOnEdge = new double[numOfAppTypes + 1];
|
double[] serviceTimeOnEdge = new double[numOfAppTypes + 1];
|
||||||
|
double[] serviceTimeOnMobile = new double[numOfAppTypes + 1];
|
||||||
|
|
||||||
double[] processingTime = new double[numOfAppTypes + 1];
|
double[] processingTime = new double[numOfAppTypes + 1];
|
||||||
double[] processingTimeOnCloud = new double[numOfAppTypes + 1];
|
double[] processingTimeOnCloud = new double[numOfAppTypes + 1];
|
||||||
double[] processingTimeOnEdge = new double[numOfAppTypes + 1];
|
double[] processingTimeOnEdge = new double[numOfAppTypes + 1];
|
||||||
|
double[] processingTimeOnMobile = new double[numOfAppTypes + 1];
|
||||||
|
|
||||||
int[] failedTaskDueToVmCapacity = new int[numOfAppTypes + 1];
|
int[] failedTaskDueToVmCapacity = new int[numOfAppTypes + 1];
|
||||||
int[] failedTaskDueToVmCapacityOnCloud = new int[numOfAppTypes + 1];
|
int[] failedTaskDueToVmCapacityOnCloud = new int[numOfAppTypes + 1];
|
||||||
int[] failedTaskDueToVmCapacityOnEdge = new int[numOfAppTypes + 1];
|
int[] failedTaskDueToVmCapacityOnEdge = new int[numOfAppTypes + 1];
|
||||||
|
int[] failedTaskDueToVmCapacityOnMobile = new int[numOfAppTypes + 1];
|
||||||
|
|
||||||
double[] cost = new double[numOfAppTypes + 1];
|
double[] cost = new double[numOfAppTypes + 1];
|
||||||
int[] failedTaskDuetoBw = new int[numOfAppTypes + 1];
|
int[] failedTaskDuetoBw = new int[numOfAppTypes + 1];
|
||||||
@ -260,7 +269,9 @@ public class SimLogger {
|
|||||||
|
|
||||||
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
||||||
completedTaskOnCloud[value.getTaskType()]++;
|
completedTaskOnCloud[value.getTaskType()]++;
|
||||||
else if (value.getVmType() == SimSettings.VM_TYPES.EDGE_VM.ordinal())
|
else if (value.getVmType() == SimSettings.VM_TYPES.MOBILE_VM.ordinal())
|
||||||
|
completedTaskOnMobile[value.getTaskType()]++;
|
||||||
|
else
|
||||||
completedTaskOnEdge[value.getTaskType()]++;
|
completedTaskOnEdge[value.getTaskType()]++;
|
||||||
}
|
}
|
||||||
else if(value.getStatus() == SimLogger.TASK_STATUS.CREATED ||
|
else if(value.getStatus() == SimLogger.TASK_STATUS.CREATED ||
|
||||||
@ -271,7 +282,9 @@ public class SimLogger {
|
|||||||
uncompletedTask[value.getTaskType()]++;
|
uncompletedTask[value.getTaskType()]++;
|
||||||
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
||||||
uncompletedTaskOnCloud[value.getTaskType()]++;
|
uncompletedTaskOnCloud[value.getTaskType()]++;
|
||||||
else if (value.getVmType() == SimSettings.VM_TYPES.EDGE_VM.ordinal())
|
else if (value.getVmType() == SimSettings.VM_TYPES.MOBILE_VM.ordinal())
|
||||||
|
uncompletedTaskOnMobile[value.getTaskType()]++;
|
||||||
|
else
|
||||||
uncompletedTaskOnEdge[value.getTaskType()]++;
|
uncompletedTaskOnEdge[value.getTaskType()]++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -279,7 +292,9 @@ public class SimLogger {
|
|||||||
|
|
||||||
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
||||||
failedTaskOnCloud[value.getTaskType()]++;
|
failedTaskOnCloud[value.getTaskType()]++;
|
||||||
else if (value.getVmType() == SimSettings.VM_TYPES.EDGE_VM.ordinal())
|
else if (value.getVmType() == SimSettings.VM_TYPES.MOBILE_VM.ordinal())
|
||||||
|
failedTaskOnMobile[value.getTaskType()]++;
|
||||||
|
else
|
||||||
failedTaskOnEdge[value.getTaskType()]++;
|
failedTaskOnEdge[value.getTaskType()]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,17 +304,29 @@ public class SimLogger {
|
|||||||
networkDelay[value.getTaskType()] += value.getNetworkDelay();
|
networkDelay[value.getTaskType()] += value.getNetworkDelay();
|
||||||
processingTime[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay());
|
processingTime[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay());
|
||||||
|
|
||||||
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal()) {
|
if(value.getNetworkDelay(NETWORK_DELAY_TYPES.WLAN_DELAY) != 0) {
|
||||||
wanDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.WAN_DELAY);
|
lanUsage[value.getTaskType()]++;
|
||||||
serviceTimeOnCloud[value.getTaskType()] += value.getServiceTime();
|
|
||||||
processingTimeOnCloud[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay(NETWORK_DELAY_TYPES.WAN_DELAY));
|
|
||||||
}
|
|
||||||
else if (value.getVmType() == SimSettings.VM_TYPES.EDGE_VM.ordinal()) {
|
|
||||||
if(value.getNetworkDelay(NETWORK_DELAY_TYPES.MAN_DELAY) != 0){
|
|
||||||
completedTaskOnRemoteEdge[value.getTaskType()]++;
|
|
||||||
manDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.MAN_DELAY);
|
|
||||||
}
|
|
||||||
lanDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.WLAN_DELAY);
|
lanDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.WLAN_DELAY);
|
||||||
|
}
|
||||||
|
if(value.getNetworkDelay(NETWORK_DELAY_TYPES.MAN_DELAY) != 0) {
|
||||||
|
manUsage[value.getTaskType()]++;
|
||||||
|
manDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.MAN_DELAY);
|
||||||
|
}
|
||||||
|
if(value.getNetworkDelay(NETWORK_DELAY_TYPES.WAN_DELAY) != 0) {
|
||||||
|
wanUsage[value.getTaskType()]++;
|
||||||
|
wanDelay[value.getTaskType()] += value.getNetworkDelay(NETWORK_DELAY_TYPES.WAN_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal()) {
|
||||||
|
serviceTimeOnCloud[value.getTaskType()] += value.getServiceTime();
|
||||||
|
processingTimeOnCloud[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay());
|
||||||
|
}
|
||||||
|
else if (value.getVmType() == SimSettings.VM_TYPES.MOBILE_VM.ordinal()) {
|
||||||
|
serviceTimeOnMobile[value.getTaskType()] += value.getServiceTime();
|
||||||
|
processingTimeOnMobile[value.getTaskType()] += value.getServiceTime();
|
||||||
|
}
|
||||||
|
else {
|
||||||
serviceTimeOnEdge[value.getTaskType()] += value.getServiceTime();
|
serviceTimeOnEdge[value.getTaskType()] += value.getServiceTime();
|
||||||
processingTimeOnEdge[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay());
|
processingTimeOnEdge[value.getTaskType()] += (value.getServiceTime() - value.getNetworkDelay());
|
||||||
}
|
}
|
||||||
@ -311,7 +338,9 @@ public class SimLogger {
|
|||||||
|
|
||||||
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
if (value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
||||||
failedTaskDueToVmCapacityOnCloud[value.getTaskType()]++;
|
failedTaskDueToVmCapacityOnCloud[value.getTaskType()]++;
|
||||||
else if (value.getVmType() == SimSettings.VM_TYPES.EDGE_VM.ordinal())
|
else if (value.getVmType() == SimSettings.VM_TYPES.MOBILE_VM.ordinal())
|
||||||
|
failedTaskDueToVmCapacityOnMobile[value.getTaskType()]++;
|
||||||
|
else
|
||||||
failedTaskDueToVmCapacityOnEdge[value.getTaskType()]++;
|
failedTaskDueToVmCapacityOnEdge[value.getTaskType()]++;
|
||||||
|
|
||||||
if (fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
if (fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||||
@ -339,32 +368,41 @@ public class SimLogger {
|
|||||||
uncompletedTask[numOfAppTypes] = IntStream.of(uncompletedTask).sum();
|
uncompletedTask[numOfAppTypes] = IntStream.of(uncompletedTask).sum();
|
||||||
uncompletedTaskOnCloud[numOfAppTypes] = IntStream.of(uncompletedTaskOnCloud).sum();
|
uncompletedTaskOnCloud[numOfAppTypes] = IntStream.of(uncompletedTaskOnCloud).sum();
|
||||||
uncompletedTaskOnEdge[numOfAppTypes] = IntStream.of(uncompletedTaskOnEdge).sum();
|
uncompletedTaskOnEdge[numOfAppTypes] = IntStream.of(uncompletedTaskOnEdge).sum();
|
||||||
|
uncompletedTaskOnMobile[numOfAppTypes] = IntStream.of(uncompletedTaskOnMobile).sum();
|
||||||
|
|
||||||
completedTask[numOfAppTypes] = IntStream.of(completedTask).sum();
|
completedTask[numOfAppTypes] = IntStream.of(completedTask).sum();
|
||||||
completedTaskOnCloud[numOfAppTypes] = IntStream.of(completedTaskOnCloud).sum();
|
completedTaskOnCloud[numOfAppTypes] = IntStream.of(completedTaskOnCloud).sum();
|
||||||
completedTaskOnEdge[numOfAppTypes] = IntStream.of(completedTaskOnEdge).sum();
|
completedTaskOnEdge[numOfAppTypes] = IntStream.of(completedTaskOnEdge).sum();
|
||||||
completedTaskOnRemoteEdge[numOfAppTypes] = IntStream.of(completedTaskOnRemoteEdge).sum();
|
completedTaskOnMobile[numOfAppTypes] = IntStream.of(completedTaskOnMobile).sum();
|
||||||
|
|
||||||
failedTask[numOfAppTypes] = IntStream.of(failedTask).sum();
|
failedTask[numOfAppTypes] = IntStream.of(failedTask).sum();
|
||||||
failedTaskOnCloud[numOfAppTypes] = IntStream.of(failedTaskOnCloud).sum();
|
failedTaskOnCloud[numOfAppTypes] = IntStream.of(failedTaskOnCloud).sum();
|
||||||
failedTaskOnEdge[numOfAppTypes] = IntStream.of(failedTaskOnEdge).sum();
|
failedTaskOnEdge[numOfAppTypes] = IntStream.of(failedTaskOnEdge).sum();
|
||||||
|
failedTaskOnMobile[numOfAppTypes] = IntStream.of(failedTaskOnMobile).sum();
|
||||||
|
|
||||||
networkDelay[numOfAppTypes] = DoubleStream.of(networkDelay).sum();
|
networkDelay[numOfAppTypes] = DoubleStream.of(networkDelay).sum();
|
||||||
lanDelay[numOfAppTypes] = DoubleStream.of(lanDelay).sum();
|
lanDelay[numOfAppTypes] = DoubleStream.of(lanDelay).sum();
|
||||||
manDelay[numOfAppTypes] = DoubleStream.of(manDelay).sum();
|
manDelay[numOfAppTypes] = DoubleStream.of(manDelay).sum();
|
||||||
wanDelay[numOfAppTypes] = DoubleStream.of(wanDelay).sum();
|
wanDelay[numOfAppTypes] = DoubleStream.of(wanDelay).sum();
|
||||||
|
|
||||||
|
lanUsage[numOfAppTypes] = DoubleStream.of(lanUsage).sum();
|
||||||
|
manUsage[numOfAppTypes] = DoubleStream.of(manUsage).sum();
|
||||||
|
wanUsage[numOfAppTypes] = DoubleStream.of(wanUsage).sum();
|
||||||
|
|
||||||
serviceTime[numOfAppTypes] = DoubleStream.of(serviceTime).sum();
|
serviceTime[numOfAppTypes] = DoubleStream.of(serviceTime).sum();
|
||||||
serviceTimeOnCloud[numOfAppTypes] = DoubleStream.of(serviceTimeOnCloud).sum();
|
serviceTimeOnCloud[numOfAppTypes] = DoubleStream.of(serviceTimeOnCloud).sum();
|
||||||
serviceTimeOnEdge[numOfAppTypes] = DoubleStream.of(serviceTimeOnEdge).sum();
|
serviceTimeOnEdge[numOfAppTypes] = DoubleStream.of(serviceTimeOnEdge).sum();
|
||||||
|
serviceTimeOnMobile[numOfAppTypes] = DoubleStream.of(serviceTimeOnMobile).sum();
|
||||||
|
|
||||||
processingTime[numOfAppTypes] = DoubleStream.of(processingTime).sum();
|
processingTime[numOfAppTypes] = DoubleStream.of(processingTime).sum();
|
||||||
processingTimeOnCloud[numOfAppTypes] = DoubleStream.of(processingTimeOnCloud).sum();
|
processingTimeOnCloud[numOfAppTypes] = DoubleStream.of(processingTimeOnCloud).sum();
|
||||||
processingTimeOnEdge[numOfAppTypes] = DoubleStream.of(processingTimeOnEdge).sum();
|
processingTimeOnEdge[numOfAppTypes] = DoubleStream.of(processingTimeOnEdge).sum();
|
||||||
|
processingTimeOnMobile[numOfAppTypes] = DoubleStream.of(processingTimeOnMobile).sum();
|
||||||
|
|
||||||
failedTaskDueToVmCapacity[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacity).sum();
|
failedTaskDueToVmCapacity[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacity).sum();
|
||||||
failedTaskDueToVmCapacityOnCloud[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacityOnCloud).sum();
|
failedTaskDueToVmCapacityOnCloud[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacityOnCloud).sum();
|
||||||
failedTaskDueToVmCapacityOnEdge[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacityOnEdge).sum();
|
failedTaskDueToVmCapacityOnEdge[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacityOnEdge).sum();
|
||||||
|
failedTaskDueToVmCapacityOnMobile[numOfAppTypes] = IntStream.of(failedTaskDueToVmCapacityOnMobile).sum();
|
||||||
|
|
||||||
cost[numOfAppTypes] = DoubleStream.of(cost).sum();
|
cost[numOfAppTypes] = DoubleStream.of(cost).sum();
|
||||||
failedTaskDuetoBw[numOfAppTypes] = IntStream.of(failedTaskDuetoBw).sum();
|
failedTaskDuetoBw[numOfAppTypes] = IntStream.of(failedTaskDuetoBw).sum();
|
||||||
@ -376,9 +414,11 @@ public class SimLogger {
|
|||||||
// calculate server load
|
// calculate server load
|
||||||
double totalVmLoadOnEdge = 0;
|
double totalVmLoadOnEdge = 0;
|
||||||
double totalVmLoadOnCloud = 0;
|
double totalVmLoadOnCloud = 0;
|
||||||
|
double totalVmLoadOnMobile = 0;
|
||||||
for (VmLoadLogItem entry : vmLoadList) {
|
for (VmLoadLogItem entry : vmLoadList) {
|
||||||
totalVmLoadOnEdge += entry.getEdgeLoad();
|
totalVmLoadOnEdge += entry.getEdgeLoad();
|
||||||
totalVmLoadOnCloud += entry.getCloudLoad();
|
totalVmLoadOnCloud += entry.getCloudLoad();
|
||||||
|
totalVmLoadOnMobile += entry.getMobileLoad();
|
||||||
if (fileLogEnabled)
|
if (fileLogEnabled)
|
||||||
appendToFile(vmLoadBW, entry.toString());
|
appendToFile(vmLoadBW, entry.toString());
|
||||||
}
|
}
|
||||||
@ -419,18 +459,19 @@ public class SimLogger {
|
|||||||
// check if the divisor is zero in order to avoid division by
|
// check if the divisor is zero in order to avoid division by
|
||||||
// zero problem
|
// zero problem
|
||||||
double _serviceTime = (completedTask[i] == 0) ? 0.0 : (serviceTime[i] / (double) completedTask[i]);
|
double _serviceTime = (completedTask[i] == 0) ? 0.0 : (serviceTime[i] / (double) completedTask[i]);
|
||||||
double _networkDelay = (completedTask[i] == 0) ? 0.0 : (networkDelay[i] / (double) completedTask[i]);
|
double _networkDelay = (completedTask[i] == 0) ? 0.0 : (networkDelay[i] / ((double) completedTask[i] - (double)completedTaskOnMobile[i]));
|
||||||
double _processingTime = (completedTask[i] == 0) ? 0.0 : (processingTime[i] / (double) completedTask[i]);
|
double _processingTime = (completedTask[i] == 0) ? 0.0 : (processingTime[i] / (double) completedTask[i]);
|
||||||
double _vmLoadOnEdge = (vmLoadList.size() == 0) ? 0.0 : (totalVmLoadOnEdge / (double) vmLoadList.size());
|
double _vmLoadOnEdge = (vmLoadList.size() == 0) ? 0.0 : (totalVmLoadOnEdge / (double) vmLoadList.size());
|
||||||
double _vmLoadOnClould = (vmLoadList.size() == 0) ? 0.0 : (totalVmLoadOnCloud / (double) vmLoadList.size());
|
double _vmLoadOnClould = (vmLoadList.size() == 0) ? 0.0 : (totalVmLoadOnCloud / (double) vmLoadList.size());
|
||||||
|
double _vmLoadOnMobile = (vmLoadList.size() == 0) ? 0.0 : (totalVmLoadOnMobile / (double) vmLoadList.size());
|
||||||
double _cost = (completedTask[i] == 0) ? 0.0 : (cost[i] / (double) completedTask[i]);
|
double _cost = (completedTask[i] == 0) ? 0.0 : (cost[i] / (double) completedTask[i]);
|
||||||
|
|
||||||
double _lanDelay = (completedTaskOnEdge[i] == 0) ? 0.0
|
double _lanDelay = (lanUsage[i] == 0) ? 0.0
|
||||||
: (lanDelay[i] / (double) completedTaskOnEdge[i]);
|
: (lanDelay[i] / (double) lanUsage[i]);
|
||||||
double _manDelay = (completedTaskOnRemoteEdge[i] == 0) ? 0.0
|
double _manDelay = (manUsage[i] == 0) ? 0.0
|
||||||
: (manDelay[i] / (double) completedTaskOnRemoteEdge[i]);
|
: (manDelay[i] / (double) manUsage[i]);
|
||||||
double _wanDelay = (completedTaskOnCloud[i] == 0) ? 0.0
|
double _wanDelay = (wanUsage[i] == 0) ? 0.0
|
||||||
: (wanDelay[i] / (double) completedTaskOnCloud[i]);
|
: (wanDelay[i] / (double) wanUsage[i]);
|
||||||
|
|
||||||
// write generic results
|
// write generic results
|
||||||
String genericResult1 = Integer.toString(completedTask[i]) + SimSettings.DELIMITER
|
String genericResult1 = Integer.toString(completedTask[i]) + SimSettings.DELIMITER
|
||||||
@ -475,12 +516,25 @@ public class SimLogger {
|
|||||||
+ Double.toString(_vmLoadOnClould) + SimSettings.DELIMITER
|
+ Double.toString(_vmLoadOnClould) + SimSettings.DELIMITER
|
||||||
+ Integer.toString(failedTaskDueToVmCapacityOnCloud[i]);
|
+ Integer.toString(failedTaskDueToVmCapacityOnCloud[i]);
|
||||||
|
|
||||||
//for future use
|
// check if the divisor is zero in order to avoid division by zero problem
|
||||||
String genericResult4 = "0;0;0;0;0;0;0;0;0";
|
double _serviceTimeOnMobile = (completedTaskOnMobile[i] == 0) ? 0.0
|
||||||
|
: (serviceTimeOnMobile[i] / (double) completedTaskOnMobile[i]);
|
||||||
|
double _processingTimeOnMobile = (completedTaskOnMobile[i] == 0) ? 0.0
|
||||||
|
: (processingTimeOnMobile[i] / (double) completedTaskOnMobile[i]);
|
||||||
|
String genericResult4 = Integer.toString(completedTaskOnMobile[i]) + SimSettings.DELIMITER
|
||||||
|
+ Integer.toString(failedTaskOnMobile[i]) + SimSettings.DELIMITER
|
||||||
|
+ Integer.toString(uncompletedTaskOnMobile[i]) + SimSettings.DELIMITER
|
||||||
|
+ Integer.toString(0) + SimSettings.DELIMITER
|
||||||
|
+ Double.toString(_serviceTimeOnMobile) + SimSettings.DELIMITER
|
||||||
|
+ Double.toString(_processingTimeOnMobile) + SimSettings.DELIMITER
|
||||||
|
+ Double.toString(0.0) + SimSettings.DELIMITER
|
||||||
|
+ Double.toString(_vmLoadOnMobile) + SimSettings.DELIMITER
|
||||||
|
+ Integer.toString(failedTaskDueToVmCapacityOnMobile[i]);
|
||||||
|
|
||||||
String genericResult5 = Double.toString(_lanDelay) + SimSettings.DELIMITER
|
String genericResult5 = Double.toString(_lanDelay) + SimSettings.DELIMITER
|
||||||
+ Double.toString(_manDelay) + SimSettings.DELIMITER
|
+ Double.toString(_manDelay) + SimSettings.DELIMITER
|
||||||
+ Double.toString(_wanDelay) + SimSettings.DELIMITER
|
+ Double.toString(_wanDelay) + SimSettings.DELIMITER
|
||||||
|
+ 0 + SimSettings.DELIMITER //for future use
|
||||||
+ Integer.toString(failedTaskDuetoLanBw[i]) + SimSettings.DELIMITER
|
+ Integer.toString(failedTaskDuetoLanBw[i]) + SimSettings.DELIMITER
|
||||||
+ Integer.toString(failedTaskDuetoManBw[i]) + SimSettings.DELIMITER
|
+ Integer.toString(failedTaskDuetoManBw[i]) + SimSettings.DELIMITER
|
||||||
+ Integer.toString(failedTaskDuetoWanBw[i]);
|
+ Integer.toString(failedTaskDuetoWanBw[i]);
|
||||||
@ -511,30 +565,35 @@ public class SimLogger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// printout important results
|
// printout important results
|
||||||
printLine("# of tasks (Edge/Cloud): "
|
printLine("# of tasks (Edge/Cloud/Mobile): "
|
||||||
+ (failedTask[numOfAppTypes] + completedTask[numOfAppTypes]) + "("
|
+ (failedTask[numOfAppTypes] + completedTask[numOfAppTypes]) + "("
|
||||||
+ (failedTaskOnEdge[numOfAppTypes] + completedTaskOnEdge[numOfAppTypes]) + "/"
|
+ (failedTaskOnEdge[numOfAppTypes] + completedTaskOnEdge[numOfAppTypes]) + "/"
|
||||||
+ (failedTaskOnCloud[numOfAppTypes]+ completedTaskOnCloud[numOfAppTypes]) + ")");
|
+ (failedTaskOnCloud[numOfAppTypes]+ completedTaskOnCloud[numOfAppTypes]) + "/"
|
||||||
|
+ (failedTaskOnMobile[numOfAppTypes]+ completedTaskOnMobile[numOfAppTypes]) + ")");
|
||||||
|
|
||||||
printLine("# of failed tasks (Edge/Cloud): "
|
printLine("# of failed tasks (Edge/Cloud/Mobile): "
|
||||||
+ failedTask[numOfAppTypes] + "("
|
+ failedTask[numOfAppTypes] + "("
|
||||||
+ failedTaskOnEdge[numOfAppTypes] + "/"
|
+ failedTaskOnEdge[numOfAppTypes] + "/"
|
||||||
+ failedTaskOnCloud[numOfAppTypes] + ")");
|
+ failedTaskOnCloud[numOfAppTypes] + "/"
|
||||||
|
+ failedTaskOnMobile[numOfAppTypes] + ")");
|
||||||
|
|
||||||
printLine("# of completed tasks (Edge/Cloud): "
|
printLine("# of completed tasks (Edge/Cloud/Mobile): "
|
||||||
+ completedTask[numOfAppTypes] + "("
|
+ completedTask[numOfAppTypes] + "("
|
||||||
+ completedTaskOnEdge[numOfAppTypes] + "/"
|
+ completedTaskOnEdge[numOfAppTypes] + "/"
|
||||||
+ completedTaskOnCloud[numOfAppTypes] + ")");
|
+ completedTaskOnCloud[numOfAppTypes] + "/"
|
||||||
|
+ completedTaskOnMobile[numOfAppTypes] + ")");
|
||||||
|
|
||||||
printLine("# of uncompleted tasks (Edge/Cloud): "
|
printLine("# of uncompleted tasks (Edge/Cloud/Mobile): "
|
||||||
+ uncompletedTask[numOfAppTypes] + "("
|
+ uncompletedTask[numOfAppTypes] + "("
|
||||||
+ uncompletedTaskOnEdge[numOfAppTypes] + "/"
|
+ uncompletedTaskOnEdge[numOfAppTypes] + "/"
|
||||||
+ uncompletedTaskOnCloud[numOfAppTypes] + ")");
|
+ uncompletedTaskOnCloud[numOfAppTypes] + "/"
|
||||||
|
+ uncompletedTaskOnMobile[numOfAppTypes] + ")");
|
||||||
|
|
||||||
printLine("# of failed tasks due to vm capacity (Edge/Cloud): "
|
printLine("# of failed tasks due to vm capacity (Edge/Cloud/Mobile): "
|
||||||
+ failedTaskDueToVmCapacity[numOfAppTypes] + "("
|
+ failedTaskDueToVmCapacity[numOfAppTypes] + "("
|
||||||
+ failedTaskDueToVmCapacityOnEdge[numOfAppTypes] + "/"
|
+ failedTaskDueToVmCapacityOnEdge[numOfAppTypes] + "/"
|
||||||
+ failedTaskDueToVmCapacityOnCloud[numOfAppTypes] + ")");
|
+ failedTaskDueToVmCapacityOnCloud[numOfAppTypes] + "/"
|
||||||
|
+ failedTaskDueToVmCapacityOnMobile[numOfAppTypes] + ")");
|
||||||
|
|
||||||
printLine("# of failed tasks due to Mobility/Network(WLAN/MAN/WAN): "
|
printLine("# of failed tasks due to Mobility/Network(WLAN/MAN/WAN): "
|
||||||
+ failedTaskDuetoMobility[numOfAppTypes]
|
+ failedTaskDuetoMobility[numOfAppTypes]
|
||||||
@ -554,6 +613,8 @@ public class SimLogger {
|
|||||||
+ String.format("%.6f", serviceTimeOnEdge[numOfAppTypes] / (double) completedTaskOnEdge[numOfAppTypes])
|
+ String.format("%.6f", serviceTimeOnEdge[numOfAppTypes] / (double) completedTaskOnEdge[numOfAppTypes])
|
||||||
+ ", " + "on Cloud: "
|
+ ", " + "on Cloud: "
|
||||||
+ String.format("%.6f", serviceTimeOnCloud[numOfAppTypes] / (double) completedTaskOnCloud[numOfAppTypes])
|
+ String.format("%.6f", serviceTimeOnCloud[numOfAppTypes] / (double) completedTaskOnCloud[numOfAppTypes])
|
||||||
|
+ ", " + "on Mobile: "
|
||||||
|
+ String.format("%.6f", serviceTimeOnMobile[numOfAppTypes] / (double) completedTaskOnMobile[numOfAppTypes])
|
||||||
+ ")");
|
+ ")");
|
||||||
|
|
||||||
printLine("average processing time: "
|
printLine("average processing time: "
|
||||||
@ -562,20 +623,23 @@ public class SimLogger {
|
|||||||
+ String.format("%.6f", processingTimeOnEdge[numOfAppTypes] / (double) completedTaskOnEdge[numOfAppTypes])
|
+ String.format("%.6f", processingTimeOnEdge[numOfAppTypes] / (double) completedTaskOnEdge[numOfAppTypes])
|
||||||
+ ", " + "on Cloud: "
|
+ ", " + "on Cloud: "
|
||||||
+ String.format("%.6f", processingTimeOnCloud[numOfAppTypes] / (double) completedTaskOnCloud[numOfAppTypes])
|
+ String.format("%.6f", processingTimeOnCloud[numOfAppTypes] / (double) completedTaskOnCloud[numOfAppTypes])
|
||||||
|
+ ", " + "on Mobile: "
|
||||||
|
+ String.format("%.6f", processingTimeOnMobile[numOfAppTypes] / (double) completedTaskOnMobile[numOfAppTypes])
|
||||||
+ ")");
|
+ ")");
|
||||||
|
|
||||||
printLine("average network delay: "
|
printLine("average network delay: "
|
||||||
+ String.format("%.6f", networkDelay[numOfAppTypes] / (double) completedTask[numOfAppTypes])
|
+ String.format("%.6f", networkDelay[numOfAppTypes] / ((double) completedTask[numOfAppTypes] - (double) completedTaskOnMobile[numOfAppTypes]))
|
||||||
+ " seconds. (" + "LAN delay: "
|
+ " seconds. (" + "LAN delay: "
|
||||||
+ String.format("%.6f", lanDelay[numOfAppTypes] / (double) completedTaskOnEdge[numOfAppTypes])
|
+ String.format("%.6f", lanDelay[numOfAppTypes] / (double) lanUsage[numOfAppTypes])
|
||||||
+ ", " + "MAN delay: "
|
+ ", " + "MAN delay: "
|
||||||
+ String.format("%.6f", manDelay[numOfAppTypes] / (double) completedTaskOnRemoteEdge[numOfAppTypes])
|
+ String.format("%.6f", manDelay[numOfAppTypes] / (double) manUsage[numOfAppTypes])
|
||||||
+ ", " + "WAN delay: "
|
+ ", " + "WAN delay: "
|
||||||
+ String.format("%.6f", wanDelay[numOfAppTypes] / (double) completedTaskOnCloud[numOfAppTypes]) + ")");
|
+ String.format("%.6f", wanDelay[numOfAppTypes] / (double) wanUsage[numOfAppTypes]) + ")");
|
||||||
|
|
||||||
printLine("average server utilization Edge/Cloud: "
|
printLine("average server utilization Edge/Cloud/Mobile: "
|
||||||
+ String.format("%.6f", totalVmLoadOnEdge / (double) vmLoadList.size()) + "/"
|
+ String.format("%.6f", totalVmLoadOnEdge / (double) vmLoadList.size()) + "/"
|
||||||
+ String.format("%.6f", totalVmLoadOnCloud / (double) vmLoadList.size()));
|
+ String.format("%.6f", totalVmLoadOnCloud / (double) vmLoadList.size()) + "/"
|
||||||
|
+ String.format("%.6f", totalVmLoadOnMobile / (double) vmLoadList.size()));
|
||||||
|
|
||||||
printLine("average cost: " + cost[numOfAppTypes] / completedTask[numOfAppTypes] + "$");
|
printLine("average cost: " + cost[numOfAppTypes] / completedTask[numOfAppTypes] + "$");
|
||||||
|
|
||||||
@ -589,11 +653,13 @@ class VmLoadLogItem {
|
|||||||
private double time;
|
private double time;
|
||||||
private double vmLoadOnEdge;
|
private double vmLoadOnEdge;
|
||||||
private double vmLoadOnCloud;
|
private double vmLoadOnCloud;
|
||||||
|
private double vmLoadOnMobile;
|
||||||
|
|
||||||
VmLoadLogItem(double _time, double _vmLoadOnEdge, double _vmLoadOnCloud) {
|
VmLoadLogItem(double _time, double _vmLoadOnEdge, double _vmLoadOnCloud, double _vmLoadOnMobile) {
|
||||||
time = _time;
|
time = _time;
|
||||||
vmLoadOnEdge = _vmLoadOnEdge;
|
vmLoadOnEdge = _vmLoadOnEdge;
|
||||||
vmLoadOnCloud = _vmLoadOnCloud;
|
vmLoadOnCloud = _vmLoadOnCloud;
|
||||||
|
vmLoadOnMobile = _vmLoadOnMobile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getEdgeLoad() {
|
public double getEdgeLoad() {
|
||||||
@ -604,10 +670,15 @@ class VmLoadLogItem {
|
|||||||
return vmLoadOnCloud;
|
return vmLoadOnCloud;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getMobileLoad() {
|
||||||
|
return vmLoadOnMobile;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return time +
|
return time +
|
||||||
SimSettings.DELIMITER + vmLoadOnEdge +
|
SimSettings.DELIMITER + vmLoadOnEdge +
|
||||||
SimSettings.DELIMITER + vmLoadOnCloud;
|
SimSettings.DELIMITER + vmLoadOnCloud +
|
||||||
|
SimSettings.DELIMITER + vmLoadOnMobile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user