initial commit of EdgeCloudSim
EdgeCloudSim with default network model, mobility model, load generator model, edge orchestrator, and VM CPU utilization model
This commit is contained in:
commit
19c4b9de40
21
.gitignore
vendored
Normal file
21
.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
# OS X
|
||||
.DS_Store*
|
||||
Icon?
|
||||
._*
|
||||
|
||||
# Windows
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
|
||||
# Linux
|
||||
.directory
|
||||
*~
|
||||
|
||||
# bin folder
|
||||
bin
|
||||
|
||||
# eclipse's files
|
||||
.settings
|
||||
.classpath
|
||||
.project
|
63
config/applications.xml
Normal file
63
config/applications.xml
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0"?>
|
||||
<applications>
|
||||
<application name="FACE_REC_APP">
|
||||
<usage_percentage>100</usage_percentage>
|
||||
<prob_cloud_selection>10</prob_cloud_selection>
|
||||
<poisson_interarrival>3</poisson_interarrival>
|
||||
<active_period>45</active_period>
|
||||
<idle_period>15</idle_period>
|
||||
<data_upload>1500</data_upload>
|
||||
<data_download>16</data_download>
|
||||
<task_length>1500</task_length>
|
||||
<required_core>2</required_core>
|
||||
<vm_utilization>10</vm_utilization>
|
||||
</application>
|
||||
<application name="HEALTH_APP">
|
||||
<usage_percentage>0</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<poisson_interarrival>0</poisson_interarrival>
|
||||
<active_period>0</active_period>
|
||||
<idle_period>0</idle_period>
|
||||
<data_upload>0</data_upload>
|
||||
<data_download>0</data_download>
|
||||
<task_length>0</task_length>
|
||||
<required_core>0</required_core>
|
||||
<vm_utilization>0</vm_utilization>
|
||||
</application>
|
||||
<application name="HEAVY_COMP_APP">
|
||||
<usage_percentage>0</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<poisson_interarrival>0</poisson_interarrival>
|
||||
<active_period>0</active_period>
|
||||
<idle_period>0</idle_period>
|
||||
<data_upload>0</data_upload>
|
||||
<data_download>0</data_download>
|
||||
<task_length>0</task_length>
|
||||
<required_core>0</required_core>
|
||||
<vm_utilization>0</vm_utilization>
|
||||
</application>
|
||||
<application name="VIDEO_GAME_APP">
|
||||
<usage_percentage>0</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<poisson_interarrival>0</poisson_interarrival>
|
||||
<active_period>0</active_period>
|
||||
<idle_period>0</idle_period>
|
||||
<data_upload>0</data_upload>
|
||||
<data_download>0</data_download>
|
||||
<task_length>0</task_length>
|
||||
<required_core>0</required_core>
|
||||
<vm_utilization>0</vm_utilization>
|
||||
</application>
|
||||
<application name="SIMPLE_SERVICE_APP">
|
||||
<usage_percentage>0</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<poisson_interarrival>0</poisson_interarrival>
|
||||
<active_period>0</active_period>
|
||||
<idle_period>0</idle_period>
|
||||
<data_upload>0</data_upload>
|
||||
<data_download>0</data_download>
|
||||
<task_length>0</task_length>
|
||||
<required_core>0</required_core>
|
||||
<vm_utilization>0</vm_utilization>
|
||||
</application>
|
||||
</applications>
|
24
config/default_config.properties
Normal file
24
config/default_config.properties
Normal file
@ -0,0 +1,24 @@
|
||||
#default config file
|
||||
simulation_time=2
|
||||
warm_up_period=1200
|
||||
vm_load_check_interval=30
|
||||
vm_location_check_interval=30
|
||||
deep_file_log_enabled=false
|
||||
|
||||
min_number_of_mobile_devices=50
|
||||
max_number_of_mobile_devices=250
|
||||
mobile_device_counter_size=25
|
||||
|
||||
wan_propogation_delay=0.1
|
||||
lan_internal_delay=0.004
|
||||
wlan_bandwidth=300
|
||||
wan_bandwidth=20
|
||||
gsm_bandwidth=10
|
||||
|
||||
mips_for_cloud=20000
|
||||
|
||||
task_provisioning=NEXT_FIT
|
||||
|
||||
attractiveness_L1_mean_waiting_time=60
|
||||
attractiveness_L2_mean_waiting_time=30
|
||||
attractiveness_L3_mean_waiting_time=15
|
647
config/edge_devices.xml
Normal file
647
config/edge_devices.xml
Normal file
@ -0,0 +1,647 @@
|
||||
<?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>1</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>1</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>2</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>2</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>2</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>2</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</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>3</attractiveness>
|
||||
</location>
|
||||
<hosts>
|
||||
<host>
|
||||
<core>8</core>
|
||||
<mips>4000</mips>
|
||||
<ram>8000</ram>
|
||||
<storage>200000</storage>
|
||||
<VMs>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
<VM vmm="Xen">
|
||||
<core>2</core>
|
||||
<mips>1000</mips>
|
||||
<ram>2000</ram>
|
||||
<storage>50000</storage>
|
||||
</VM>
|
||||
</VMs>
|
||||
</host>
|
||||
</hosts>
|
||||
</datacenter>
|
||||
</edge_devices>
|
BIN
lib/cloudsim-4.0.jar
Normal file
BIN
lib/cloudsim-4.0.jar
Normal file
Binary file not shown.
BIN
lib/commons-math3-3.6.1.jar
Normal file
BIN
lib/commons-math3-3.6.1.jar
Normal file
Binary file not shown.
4
scripts/compile.sh
Normal file
4
scripts/compile.sh
Normal file
@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
rm -rf ../bin
|
||||
mkdir ../bin
|
||||
javac -classpath "../lib/cloudsim-4.0.jar:../lib/commons-math3-3.6.1.jar" -sourcepath ../src ../src/edu/boun/edgecloudsim/sample_application/mainApp.java -d ../bin
|
59
scripts/run_scenarios.sh
Normal file
59
scripts/run_scenarios.sh
Normal file
@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Missing arguments! Please provide number of parallel processes and number of iterations."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
re='^[0-9]+$'
|
||||
if ! [[ $1 =~ $re ]] ; then
|
||||
echo "$1 is not an integer! Please provide number of parallel processes."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [[ $2 =~ $re ]] ; then
|
||||
echo "$1 is not an integer! Please provide number of iterations."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
script_root_path="$(dirname "$(readlink -f "$0")")"
|
||||
root_out_folder=${script_root_path}/output
|
||||
num_of_processes=$1
|
||||
iterationNumber=$2
|
||||
process_counter=0
|
||||
|
||||
date=$(date '+%d-%m-%Y_%H-%M')
|
||||
simulation_out_folder=${root_out_folder}/${date}
|
||||
mkdir -p $simulation_out_folder
|
||||
|
||||
simulations=$(cat ${script_root_path}/simulation.list)
|
||||
|
||||
rm -rf ${script_root_path}/tmp_runner*
|
||||
|
||||
for sim_args in $simulations
|
||||
do
|
||||
scenario_name=$(echo $sim_args | cut -d ';' -f1)
|
||||
edge_devices_file=$(echo $sim_args | cut -d ';' -f2)
|
||||
applications_file=$(echo $sim_args | cut -d ';' -f3)
|
||||
for (( i=1; i<=$iterationNumber; i++ ))
|
||||
do
|
||||
process_id=$(($process_counter % $num_of_processes))
|
||||
process_counter=$(($process_counter + 1))
|
||||
|
||||
echo "${script_root_path}/runner.sh $simulation_out_folder $scenario_name $edge_devices_file $applications_file ${i}" >> "${simulation_out_folder}/tmp_runner${process_id}.sh"
|
||||
done
|
||||
done
|
||||
|
||||
#num_of_cores=$(grep -c ^processor /proc/cpuinfo)
|
||||
|
||||
for (( i=0; i<$num_of_processes; i++ ))
|
||||
do
|
||||
chmod +x ${simulation_out_folder}/tmp_runner${i}.sh
|
||||
${simulation_out_folder}/tmp_runner${i}.sh &
|
||||
|
||||
# pid=$!
|
||||
# cpu=$(($i % $num_of_cores))
|
||||
# taskset -cp $cpu,$cpu $pid
|
||||
done
|
18
scripts/runner.sh
Normal file
18
scripts/runner.sh
Normal file
@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
|
||||
script_root_path="$(dirname "$(readlink -f "$0")")"
|
||||
simulation_out_folder=$1
|
||||
scenario_name=$2
|
||||
edge_devices_file=$3
|
||||
applications_file=$4
|
||||
iteration_number=$5
|
||||
|
||||
scenario_out_folder=${simulation_out_folder}/${scenario_name}/ite${iteration_number}
|
||||
scenario_conf_file=${script_root_path}/../config/${scenario_name}.properties
|
||||
scenario_edge_devices_file=${script_root_path}/../config/${edge_devices_file}
|
||||
scenario_applications_file=${script_root_path}/../config/${applications_file}
|
||||
|
||||
mkdir -p $scenario_out_folder
|
||||
java -classpath '../bin:../lib/cloudsim-4.0.jar:../lib/commons-math3-3.6.1.jar' edu.boun.edgecloudsim.sample_application.mainApp $scenario_conf_file $scenario_edge_devices_file $scenario_applications_file $scenario_out_folder $iteration_number > ${scenario_out_folder}.log
|
||||
tar -czf ${scenario_out_folder}.tar.gz -C $simulation_out_folder/${scenario_name} ite${iteration_number}
|
||||
rm -rf $scenario_out_folder
|
1
scripts/simulation.list
Normal file
1
scripts/simulation.list
Normal file
@ -0,0 +1 @@
|
||||
default_config;edge_devices.xml;applications.xml
|
57
src/edu/boun/edgecloudsim/core/ScenarioFactory.java
Normal file
57
src/edu/boun/edgecloudsim/core/ScenarioFactory.java
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Scenarion Factory interface
|
||||
*
|
||||
* Description:
|
||||
* ScenarioFactory responsible for providing customizable components
|
||||
* such as Network Model, Mobility Model, Edge Orchestrator.
|
||||
* This interface is very critical for using custom models on EdgeCloudSim
|
||||
* This interface should be implemented by EdgeCloudSim users
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.core;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.cloudbus.cloudsim.Host;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||
|
||||
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
|
||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||
|
||||
public interface ScenarioFactory {
|
||||
/**
|
||||
* provides abstract Load Generator Model
|
||||
*/
|
||||
public LoadGeneratorModel getLoadGeneratorModel();
|
||||
|
||||
/**
|
||||
* provides abstract Edge Orchestrator
|
||||
*/
|
||||
public EdgeOrchestrator getEdgeOrchestrator();
|
||||
|
||||
/**
|
||||
* provides abstract Mobility Model
|
||||
*/
|
||||
public MobilityModel getMobilityModel();
|
||||
|
||||
/**
|
||||
* provides abstract Network Model
|
||||
*/
|
||||
public NetworkModel getNetworkModel();
|
||||
|
||||
/**
|
||||
* provides abstract CPU Utilization Model
|
||||
*/
|
||||
public UtilizationModel getCpuUtilizationModel(SimSettings.APP_TYPES _taskType);
|
||||
|
||||
/**
|
||||
* provides abstract Vm Allocation Policy
|
||||
*/
|
||||
public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> list, int dataCenterIndex);
|
||||
}
|
200
src/edu/boun/edgecloudsim/core/SimManager.java
Normal file
200
src/edu/boun/edgecloudsim/core/SimManager.java
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Simulation Manager
|
||||
*
|
||||
* Description:
|
||||
* SimManager is an singleton class providing many abstract classeses such as
|
||||
* Network Model, Mobility Model, Edge Orchestrator to other modules
|
||||
* Critical simulation related information would be gathered via this class
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.core;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.cloudbus.cloudsim.Log;
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
import org.cloudbus.cloudsim.core.SimEntity;
|
||||
import org.cloudbus.cloudsim.core.SimEvent;
|
||||
|
||||
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeServerManager;
|
||||
import edu.boun.edgecloudsim.edge_server.VmAllocationPolicy_Custom;
|
||||
import edu.boun.edgecloudsim.edge_client.MobileDeviceManager;
|
||||
import edu.boun.edgecloudsim.mobility.MobilityModel;
|
||||
import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel;
|
||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
|
||||
public class SimManager extends SimEntity {
|
||||
private static final int CREATE_TASK = 0;
|
||||
private static final int CHECK_ALL_VM = 1;
|
||||
private static final int GET_LOAD_LOG = 2;
|
||||
private static final int PRINT_PROGRESS = 3;
|
||||
private static final int STOP_SIMULATION = 4;
|
||||
|
||||
private int numOfMobileDevice;
|
||||
private NetworkModel networkModel;
|
||||
private MobilityModel mobilityModel;
|
||||
private ScenarioFactory scenarioFactory;
|
||||
private EdgeOrchestrator edgeOrchestrator;
|
||||
private EdgeServerManager edgeServerManager;
|
||||
private LoadGeneratorModel loadGeneratorModel;
|
||||
private MobileDeviceManager mobileDeviceManager;
|
||||
|
||||
private static SimManager instance = null;
|
||||
|
||||
public SimManager(ScenarioFactory _scenarioFactory, int _numOfMobileDevice, SimSettings.SCENARIO_TYPES _simScenario) throws Exception {
|
||||
super("SimManager");
|
||||
scenarioFactory = _scenarioFactory;
|
||||
numOfMobileDevice = _numOfMobileDevice;
|
||||
|
||||
SimLogger.print("Creating tasks...");
|
||||
loadGeneratorModel = scenarioFactory.getLoadGeneratorModel();
|
||||
loadGeneratorModel.initializeModel();
|
||||
SimLogger.printLine("Done, ");
|
||||
|
||||
SimLogger.print("Creating device locations...");
|
||||
mobilityModel = scenarioFactory.getMobilityModel();
|
||||
mobilityModel.initialize();
|
||||
SimLogger.printLine("Done.");
|
||||
|
||||
//Generate network model
|
||||
networkModel = scenarioFactory.getNetworkModel();
|
||||
networkModel.initialize();
|
||||
|
||||
//Generate edge orchestrator
|
||||
edgeOrchestrator = scenarioFactory.getEdgeOrchestrator();
|
||||
edgeOrchestrator.initialize();
|
||||
|
||||
//Create Physical Servers
|
||||
edgeServerManager = new EdgeServerManager();
|
||||
|
||||
//Create Client Manager
|
||||
mobileDeviceManager = new MobileDeviceManager();
|
||||
|
||||
instance = this;
|
||||
}
|
||||
|
||||
public static SimManager getInstance(){
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggering CloudSim to start simulation
|
||||
*/
|
||||
public void startSimulation() throws Exception{
|
||||
//Starts the simulation
|
||||
SimLogger.print(super.getName()+" is starting...");
|
||||
|
||||
//Start Edge Servers & Generate VMs
|
||||
edgeServerManager.startDatacenters();
|
||||
edgeServerManager.createVmList(mobileDeviceManager.getId());
|
||||
|
||||
CloudSim.startSimulation();
|
||||
}
|
||||
|
||||
public ScenarioFactory getScenarioFactory(){
|
||||
return scenarioFactory;
|
||||
}
|
||||
|
||||
public int getNumOfMobileDevice(){
|
||||
return numOfMobileDevice;
|
||||
}
|
||||
|
||||
public NetworkModel getNetworkModel(){
|
||||
return networkModel;
|
||||
}
|
||||
|
||||
public MobilityModel getMobilityModel(){
|
||||
return mobilityModel;
|
||||
}
|
||||
|
||||
public EdgeOrchestrator getEdgeOrchestrator(){
|
||||
return edgeOrchestrator;
|
||||
}
|
||||
|
||||
public EdgeServerManager getLocalServerManager(){
|
||||
return edgeServerManager;
|
||||
}
|
||||
|
||||
public MobileDeviceManager getMobileDeviceManager(){
|
||||
return mobileDeviceManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startEntity() {
|
||||
for(int i=0; i<edgeServerManager.getDatacenterList().size(); i++)
|
||||
mobileDeviceManager.submitVmList(edgeServerManager.getVmList(i));
|
||||
|
||||
//Creation of tasks are scheduled here!
|
||||
for(int i=0; i< loadGeneratorModel.getTaskList().size(); i++)
|
||||
schedule(getId(), loadGeneratorModel.getTaskList().get(i).startTime, CREATE_TASK, loadGeneratorModel.getTaskList().get(i));
|
||||
|
||||
//Periodic event loops starts from here!
|
||||
schedule(getId(), 5, CHECK_ALL_VM);
|
||||
schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
|
||||
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
|
||||
schedule(getId(), SimSettings.getInstance().getSimulationTime(), STOP_SIMULATION);
|
||||
|
||||
SimLogger.printLine("Done.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processEvent(SimEvent ev) {
|
||||
synchronized(this){
|
||||
switch (ev.getTag()) {
|
||||
case CREATE_TASK:
|
||||
try {
|
||||
EdgeTask edgeTask = (EdgeTask) ev.getData();
|
||||
mobileDeviceManager.submitTask(edgeTask);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.exit(0);
|
||||
}
|
||||
break;
|
||||
case CHECK_ALL_VM:
|
||||
int totalNumOfVm = SimSettings.getInstance().getNumOfEdgeVMs();
|
||||
if(VmAllocationPolicy_Custom.getCreatedVmNum() != totalNumOfVm){
|
||||
SimLogger.printLine("All VMs cannot be created! Terminating simulation...");
|
||||
System.exit(0);
|
||||
}
|
||||
break;
|
||||
case GET_LOAD_LOG:
|
||||
SimLogger.getInstance().addVmUtilizationLog(CloudSim.clock(),edgeServerManager.getAvgUtilization());
|
||||
schedule(getId(), SimSettings.getInstance().getVmLoadLogInterval(), GET_LOAD_LOG);
|
||||
break;
|
||||
case PRINT_PROGRESS:
|
||||
int progress = (int)((CloudSim.clock()*100)/SimSettings.getInstance().getSimulationTime());
|
||||
if(progress % 10 == 0)
|
||||
SimLogger.print(Integer.toString(progress));
|
||||
else
|
||||
SimLogger.print(".");
|
||||
if(CloudSim.clock() < SimSettings.getInstance().getSimulationTime())
|
||||
schedule(getId(), SimSettings.getInstance().getSimulationTime()/100, PRINT_PROGRESS);
|
||||
break;
|
||||
case STOP_SIMULATION:
|
||||
SimLogger.printLine("100");
|
||||
CloudSim.terminateSimulation();
|
||||
try {
|
||||
SimLogger.getInstance().simStopped();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Log.printLine(getName() + ": unknown event type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdownEntity() {
|
||||
edgeServerManager.terminateDatacenters();
|
||||
}
|
||||
}
|
490
src/edu/boun/edgecloudsim/core/SimSettings.java
Normal file
490
src/edu/boun/edgecloudsim/core/SimSettings.java
Normal file
@ -0,0 +1,490 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Simulation Settings class
|
||||
*
|
||||
* Description:
|
||||
* SimSettings provides system wide simulation settings. It is a
|
||||
* singleton class and provides all necessary information to other modules.
|
||||
* If you need to use another simulation setting variable in your
|
||||
* config file, add related getter methot in this class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.core;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
|
||||
public class SimSettings {
|
||||
private static SimSettings instance = null;
|
||||
private Document edgeDevicesDoc = null;
|
||||
|
||||
//enumarations for the scenarion, VM, appplication, and place.
|
||||
//if you want to add different types on your config file,
|
||||
//you may modify current types or add new types here.
|
||||
public static enum VM_TYPES { EDGE_VM, CLOUD_VM }
|
||||
public static enum APP_TYPES { FACE_REC_APP, HEALTH_APP, HEAVY_COMP_APP, VIDEO_GAME_APP, SIMPLE_SERVICE_APP }
|
||||
public static enum PLACE_TYPES { ATTRACTIVENESS_L1, ATTRACTIVENESS_L2, ATTRACTIVENESS_L3 }
|
||||
public static enum SCENARIO_TYPES { SINGLE_TIER, TWO_TIER, TWO_TIER_WITH_EO }
|
||||
|
||||
//predifined ID for cloud components.
|
||||
public static int CLOUD_DATACENTER_ID = 1000;
|
||||
public static int CLOUD_HOST_ID = CLOUD_DATACENTER_ID + 1;
|
||||
public static int CLOUD_VM_ID = CLOUD_DATACENTER_ID + 2;
|
||||
|
||||
//delimiter for output file.
|
||||
public static String DELIMITER = ";";
|
||||
|
||||
private double SIMULATION_TIME; //hours unit in properties file
|
||||
private double WARM_UP_PERIOD; //seconds unit in properties file
|
||||
private double INTERVAL_TO_GET_VM_LOAD_LOG; //seconds unit in properties file
|
||||
private double INTERVAL_TO_GET_VM_LOCATION_LOG; //seconds unit in properties file
|
||||
private boolean DEEP_FILE_LOG_ENABLED; //used for each success failed task
|
||||
|
||||
private int MIN_NUM_OF_MOBILE_DEVICES;
|
||||
private int MAX_NUM_OF_MOBILE_DEVICES;
|
||||
private int MOBILE_DEVICE_COUNTER_SIZE;
|
||||
|
||||
private int NUM_OF_EDGE_DATACENTERS;
|
||||
private int NUM_OF_EDGE_HOSTS;
|
||||
private int NUM_OF_EDGE_VMS;
|
||||
|
||||
private double WAN_PROPOGATION_DELAY; //seconds unit in properties file
|
||||
private double LAN_INTERNAL_DELAY; //seconds unit in properties file
|
||||
private int BANDWITH_WLAN; //Mbps unit in properties file
|
||||
private int BANDWITH_WAN; //Mbps unit in properties file
|
||||
private int BANDWITH_GSM; //Mbps unit in properties file
|
||||
|
||||
private int MIPS_FOR_CLOUD; //MIPS
|
||||
|
||||
private String ORCHESTRATOR_POLICY;
|
||||
|
||||
// mean waiting time (minute) is stored for each place types
|
||||
private double[] mobilityLookUpTable;
|
||||
|
||||
// following values are stored for each applications defined in applications.xml
|
||||
// [0] usage percentage (%)
|
||||
// [1] prob. of selecting cloud (%)
|
||||
// [2] poisson mean (sec)
|
||||
// [3] active period (sec)
|
||||
// [4] idle period (sec)
|
||||
// [5] avg data upload (KB)
|
||||
// [6] avg data download (KB)
|
||||
// [7] avg task length (MI)
|
||||
// [8] required # of cores
|
||||
// [9] vm utilization (%)
|
||||
private double[][] taskLookUpTable = new double[APP_TYPES.values().length][10];
|
||||
|
||||
private SimSettings() {
|
||||
}
|
||||
|
||||
public static SimSettings getInstance() {
|
||||
if(instance == null) {
|
||||
instance = new SimSettings();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads configuration file and stores information to local variables
|
||||
* @param propertiesFile
|
||||
* @return
|
||||
*/
|
||||
public boolean initialize(String propertiesFile, String edgeDevicesFile, String applicationsFile){
|
||||
boolean result = false;
|
||||
InputStream input = null;
|
||||
try {
|
||||
input = new FileInputStream(propertiesFile);
|
||||
|
||||
// load a properties file
|
||||
Properties prop = new Properties();
|
||||
prop.load(input);
|
||||
|
||||
SIMULATION_TIME = 3600 * Double.parseDouble(prop.getProperty("simulation_time")); //hours
|
||||
WARM_UP_PERIOD = Double.parseDouble(prop.getProperty("warm_up_period")); //seconds
|
||||
INTERVAL_TO_GET_VM_LOAD_LOG = Double.parseDouble(prop.getProperty("vm_load_check_interval")); //seconds
|
||||
INTERVAL_TO_GET_VM_LOCATION_LOG = Double.parseDouble(prop.getProperty("vm_location_check_interval")); //seconds
|
||||
DEEP_FILE_LOG_ENABLED = Boolean.parseBoolean(prop.getProperty("deep_file_log_enabled"));
|
||||
|
||||
MIN_NUM_OF_MOBILE_DEVICES = Integer.parseInt(prop.getProperty("min_number_of_mobile_devices"));
|
||||
MAX_NUM_OF_MOBILE_DEVICES = Integer.parseInt(prop.getProperty("max_number_of_mobile_devices"));
|
||||
MOBILE_DEVICE_COUNTER_SIZE = Integer.parseInt(prop.getProperty("mobile_device_counter_size"));
|
||||
|
||||
WAN_PROPOGATION_DELAY = Double.parseDouble(prop.getProperty("wan_propogation_delay"));
|
||||
LAN_INTERNAL_DELAY = Double.parseDouble(prop.getProperty("lan_internal_delay"));
|
||||
BANDWITH_WLAN = 1000 * Integer.parseInt(prop.getProperty("wlan_bandwidth"));
|
||||
BANDWITH_WAN = 1000 * Integer.parseInt(prop.getProperty("wan_bandwidth"));
|
||||
BANDWITH_GSM = 1000 * Integer.parseInt(prop.getProperty("gsm_bandwidth"));
|
||||
|
||||
//It is assumed that
|
||||
//-Storage and RAM are unlimited in cloud
|
||||
//-Each task is executed with maximum capacity (as if there is no task in the cloud)
|
||||
MIPS_FOR_CLOUD = Integer.parseInt(prop.getProperty("mips_for_cloud"));
|
||||
|
||||
ORCHESTRATOR_POLICY = prop.getProperty("task_provisioning");
|
||||
|
||||
//avg waiting time in a place (min)
|
||||
double place1_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L1_mean_waiting_time"));
|
||||
double place2_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L2_mean_waiting_time"));
|
||||
double place3_mean_waiting_time = Double.parseDouble(prop.getProperty("attractiveness_L3_mean_waiting_time"));
|
||||
|
||||
//mean waiting time (minute)
|
||||
mobilityLookUpTable = new double[]{
|
||||
place1_mean_waiting_time, //ATTRACTIVENESS_L1
|
||||
place2_mean_waiting_time, //ATTRACTIVENESS_L2
|
||||
place3_mean_waiting_time //ATTRACTIVENESS_L3
|
||||
};
|
||||
|
||||
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
if (input != null) {
|
||||
try {
|
||||
input.close();
|
||||
result = true;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
parseApplicatinosXML(applicationsFile);
|
||||
parseEdgeDevicesXML(edgeDevicesFile);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the parsed XML document for edge_devices.xml
|
||||
*/
|
||||
public Document getEdgeDevicesDocument(){
|
||||
return edgeDevicesDoc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns simulation time (in hours unit) from properties file
|
||||
*/
|
||||
public double getSimulationTime()
|
||||
{
|
||||
return SIMULATION_TIME;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns warm up period (in seconds unit) from properties file
|
||||
*/
|
||||
public double getWarmUpPeriod()
|
||||
{
|
||||
return WARM_UP_PERIOD;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns VM utilization log collection interval (in seconds unit) from properties file
|
||||
*/
|
||||
public double getVmLoadLogInterval()
|
||||
{
|
||||
return INTERVAL_TO_GET_VM_LOAD_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns VM location log collection interval (in seconds unit) from properties file
|
||||
*/
|
||||
public double getVmLocationLogInterval()
|
||||
{
|
||||
return INTERVAL_TO_GET_VM_LOCATION_LOG;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns deep statistics logging status from properties file
|
||||
*/
|
||||
public boolean getDeepFileLoggingEnabled()
|
||||
{
|
||||
return DEEP_FILE_LOG_ENABLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns WAN propogation delay (in second unit) from properties file
|
||||
*/
|
||||
public double getWanPropogationDelay()
|
||||
{
|
||||
return WAN_PROPOGATION_DELAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns internal LAN propogation delay (in second unit) from properties file
|
||||
*/
|
||||
public double getInternalLanDelay()
|
||||
{
|
||||
return LAN_INTERNAL_DELAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns WLAN bandwidth (in Mbps unit) from properties file
|
||||
*/
|
||||
public int getWlanBandwidth()
|
||||
{
|
||||
return BANDWITH_WLAN;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns WAN bandwidth (in Mbps unit) from properties file
|
||||
*/
|
||||
public int getWanBandwidth()
|
||||
{
|
||||
return BANDWITH_WAN;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns GSM bandwidth (in Mbps unit) from properties file
|
||||
*/
|
||||
public int getGsmBandwidth()
|
||||
{
|
||||
return BANDWITH_GSM;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the minimum number of the mobile devices used in the simulation
|
||||
*/
|
||||
public int getMinNumOfMobileDev()
|
||||
{
|
||||
return MIN_NUM_OF_MOBILE_DEVICES;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the maximunm number of the mobile devices used in the simulation
|
||||
*/
|
||||
public int getMaxNumOfMobileDev()
|
||||
{
|
||||
return MAX_NUM_OF_MOBILE_DEVICES;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of increase on mobile devices
|
||||
* while iterating from min to max mobile device
|
||||
*/
|
||||
public int getMobileDevCounterSize()
|
||||
{
|
||||
return MOBILE_DEVICE_COUNTER_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of edge datacenters
|
||||
*/
|
||||
public int getNumOfEdgeDatacenters()
|
||||
{
|
||||
return NUM_OF_EDGE_DATACENTERS;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of edge hosts running on the datacenters
|
||||
*/
|
||||
public int getNumOfEdgeHosts()
|
||||
{
|
||||
return NUM_OF_EDGE_HOSTS;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of edge VMs running on the hosts
|
||||
*/
|
||||
public int getNumOfEdgeVMs()
|
||||
{
|
||||
return NUM_OF_EDGE_VMS;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns MIPS of the central cloud
|
||||
*/
|
||||
public int getMipsForCloud()
|
||||
{
|
||||
return MIPS_FOR_CLOUD;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns orchestrator policy as string
|
||||
*/
|
||||
public String getOrchestratorPolicy()
|
||||
{
|
||||
return ORCHESTRATOR_POLICY;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns mobility characteristic within an array
|
||||
* the result includes mean waiting time (minute) or each place type
|
||||
*/
|
||||
public double[] getMobilityLookUpTable()
|
||||
{
|
||||
return mobilityLookUpTable;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns application characteristic within two dimensional array
|
||||
* the result includes the following values for each application type
|
||||
* [0] usage percentage (%)
|
||||
* [1] prob. of selecting cloud (%)
|
||||
* [2] poisson mean (sec)
|
||||
* [3] active period (sec)
|
||||
* [4] idle period (sec)
|
||||
* [5] avg data upload (KB)
|
||||
* [6] avg data download (KB)
|
||||
* [7] avg task length (MI)
|
||||
* [8] required # of cores
|
||||
* [9] vm utilization (%)
|
||||
*/
|
||||
public double[][] getTaskLookUpTable()
|
||||
{
|
||||
return taskLookUpTable;
|
||||
}
|
||||
|
||||
private void isAttribtuePresent(Element element, String key) {
|
||||
String value = element.getAttribute(key);
|
||||
if (value.isEmpty() || value == null){
|
||||
throw new IllegalArgumentException("Attribure '" + key + "' is not found in '" + element.getNodeName() +"'");
|
||||
}
|
||||
}
|
||||
|
||||
private void isElementPresent(Element element, String key) {
|
||||
try {
|
||||
String value = element.getElementsByTagName(key).item(0).getTextContent();
|
||||
if (value.isEmpty() || value == null){
|
||||
throw new IllegalArgumentException("Element '" + key + "' is not found in '" + element.getNodeName() +"'");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException("Element '" + key + "' is not found in '" + element.getNodeName() +"'");
|
||||
}
|
||||
}
|
||||
|
||||
private void parseApplicatinosXML(String filePath)
|
||||
{
|
||||
Document doc = null;
|
||||
try {
|
||||
File devicesFile = new File(filePath);
|
||||
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
|
||||
doc = dBuilder.parse(devicesFile);
|
||||
doc.getDocumentElement().normalize();
|
||||
|
||||
NodeList appList = doc.getElementsByTagName("application");
|
||||
for (int i = 0; i < appList.getLength(); i++) {
|
||||
Node appNode = appList.item(i);
|
||||
|
||||
Element appElement = (Element) appNode;
|
||||
isAttribtuePresent(appElement, "name");
|
||||
isElementPresent(appElement, "usage_percentage");
|
||||
isElementPresent(appElement, "prob_cloud_selection");
|
||||
isElementPresent(appElement, "poisson_interarrival");
|
||||
isElementPresent(appElement, "active_period");
|
||||
isElementPresent(appElement, "idle_period");
|
||||
isElementPresent(appElement, "data_upload");
|
||||
isElementPresent(appElement, "data_download");
|
||||
isElementPresent(appElement, "task_length");
|
||||
isElementPresent(appElement, "required_core");
|
||||
isElementPresent(appElement, "vm_utilization");
|
||||
|
||||
String appName = appElement.getAttribute("name");
|
||||
SimSettings.APP_TYPES appType = APP_TYPES.valueOf(appName);
|
||||
double usage_percentage = Double.parseDouble(appElement.getElementsByTagName("usage_percentage").item(0).getTextContent());
|
||||
double prob_cloud_selection = Double.parseDouble(appElement.getElementsByTagName("prob_cloud_selection").item(0).getTextContent());
|
||||
double poisson_interarrival = Double.parseDouble(appElement.getElementsByTagName("poisson_interarrival").item(0).getTextContent());
|
||||
double active_period = Double.parseDouble(appElement.getElementsByTagName("active_period").item(0).getTextContent());
|
||||
double idle_period = Double.parseDouble(appElement.getElementsByTagName("idle_period").item(0).getTextContent());
|
||||
double data_upload = Double.parseDouble(appElement.getElementsByTagName("data_upload").item(0).getTextContent());
|
||||
double data_download = Double.parseDouble(appElement.getElementsByTagName("data_download").item(0).getTextContent());
|
||||
double task_length = Double.parseDouble(appElement.getElementsByTagName("task_length").item(0).getTextContent());
|
||||
double required_core = Double.parseDouble(appElement.getElementsByTagName("required_core").item(0).getTextContent());
|
||||
double vm_utilization = Double.parseDouble(appElement.getElementsByTagName("vm_utilization").item(0).getTextContent());
|
||||
|
||||
taskLookUpTable[appType.ordinal()][0] = usage_percentage; //usage percentage (%)
|
||||
taskLookUpTable[appType.ordinal()][1] = prob_cloud_selection; //prob. of selecting cloud (%)
|
||||
taskLookUpTable[appType.ordinal()][2] = poisson_interarrival; //poisson mean (sec)
|
||||
taskLookUpTable[appType.ordinal()][3] = active_period; //active period (sec)
|
||||
taskLookUpTable[appType.ordinal()][4] = idle_period; //idle period (sec)
|
||||
taskLookUpTable[appType.ordinal()][5] = data_upload; //avg data upload (KB)
|
||||
taskLookUpTable[appType.ordinal()][6] = data_download; //avg data download (KB)
|
||||
taskLookUpTable[appType.ordinal()][7] = task_length; //avg task length (MI)
|
||||
taskLookUpTable[appType.ordinal()][8] = required_core; //required # of core
|
||||
taskLookUpTable[appType.ordinal()][9] = vm_utilization; //vm utilization (%)
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
SimLogger.printLine("Edge Devices XML cannot be parsed! Terminating simulation...");
|
||||
e.printStackTrace();
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
private void parseEdgeDevicesXML(String filePath)
|
||||
{
|
||||
try {
|
||||
File devicesFile = new File(filePath);
|
||||
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
|
||||
edgeDevicesDoc = dBuilder.parse(devicesFile);
|
||||
edgeDevicesDoc.getDocumentElement().normalize();
|
||||
|
||||
NodeList datacenterList = edgeDevicesDoc.getElementsByTagName("datacenter");
|
||||
for (int i = 0; i < datacenterList.getLength(); i++) {
|
||||
NUM_OF_EDGE_DATACENTERS++;
|
||||
Node datacenterNode = datacenterList.item(i);
|
||||
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
isAttribtuePresent(datacenterElement, "arch");
|
||||
isAttribtuePresent(datacenterElement, "os");
|
||||
isAttribtuePresent(datacenterElement, "vmm");
|
||||
isElementPresent(datacenterElement, "costPerBw");
|
||||
isElementPresent(datacenterElement, "costPerSec");
|
||||
isElementPresent(datacenterElement, "costPerMem");
|
||||
isElementPresent(datacenterElement, "costPerStorage");
|
||||
|
||||
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
||||
isElementPresent(location, "attractiveness");
|
||||
isElementPresent(location, "wlan_id");
|
||||
isElementPresent(location, "x_pos");
|
||||
isElementPresent(location, "y_pos");
|
||||
|
||||
NodeList hostList = datacenterElement.getElementsByTagName("host");
|
||||
for (int j = 0; j < hostList.getLength(); j++) {
|
||||
NUM_OF_EDGE_HOSTS++;
|
||||
Node hostNode = hostList.item(j);
|
||||
|
||||
Element hostElement = (Element) hostNode;
|
||||
isElementPresent(hostElement, "core");
|
||||
isElementPresent(hostElement, "mips");
|
||||
isElementPresent(hostElement, "ram");
|
||||
isElementPresent(hostElement, "storage");
|
||||
|
||||
NodeList vmList = hostElement.getElementsByTagName("VM");
|
||||
for (int k = 0; k < vmList.getLength(); k++) {
|
||||
NUM_OF_EDGE_VMS++;
|
||||
Node vmNode = vmList.item(k);
|
||||
|
||||
Element vmElement = (Element) vmNode;
|
||||
isAttribtuePresent(vmElement, "vmm");
|
||||
isElementPresent(vmElement, "core");
|
||||
isElementPresent(vmElement, "mips");
|
||||
isElementPresent(vmElement, "ram");
|
||||
isElementPresent(vmElement, "storage");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
SimLogger.printLine("Edge Devices XML cannot be parsed! Terminating simulation...");
|
||||
e.printStackTrace();
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Custom VM Cpu Utilization Model
|
||||
*
|
||||
* Description:
|
||||
* CpuUtilizationModel_Custom implements UtilizationModel and used for
|
||||
* VM CPU utilization model. In CloudSim, the CPU utilization of the VM
|
||||
* is a simple counter. We provide more realistic utilization model
|
||||
* which decide CPU utilization of each application by using the
|
||||
* values defined in the applications.xml file. For those who wants to
|
||||
* add another VM Cpu Utilization Model to EdgeCloudSim should provide
|
||||
* another concreate instance of UtilizationModel via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class CpuUtilizationModel_Custom implements UtilizationModel {
|
||||
private SimSettings.APP_TYPES taskType;
|
||||
|
||||
public CpuUtilizationModel_Custom(SimSettings.APP_TYPES _taskType){
|
||||
taskType=_taskType;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see cloudsim.power.UtilizationModel#getUtilization(double)
|
||||
*/
|
||||
@Override
|
||||
public double getUtilization(double time) {
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][9];
|
||||
}
|
||||
|
||||
public double predictUtilization(SimSettings.VM_TYPES _vmType){
|
||||
return SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][9];
|
||||
}
|
||||
}
|
258
src/edu/boun/edgecloudsim/edge_client/MobileDeviceManager.java
Normal file
258
src/edu/boun/edgecloudsim/edge_client/MobileDeviceManager.java
Normal file
@ -0,0 +1,258 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Mobile Device Manager
|
||||
*
|
||||
* Description:
|
||||
* MobileDeviceManager is responsible for submitting the tasks to the related
|
||||
* device by using the Edge Orchestrator. It also takes proper actions
|
||||
* when the execution of the tasks are finished.
|
||||
* By default, MobileDeviceManager sends tasks to the edge servers or
|
||||
* cloud servers. If you want to use different topology, for example
|
||||
* MAN edge server, you should modify the flow defined in this class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.DatacenterBroker;
|
||||
import org.cloudbus.cloudsim.Cloudlet;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
import org.cloudbus.cloudsim.UtilizationModelFull;
|
||||
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.edge_server.EdgeVM;
|
||||
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 MobileDeviceManager extends DatacenterBroker {
|
||||
private static final int BASE = 100000; //start from base in order not to conflict cloudsim tag!
|
||||
private static final int REQUEST_RECEIVED_BY_CLOUD = BASE + 1;
|
||||
private static final int REQUEST_PROCESSED_BY_CLOUD = BASE + 2;
|
||||
private static final int REQUEST_RECIVED_BY_EDGE_DEVICE = BASE + 3;
|
||||
private static final int RESPONSE_RECEIVED_BY_MOBILE_DEVICE = BASE + 4;
|
||||
private int taskIdCounter=0;
|
||||
|
||||
public MobileDeviceManager() throws Exception {
|
||||
super("Global_Broker");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
if(task.getSubmittedLocation().equals(currentLocation))
|
||||
{
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + task.getCloudletId() + " received");
|
||||
double WlanDelay = networkModel.getDownloadDelay(task.getAssociatedHostId(), task.getMobileDeviceId());
|
||||
if(WlanDelay > 0)
|
||||
{
|
||||
schedule(getId(), WlanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
SimLogger.getInstance().downloadStarted(task.getCloudletId(), WlanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("task cannot be finished due to mobility of user!");
|
||||
//SimLogger.printLine("device: " +task.getMobileDeviceId()+" - submitted " + task.getSubmissionTime() + " @ " + task.getSubmittedLocation().getXPos() + " handled " + CloudSim.clock() + " @ " + currentLocation.getXPos());
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
|
||||
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_CLOUD:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
|
||||
task.setSubmittedLocation(currentLocation);
|
||||
task.setAssociatedHostId(SimSettings.CLOUD_HOST_ID);
|
||||
|
||||
SimLogger.getInstance().uploaded(task.getCloudletId(),
|
||||
SimSettings.CLOUD_DATACENTER_ID,
|
||||
SimSettings.CLOUD_HOST_ID,
|
||||
SimSettings.CLOUD_VM_ID,
|
||||
SimSettings.VM_TYPES.CLOUD_VM.ordinal());
|
||||
|
||||
//calculate computational delay in cloud
|
||||
double ComputationDelay = (double)task.getCloudletLength() / (double)SimSettings.getInstance().getMipsForCloud();
|
||||
|
||||
schedule(getId(), ComputationDelay, REQUEST_PROCESSED_BY_CLOUD, task);
|
||||
|
||||
break;
|
||||
}
|
||||
case REQUEST_PROCESSED_BY_CLOUD:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
|
||||
if(task.getSubmittedLocation().equals(currentLocation))
|
||||
{
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + task.getCloudletId() + " received");
|
||||
double WanDelay = networkModel.getDownloadDelay(SimSettings.CLOUD_DATACENTER_ID, task.getMobileDeviceId());
|
||||
if(WanDelay > 0)
|
||||
{
|
||||
schedule(getId(), WanDelay, RESPONSE_RECEIVED_BY_MOBILE_DEVICE, task);
|
||||
SimLogger.getInstance().downloadStarted(task.getCloudletId(), WanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
SimLogger.getInstance().failedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("task cannot be finished due to mobility of user!");
|
||||
//SimLogger.printLine("device: " +task.getMobileDeviceId()+" - submitted " + task.getSubmissionTime() + " @ " + task.getSubmittedLocation().getXPos() + " handled " + CloudSim.clock() + " @ " + currentLocation.getXPos());
|
||||
SimLogger.getInstance().failedDueToMobility(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case REQUEST_RECIVED_BY_EDGE_DEVICE:
|
||||
{
|
||||
Task task = (Task) ev.getData();
|
||||
|
||||
Location currentLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(),CloudSim.clock());
|
||||
|
||||
//select a VM
|
||||
EdgeVM selectedVM = SimManager.getInstance().getEdgeOrchestrator().selectVm(task);
|
||||
|
||||
if(selectedVM != null){
|
||||
//save task info
|
||||
task.setSubmittedLocation(currentLocation);
|
||||
task.setAssociatedHostId(selectedVM.getHost().getId());
|
||||
|
||||
//bind task to related VM
|
||||
getCloudletList().add(task);
|
||||
bindCloudletToVm(task.getCloudletId(),selectedVM.getId());
|
||||
|
||||
//SimLogger.printLine(CloudSim.clock() + ": Cloudlet#" + task.getCloudletId() + " is submitted to VM#" + task.getVmId());
|
||||
sendNow(getVmsToDatacentersMap().get(task.getVmId()), CloudSimTags.CLOUDLET_SUBMIT, task);
|
||||
|
||||
SimLogger.getInstance().uploaded(task.getCloudletId(),
|
||||
selectedVM.getHost().getDatacenter().getId(),
|
||||
selectedVM.getHost().getId(),
|
||||
selectedVM.getId(),
|
||||
selectedVM.getVmType().ordinal());
|
||||
}
|
||||
else{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToVMCapacity(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case RESPONSE_RECEIVED_BY_MOBILE_DEVICE:
|
||||
{
|
||||
Cloudlet cloudlet = (Cloudlet) ev.getData();
|
||||
//SimLogger.printLine(CloudSim.clock() + ": " + getName() + ": Cloudlet " + cloudlet.getCloudletId() + " is received");
|
||||
SimLogger.getInstance().downloaded(cloudlet.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) {
|
||||
NetworkModel networkModel = SimManager.getInstance().getNetworkModel();
|
||||
|
||||
//create a task
|
||||
Task task = createTask(edgeTask);
|
||||
|
||||
//add related task to log list
|
||||
SimLogger.getInstance().addLog(CloudSim.clock(),
|
||||
task.getCloudletId(),
|
||||
task.getTaskType().ordinal(),
|
||||
(int)task.getCloudletLength(),
|
||||
(int)task.getCloudletFileSize(),
|
||||
(int)task.getCloudletOutputSize());
|
||||
|
||||
if(edgeTask.requireCloud){
|
||||
double WanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(),SimSettings.CLOUD_DATACENTER_ID);
|
||||
if(WanDelay>0){
|
||||
schedule(getId(), WanDelay, REQUEST_RECEIVED_BY_CLOUD, task);
|
||||
SimLogger.getInstance().uploadStarted(task.getCloudletId(),WanDelay);
|
||||
}
|
||||
else
|
||||
{
|
||||
//SimLogger.printLine("Task #" + task.getCloudletId() + " cannot assign to any VM");
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
else {
|
||||
double WlanDelay = networkModel.getUploadDelay(task.getMobileDeviceId(),0);
|
||||
if(WlanDelay > 0){
|
||||
schedule(getId(), WlanDelay, REQUEST_RECIVED_BY_EDGE_DEVICE, task);
|
||||
SimLogger.getInstance().uploadStarted(task.getCloudletId(),WlanDelay);
|
||||
}
|
||||
else {
|
||||
SimLogger.getInstance().rejectedDueToBandwidth(task.getCloudletId(), CloudSim.clock());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Task createTask(EdgeTask edgeTask){
|
||||
UtilizationModel utilizationModel = new UtilizationModelFull(); /*UtilizationModelStochastic*/
|
||||
UtilizationModel utilizationModelCPU = SimManager.getInstance().getScenarioFactory().getCpuUtilizationModel(edgeTask.taskType);
|
||||
|
||||
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);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public void taskEnded(){
|
||||
clearDatacenters();
|
||||
finishExecution();
|
||||
}
|
||||
}
|
66
src/edu/boun/edgecloudsim/edge_client/Task.java
Normal file
66
src/edu/boun/edgecloudsim/edge_client/Task.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Task
|
||||
*
|
||||
* Description:
|
||||
* Task adds app type, task submission location, mobile device id and host id
|
||||
* information to CloudSim's Cloudlet class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_client;
|
||||
|
||||
import org.cloudbus.cloudsim.Cloudlet;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public class Task extends Cloudlet {
|
||||
private SimSettings.APP_TYPES type;
|
||||
private Location submittedLocation;
|
||||
private int mobileDeviceId;
|
||||
private int hostIndex;
|
||||
|
||||
public Task(int _mobileDeviceId, int cloudletId, long cloudletLength, int pesNumber,
|
||||
long cloudletFileSize, long cloudletOutputSize,
|
||||
UtilizationModel utilizationModelCpu,
|
||||
UtilizationModel utilizationModelRam,
|
||||
UtilizationModel utilizationModelBw) {
|
||||
super(cloudletId, cloudletLength, pesNumber, cloudletFileSize,
|
||||
cloudletOutputSize, utilizationModelCpu, utilizationModelRam,
|
||||
utilizationModelBw);
|
||||
|
||||
mobileDeviceId = _mobileDeviceId;
|
||||
}
|
||||
|
||||
|
||||
public void setSubmittedLocation(Location _submittedLocation){
|
||||
submittedLocation =_submittedLocation;
|
||||
}
|
||||
|
||||
public void setAssociatedHostId(int _hostIndex){
|
||||
hostIndex=_hostIndex;
|
||||
}
|
||||
|
||||
public void setTaskType(SimSettings.APP_TYPES _type){
|
||||
type=_type;
|
||||
}
|
||||
|
||||
public int getMobileDeviceId(){
|
||||
return mobileDeviceId;
|
||||
}
|
||||
|
||||
public Location getSubmittedLocation(){
|
||||
return submittedLocation;
|
||||
}
|
||||
|
||||
public int getAssociatedHostId(){
|
||||
return hostIndex;
|
||||
}
|
||||
|
||||
public SimSettings.APP_TYPES getTaskType(){
|
||||
return type;
|
||||
}
|
||||
}
|
@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Basic Edge Orchestrator implementation
|
||||
*
|
||||
* Description:
|
||||
* BasicEdgeOrchestrator implements basic algorithms which are
|
||||
* first/next/best/worst/random fit algorithms while assigning
|
||||
* requests to the edge devices.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_orchestrator;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.SCENARIO_TYPES;
|
||||
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.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||
|
||||
public class BasicEdgeOrchestrator extends EdgeOrchestrator {
|
||||
private int numberOfHost; //used by load balancer
|
||||
private int lastSelectedHostIndex; //used by load balancer
|
||||
private int[] lastSelectedVmIndexes; //used by each host individually
|
||||
|
||||
public BasicEdgeOrchestrator(String _policy,
|
||||
SCENARIO_TYPES _simScenario) {
|
||||
super(_policy, _simScenario);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
numberOfHost=SimSettings.getInstance().getNumOfEdgeHosts();
|
||||
|
||||
lastSelectedHostIndex = -1;
|
||||
lastSelectedVmIndexes = new int[numberOfHost];
|
||||
for(int i=0; i<numberOfHost; i++)
|
||||
lastSelectedVmIndexes[i] = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EdgeVM selectVm(Task task) {
|
||||
if(simScenario == SimSettings.SCENARIO_TYPES.TWO_TIER_WITH_EO)
|
||||
return selectVmOnLoadBalancer(task);
|
||||
else
|
||||
return selectVmOnHost(task);
|
||||
}
|
||||
|
||||
public EdgeVM selectVmOnHost(Task task){
|
||||
EdgeVM selectedVM = null;
|
||||
|
||||
Location deviceLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(), CloudSim.clock());
|
||||
//in our scenasrio, serving wlan ID is equal to the host id
|
||||
//because there is only one host in one place
|
||||
int relatedHostId=deviceLocation.getServingWlanId();
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(relatedHostId);
|
||||
|
||||
if(policy.equalsIgnoreCase("RANDOM_FIT")){
|
||||
int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity)
|
||||
selectedVM = vmArray.get(randomIndex);
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("WORST_FIT")){
|
||||
double selectedVmCapacity = 0; //start with min value
|
||||
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 if(policy.equalsIgnoreCase("BEST_FIT")){
|
||||
double selectedVmCapacity = 101; //start with max value
|
||||
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 if(policy.equalsIgnoreCase("FIRST_FIT")){
|
||||
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){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("NEXT_FIT")){
|
||||
int tries = 0;
|
||||
while(tries < vmArray.size()){
|
||||
lastSelectedVmIndexes[relatedHostId] = (lastSelectedVmIndexes[relatedHostId]+1) % vmArray.size();
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[relatedHostId]).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[relatedHostId]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(lastSelectedVmIndexes[relatedHostId]);
|
||||
break;
|
||||
}
|
||||
tries++;
|
||||
}
|
||||
}
|
||||
|
||||
return selectedVM;
|
||||
}
|
||||
|
||||
public EdgeVM selectVmOnLoadBalancer(Task task){
|
||||
EdgeVM selectedVM = null;
|
||||
|
||||
if(policy.equalsIgnoreCase("RANDOM_FIT")){
|
||||
int randomHostIndex = SimUtils.getRandomNumber(0, numberOfHost-1);
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(randomHostIndex);
|
||||
int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
|
||||
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity)
|
||||
selectedVM = vmArray.get(randomIndex);
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("WORST_FIT")){
|
||||
double selectedVmCapacity = 0; //start with min value
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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 if(policy.equalsIgnoreCase("BEST_FIT")){
|
||||
double selectedVmCapacity = 101; //start with max value
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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 if(policy.equalsIgnoreCase("FIRST_FIT")){
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().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){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("NEXT_FIT")){
|
||||
int hostCheckCounter = 0;
|
||||
while(selectedVM == null && hostCheckCounter < numberOfHost){
|
||||
int tries = 0;
|
||||
lastSelectedHostIndex = (lastSelectedHostIndex+1) % numberOfHost;
|
||||
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(lastSelectedHostIndex);
|
||||
while(tries < vmArray.size()){
|
||||
lastSelectedVmIndexes[lastSelectedHostIndex] = (lastSelectedVmIndexes[lastSelectedHostIndex]+1) % vmArray.size();
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]);
|
||||
break;
|
||||
}
|
||||
tries++;
|
||||
}
|
||||
|
||||
hostCheckCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
return selectedVM;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Edge Orchestrator
|
||||
*
|
||||
* Description:
|
||||
* EdgeOrchestrator is an abstract class which is used for selecting VM
|
||||
* for each client requests. For those who wants to add a custom
|
||||
* Edge Orchestrator to EdgeCloudSim should extend this class and provide
|
||||
* a concreate instance via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_orchestrator;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
||||
import edu.boun.edgecloudsim.edge_client.Task;
|
||||
|
||||
public abstract class EdgeOrchestrator {
|
||||
protected String policy;
|
||||
protected SimSettings.SCENARIO_TYPES simScenario;
|
||||
|
||||
public EdgeOrchestrator(String _policy, SimSettings.SCENARIO_TYPES _simScenario){
|
||||
policy = _policy;
|
||||
simScenario = _simScenario;
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize edge orchestrator if needed
|
||||
*/
|
||||
public abstract void initialize();
|
||||
|
||||
/*
|
||||
* returns proper VM from the related edge orchestrator point of view
|
||||
*/
|
||||
public abstract EdgeVM selectVm(Task task);
|
||||
}
|
40
src/edu/boun/edgecloudsim/edge_server/EdgeHost.java
Normal file
40
src/edu/boun/edgecloudsim/edge_server/EdgeHost.java
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - EdgeHost
|
||||
*
|
||||
* Description:
|
||||
* EdgeHost adds location information over CloudSim's Host class
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_server;
|
||||
|
||||
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;
|
||||
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public class EdgeHost extends Host {
|
||||
private Location location;
|
||||
|
||||
public EdgeHost(int id, RamProvisioner ramProvisioner,
|
||||
BwProvisioner bwProvisioner, long storage,
|
||||
List<? extends Pe> peList, VmScheduler vmScheduler) {
|
||||
super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler);
|
||||
|
||||
}
|
||||
|
||||
public void setPlace(Location _location){
|
||||
location=_location;
|
||||
}
|
||||
|
||||
public Location getLocation(){
|
||||
return location;
|
||||
}
|
||||
}
|
224
src/edu/boun/edgecloudsim/edge_server/EdgeServerManager.java
Normal file
224
src/edu/boun/edgecloudsim/edge_server/EdgeServerManager.java
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Edge Server Manager
|
||||
*
|
||||
* Description:
|
||||
* EdgeServerManager is responsible for creating datacenters, hosts and VMs.
|
||||
* It also provides the list of VMs running on the hosts.
|
||||
* This information is critical for the edge orchestrator.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_server;
|
||||
|
||||
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 org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||
|
||||
public class EdgeServerManager {
|
||||
private List<Datacenter> localDatacenters;
|
||||
private List<List<EdgeVM>> vmList;
|
||||
private int hostIdCounter;
|
||||
|
||||
public EdgeServerManager() {
|
||||
localDatacenters=new ArrayList<Datacenter>();
|
||||
vmList = new ArrayList<List<EdgeVM>>();
|
||||
hostIdCounter = 0;
|
||||
}
|
||||
|
||||
public List<EdgeVM> getVmList(int hostId){
|
||||
return vmList.get(hostId);
|
||||
}
|
||||
|
||||
public List<Datacenter> getDatacenterList(){
|
||||
return localDatacenters;
|
||||
}
|
||||
|
||||
public void startDatacenters() throws Exception{
|
||||
//create random number generator for each place
|
||||
Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
|
||||
NodeList datacenterList = doc.getElementsByTagName("datacenter");
|
||||
for (int i = 0; i < datacenterList.getLength(); i++) {
|
||||
Node datacenterNode = datacenterList.item(i);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
localDatacenters.add(createDatacenter(i, datacenterElement));
|
||||
}
|
||||
}
|
||||
|
||||
public void createVmList(int brockerId){
|
||||
int hostCounter=0;
|
||||
int vmCounter=0;
|
||||
|
||||
//Create VMs for each hosts
|
||||
Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
|
||||
NodeList datacenterList = doc.getElementsByTagName("datacenter");
|
||||
for (int i = 0; i < datacenterList.getLength(); i++) {
|
||||
Node datacenterNode = datacenterList.item(i);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
|
||||
for (int j = 0; j < hostNodeList.getLength(); j++) {
|
||||
|
||||
vmList.add(hostCounter, new ArrayList<EdgeVM>());
|
||||
|
||||
Node hostNode = hostNodeList.item(j);
|
||||
Element hostElement = (Element) hostNode;
|
||||
NodeList vmNodeList = hostElement.getElementsByTagName("VM");
|
||||
for (int k = 0; k < vmNodeList.getLength(); k++) {
|
||||
Node vmNode = vmNodeList.item(k);
|
||||
Element vmElement = (Element) vmNode;
|
||||
|
||||
String vmm = vmElement.getAttribute("vmm");
|
||||
int numOfCores = Integer.parseInt(vmElement.getElementsByTagName("core").item(0).getTextContent());
|
||||
double mips = Double.parseDouble(vmElement.getElementsByTagName("mips").item(0).getTextContent());
|
||||
int ram = Integer.parseInt(vmElement.getElementsByTagName("ram").item(0).getTextContent());
|
||||
long storage = Long.parseLong(vmElement.getElementsByTagName("storage").item(0).getTextContent());
|
||||
long bandwidth = SimSettings.getInstance().getWlanBandwidth() / (hostNodeList.getLength()+vmNodeList.getLength());
|
||||
|
||||
//VM Parameters
|
||||
EdgeVM vm = new EdgeVM(vmCounter, brockerId, mips, numOfCores, ram, bandwidth, storage, vmm, new CloudletSchedulerTimeShared());
|
||||
vm.setVmType(SimSettings.VM_TYPES.EDGE_VM);
|
||||
vmList.get(hostCounter).add(vm);
|
||||
vmCounter++;
|
||||
}
|
||||
|
||||
hostCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void terminateDatacenters(){
|
||||
for (Datacenter datacenter : localDatacenters) {
|
||||
datacenter.shutdownEntity();
|
||||
}
|
||||
}
|
||||
|
||||
//average utilization of all VMs
|
||||
public double getAvgUtilization(){
|
||||
double totalUtilization = 0;
|
||||
double vmCounter = 0;
|
||||
|
||||
// for each datacenter...
|
||||
for(int i= 0; i<localDatacenters.size(); i++) {
|
||||
List<? extends Host> list = localDatacenters.get(i).getHostList();
|
||||
// for each host...
|
||||
for (int j=0; j < list.size(); j++) {
|
||||
Host host = list.get(j);
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(host.getId());
|
||||
//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, Element datacenterElement) throws Exception{
|
||||
String arch = datacenterElement.getAttribute("arch");
|
||||
String os = datacenterElement.getAttribute("os");
|
||||
String vmm = datacenterElement.getAttribute("vmm");
|
||||
double costPerBw = Double.parseDouble(datacenterElement.getElementsByTagName("costPerBw").item(0).getTextContent());
|
||||
double costPerSec = Double.parseDouble(datacenterElement.getElementsByTagName("costPerSec").item(0).getTextContent());
|
||||
double costPerMem = Double.parseDouble(datacenterElement.getElementsByTagName("costPerMem").item(0).getTextContent());
|
||||
double costPerStorage = Double.parseDouble(datacenterElement.getElementsByTagName("costPerStorage").item(0).getTextContent());
|
||||
|
||||
List<EdgeHost> hostList=createHosts(datacenterElement);
|
||||
|
||||
String name = "Datacenter_" + 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 = SimManager.getInstance().getScenarioFactory().getVmAllocationPolicy(hostList,index);
|
||||
datacenter = new Datacenter(name, characteristics, vm_policy, storageList, 0);
|
||||
|
||||
return datacenter;
|
||||
}
|
||||
|
||||
private List<EdgeHost> createHosts(Element datacenterElement){
|
||||
|
||||
// Here are the steps needed to create a PowerDatacenter:
|
||||
// 1. We need to create a list to store one or more Machines
|
||||
List<EdgeHost> hostList = new ArrayList<EdgeHost>();
|
||||
|
||||
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
||||
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
||||
int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
|
||||
int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
|
||||
int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
|
||||
SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
|
||||
|
||||
NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
|
||||
for (int j = 0; j < hostNodeList.getLength(); j++) {
|
||||
Node hostNode = hostNodeList.item(j);
|
||||
|
||||
Element hostElement = (Element) hostNode;
|
||||
int numOfCores = Integer.parseInt(hostElement.getElementsByTagName("core").item(0).getTextContent());
|
||||
double mips = Double.parseDouble(hostElement.getElementsByTagName("mips").item(0).getTextContent());
|
||||
int ram = Integer.parseInt(hostElement.getElementsByTagName("ram").item(0).getTextContent());
|
||||
long storage = Long.parseLong(hostElement.getElementsByTagName("storage").item(0).getTextContent());
|
||||
long bandwidth = SimSettings.getInstance().getWlanBandwidth() / hostNodeList.getLength();
|
||||
|
||||
// 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 i=0; i<numOfCores; i++){
|
||||
peList.add(new Pe(i, 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
|
||||
EdgeHost host = new EdgeHost(
|
||||
hostIdCounter,
|
||||
new RamProvisionerSimple(ram),
|
||||
new BwProvisionerSimple(bandwidth), //kbps
|
||||
storage,
|
||||
peList,
|
||||
new VmSchedulerSpaceShared(peList)
|
||||
);
|
||||
|
||||
host.setPlace(new Location(placeType, wlan_id, x_pos, y_pos));
|
||||
hostList.add(host);
|
||||
hostIdCounter++;
|
||||
}
|
||||
|
||||
return hostList;
|
||||
}
|
||||
}
|
34
src/edu/boun/edgecloudsim/edge_server/EdgeVM.java
Normal file
34
src/edu/boun/edgecloudsim/edge_server/EdgeVM.java
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - EdgeVM
|
||||
*
|
||||
* Description:
|
||||
* EdgeVM adds vm type information over CloudSim's VM class
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_server;
|
||||
|
||||
import org.cloudbus.cloudsim.CloudletScheduler;
|
||||
import org.cloudbus.cloudsim.Vm;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class EdgeVM extends Vm {
|
||||
private SimSettings.VM_TYPES type;
|
||||
|
||||
public EdgeVM(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);
|
||||
|
||||
}
|
||||
|
||||
public void setVmType(SimSettings.VM_TYPES _type){
|
||||
type=_type;
|
||||
}
|
||||
|
||||
public SimSettings.VM_TYPES getVmType(){
|
||||
return type;
|
||||
}
|
||||
}
|
@ -0,0 +1,158 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Custom Vm Allocation Policy
|
||||
*
|
||||
* Description:
|
||||
* VmAllocationPolicy_Custom implements VmAllocationPolicy to decide which.
|
||||
* VM is created on which host locatied on the datacenters. For those
|
||||
* who wants to add another Vm Allocation Policy to EdgeCloudSim should
|
||||
* provide another concreate instance of VmAllocationPolicy via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_server;
|
||||
|
||||
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 org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
/*
|
||||
* Same as VmAllocationPolicySimple.
|
||||
*/
|
||||
public class VmAllocationPolicy_Custom extends VmAllocationPolicy {
|
||||
/** The vm table. */
|
||||
private Map<String, Host> vmTable;
|
||||
private static int createdVmNum;
|
||||
private int DataCenterIndex;
|
||||
|
||||
public VmAllocationPolicy_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())) { // if this vm was not created
|
||||
boolean vmFound = false;
|
||||
int vmCounter = 0;
|
||||
int hostIndex = 0;
|
||||
int dataCenterIndex = 0;
|
||||
|
||||
//find proper datacenter id and host id for this VM
|
||||
Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
|
||||
NodeList datacenterList = doc.getElementsByTagName("datacenter");
|
||||
for (int i = 0; (!vmFound && i < datacenterList.getLength()); i++) {
|
||||
Node datacenterNode = datacenterList.item(i);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
|
||||
for (int j = 0; (!vmFound && j < hostNodeList.getLength()); j++) {
|
||||
Node hostNode = hostNodeList.item(j);
|
||||
Element hostElement = (Element) hostNode;
|
||||
NodeList vmNodeList = hostElement.getElementsByTagName("VM");
|
||||
for (int k = 0; (!vmFound && k < vmNodeList.getLength()); k++) {
|
||||
|
||||
if(vmCounter == vm.getId()){
|
||||
dataCenterIndex = i;
|
||||
hostIndex = j;
|
||||
vmFound = true;
|
||||
}
|
||||
|
||||
vmCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(vmFound && dataCenterIndex == DataCenterIndex && hostIndex < getHostList().size()){
|
||||
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: 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: 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;
|
||||
}
|
||||
}
|
36
src/edu/boun/edgecloudsim/mobility/MobilityModel.java
Normal file
36
src/edu/boun/edgecloudsim/mobility/MobilityModel.java
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Mobility Model
|
||||
*
|
||||
* Description:
|
||||
* MobilityModel is an abstract class which is used for calculating the
|
||||
* location of each mobile devices with respect to the time. For those who
|
||||
* wants to add a custom Mobility Model to EdgeCloudSim should extend
|
||||
* this class and provide a concreate instance via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.mobility;
|
||||
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public abstract class MobilityModel {
|
||||
protected int numberOfMobileDevices;
|
||||
protected double simulationTime;
|
||||
|
||||
public MobilityModel(int _numberOfMobileDevices, double _simulationTime){
|
||||
numberOfMobileDevices=_numberOfMobileDevices;
|
||||
simulationTime=_simulationTime;
|
||||
};
|
||||
|
||||
/*
|
||||
* calculate location of the devices according to related mobility model
|
||||
*/
|
||||
public abstract void initialize();
|
||||
|
||||
/*
|
||||
* returns location of a device at a certain time
|
||||
*/
|
||||
public abstract Location getLocation(int deviceId, double time);
|
||||
}
|
123
src/edu/boun/edgecloudsim/mobility/NomadicMobility.java
Normal file
123
src/edu/boun/edgecloudsim/mobility/NomadicMobility.java
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Nomadic Mobility model implementation
|
||||
*
|
||||
* Description:
|
||||
* MobilityModel implements basic nomadic mobility model where the
|
||||
* place of the devices are changed from time to time instead of a
|
||||
* continuous location update.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.mobility;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeMap;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.PoissonDistr;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||
|
||||
public class NomadicMobility extends MobilityModel {
|
||||
private List<TreeMap<Double, Location>> treeMapArray;
|
||||
|
||||
public NomadicMobility(int _numberOfMobileDevices, double _simulationTime) {
|
||||
super(_numberOfMobileDevices, _simulationTime);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
treeMapArray = new ArrayList<TreeMap<Double, Location>>();
|
||||
|
||||
PoissonDistr[] poissonRngList = new PoissonDistr[SimSettings.getInstance().getNumOfEdgeDatacenters()];
|
||||
|
||||
//create random number generator for each place
|
||||
Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
|
||||
NodeList datacenterList = doc.getElementsByTagName("datacenter");
|
||||
for (int i = 0; i < datacenterList.getLength(); i++) {
|
||||
Node datacenterNode = datacenterList.item(i);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
||||
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
||||
SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
|
||||
|
||||
poissonRngList[i] = new PoissonDistr(SimSettings.getInstance().getMobilityLookUpTable()[placeType.ordinal()]);
|
||||
}
|
||||
|
||||
//initialize tree maps and position of mobile devices
|
||||
for(int i=0; i<numberOfMobileDevices; i++) {
|
||||
treeMapArray.add(i, new TreeMap<Double, Location>());
|
||||
|
||||
int randDatacenterId = SimUtils.getRandomNumber(0, SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
|
||||
Node datacenterNode = datacenterList.item(randDatacenterId);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
||||
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
||||
SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
|
||||
int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
|
||||
int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
|
||||
int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
|
||||
|
||||
//start locating user from 10th seconds
|
||||
treeMapArray.get(i).put((double)10, new Location(placeType, wlan_id, x_pos, y_pos));
|
||||
}
|
||||
|
||||
for(int i=0; i<numberOfMobileDevices; i++) {
|
||||
TreeMap<Double, Location> treeMap = treeMapArray.get(i);
|
||||
|
||||
while(treeMap.lastKey() < SimSettings.getInstance().getSimulationTime()) {
|
||||
boolean placeFound = false;
|
||||
int currentLocationId = treeMap.lastEntry().getValue().getServingWlanId();
|
||||
double waitingTime = poissonRngList[currentLocationId].sample() * 60;
|
||||
|
||||
while(placeFound == false){
|
||||
int newDatacenterId = SimUtils.getRandomNumber(0,SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
|
||||
if(newDatacenterId != currentLocationId){
|
||||
placeFound = true;
|
||||
Node datacenterNode = datacenterList.item(newDatacenterId);
|
||||
Element datacenterElement = (Element) datacenterNode;
|
||||
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
||||
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
||||
SimSettings.PLACE_TYPES placeType = SimUtils.stringToPlace(attractiveness);
|
||||
int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
|
||||
int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
|
||||
int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
|
||||
|
||||
treeMap.put(treeMap.lastKey()+waitingTime, new Location(placeType, wlan_id, x_pos, y_pos));
|
||||
}
|
||||
}
|
||||
if(!placeFound){
|
||||
SimLogger.printLine("impossible is occured! location cannot be assigned to the device!");
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getLocation(int deviceId, double time) {
|
||||
TreeMap<Double, Location> treeMap = treeMapArray.get(deviceId);
|
||||
|
||||
Entry<Double, Location> e = treeMap.floorEntry(time);
|
||||
|
||||
if(e == null){
|
||||
SimLogger.printLine("impossible is occured! no location is found for the device!");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
return e.getValue();
|
||||
}
|
||||
|
||||
}
|
186
src/edu/boun/edgecloudsim/network/MM1Queue.java
Normal file
186
src/edu/boun/edgecloudsim/network/MM1Queue.java
Normal file
@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - M/M/1 Queue model implementation
|
||||
*
|
||||
* Description:
|
||||
* MM1Queue implements M/M/1 Queue model for WLAN and WAN communication
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.network;
|
||||
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeHost;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
|
||||
public class MM1Queue extends NetworkModel {
|
||||
private double WlanPoissonMean; //seconds
|
||||
private double WanPoissonMean; //seconds
|
||||
private double avgTaskInputSize; //bytes
|
||||
private double avgTaskOutputSize; //bytes
|
||||
private int maxNumOfClientsInPlace;
|
||||
|
||||
public MM1Queue(int _numberOfMobileDevices) {
|
||||
super(_numberOfMobileDevices);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
WlanPoissonMean=0;
|
||||
WanPoissonMean=0;
|
||||
avgTaskInputSize=0;
|
||||
avgTaskOutputSize=0;
|
||||
maxNumOfClientsInPlace=0;
|
||||
|
||||
//Calculate interarrival time and task sizes
|
||||
double numOfTaskType = 0;
|
||||
SimSettings SS = SimSettings.getInstance();
|
||||
for (SimSettings.APP_TYPES taskType : SimSettings.APP_TYPES.values()) {
|
||||
double weight = SS.getTaskLookUpTable()[taskType.ordinal()][0]/(double)100;
|
||||
if(weight != 0) {
|
||||
WlanPoissonMean += (SS.getTaskLookUpTable()[taskType.ordinal()][2])*weight;
|
||||
|
||||
double percentageOfCloudCommunication = SS.getTaskLookUpTable()[taskType.ordinal()][1];
|
||||
WanPoissonMean += (WlanPoissonMean)*((double)100/percentageOfCloudCommunication)*weight;
|
||||
|
||||
avgTaskInputSize += SS.getTaskLookUpTable()[taskType.ordinal()][5]*weight;
|
||||
|
||||
avgTaskOutputSize += SS.getTaskLookUpTable()[taskType.ordinal()][6]*weight;
|
||||
|
||||
numOfTaskType++;
|
||||
}
|
||||
}
|
||||
|
||||
WlanPoissonMean = WlanPoissonMean/numOfTaskType;
|
||||
avgTaskInputSize = avgTaskInputSize/numOfTaskType;
|
||||
avgTaskOutputSize = avgTaskOutputSize/numOfTaskType;
|
||||
}
|
||||
|
||||
/**
|
||||
* source device is always mobile device in our simulation scenarios!
|
||||
*/
|
||||
@Override
|
||||
public double getUploadDelay(int sourceDeviceId, int destDeviceId) {
|
||||
double delay = 0;
|
||||
Location accessPointLocation = SimManager.getInstance().getMobilityModel().getLocation(sourceDeviceId,CloudSim.clock());
|
||||
|
||||
//if destination device is the cloud datacenter, both wan and wlan delay should be considered
|
||||
if(destDeviceId == SimSettings.CLOUD_DATACENTER_ID){
|
||||
double wlanDelay = getWlanUploadDelay(accessPointLocation, CloudSim.clock());
|
||||
double wanDelay = getWanUploadDelay(accessPointLocation, CloudSim.clock() + wlanDelay);
|
||||
if(wlanDelay > 0 && wanDelay >0)
|
||||
delay = wlanDelay + wanDelay;
|
||||
}
|
||||
else{
|
||||
delay = getWlanUploadDelay(accessPointLocation, CloudSim.clock());
|
||||
|
||||
//all requests are send to edge orchestrator first than redirected related VM
|
||||
delay += (SimSettings.getInstance().getInternalLanDelay() * 2);
|
||||
}
|
||||
|
||||
return delay;
|
||||
}
|
||||
|
||||
/**
|
||||
* destination device is always mobile device in our simulation scenarios!
|
||||
*/
|
||||
@Override
|
||||
public double getDownloadDelay(int sourceDeviceId, int destDeviceId) {
|
||||
double delay = 0;
|
||||
Location accessPointLocation = SimManager.getInstance().getMobilityModel().getLocation(destDeviceId,CloudSim.clock());
|
||||
|
||||
//if source device is the cloud datacenter, both wan and wlan delay should be considered
|
||||
if(sourceDeviceId == SimSettings.CLOUD_DATACENTER_ID){
|
||||
double wlanDelay = getWlanDownloadDelay(accessPointLocation, CloudSim.clock());
|
||||
double wanDelay = getWanDownloadDelay(accessPointLocation, CloudSim.clock() + wlanDelay);
|
||||
if(wlanDelay > 0 && wanDelay >0)
|
||||
delay = wlanDelay + wanDelay;
|
||||
}
|
||||
else{
|
||||
delay = getWlanDownloadDelay(accessPointLocation, CloudSim.clock());
|
||||
|
||||
EdgeHost host = (EdgeHost)(SimManager.
|
||||
getInstance().
|
||||
getLocalServerManager().
|
||||
getDatacenterList().get(sourceDeviceId).
|
||||
getHostList().get(0));
|
||||
|
||||
//if source device id is the edge server which is located in another location, add internal lan delay
|
||||
//in our scenasrio, serving wlan ID is equal to the host id, because there is only one host in one place
|
||||
if(host.getLocation().getServingWlanId() != accessPointLocation.getServingWlanId())
|
||||
delay += (SimSettings.getInstance().getInternalLanDelay() * 2);
|
||||
}
|
||||
|
||||
return delay;
|
||||
}
|
||||
|
||||
public int getMaxNumOfClientsInPlace(){
|
||||
return maxNumOfClientsInPlace;
|
||||
}
|
||||
|
||||
private int getDeviceCount(Location deviceLocation, double time){
|
||||
int deviceCount = 0;
|
||||
|
||||
for(int i=0; i<numberOfMobileDevices; i++) {
|
||||
Location location = SimManager.getInstance().getMobilityModel().getLocation(i,time);
|
||||
if(location.equals(deviceLocation))
|
||||
deviceCount++;
|
||||
}
|
||||
|
||||
//record max number of client just for debugging
|
||||
if(maxNumOfClientsInPlace<deviceCount)
|
||||
maxNumOfClientsInPlace = deviceCount;
|
||||
|
||||
return deviceCount;
|
||||
}
|
||||
|
||||
private double calculateMM1(double propogationDelay, int bandwidth /*Kbps*/, double PoissonMean, double avgTaskSize /*KB*/, int deviceCount){
|
||||
double Bps=0, mu=0, lamda=0;
|
||||
|
||||
avgTaskSize = avgTaskSize * (double)1000; //convert from KB to Byte
|
||||
|
||||
Bps = bandwidth * (double)1000 / (double)8; //convert from Kbps to Byte per seconds
|
||||
lamda = ((double)1/(double)PoissonMean); //task per seconds
|
||||
mu = Bps / avgTaskSize ; //task per seconds
|
||||
double result = (double)1 / (mu-lamda*(double)deviceCount);
|
||||
|
||||
return result + propogationDelay;
|
||||
}
|
||||
|
||||
private double getWlanDownloadDelay(Location accessPointLocation, double time) {
|
||||
return calculateMM1(0,
|
||||
SimSettings.getInstance().getWlanBandwidth(),
|
||||
WlanPoissonMean,
|
||||
avgTaskOutputSize,
|
||||
getDeviceCount(accessPointLocation, time));
|
||||
}
|
||||
|
||||
private double getWlanUploadDelay(Location accessPointLocation, double time) {
|
||||
return calculateMM1(0,
|
||||
SimSettings.getInstance().getWlanBandwidth(),
|
||||
WlanPoissonMean,
|
||||
avgTaskInputSize,
|
||||
getDeviceCount(accessPointLocation, time));
|
||||
}
|
||||
|
||||
private double getWanDownloadDelay(Location accessPointLocation, double time) {
|
||||
return calculateMM1(SimSettings.getInstance().getWanPropogationDelay(),
|
||||
SimSettings.getInstance().getWanBandwidth(),
|
||||
WanPoissonMean,
|
||||
avgTaskOutputSize,
|
||||
getDeviceCount(accessPointLocation, time));
|
||||
}
|
||||
|
||||
private double getWanUploadDelay(Location accessPointLocation, double time) {
|
||||
return calculateMM1(SimSettings.getInstance().getWanPropogationDelay(),
|
||||
SimSettings.getInstance().getWanBandwidth(),
|
||||
WanPoissonMean,
|
||||
avgTaskInputSize,
|
||||
getDeviceCount(accessPointLocation, time));
|
||||
}
|
||||
}
|
37
src/edu/boun/edgecloudsim/network/NetworkModel.java
Normal file
37
src/edu/boun/edgecloudsim/network/NetworkModel.java
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Network Model
|
||||
*
|
||||
* Description:
|
||||
* NetworkModel is an abstract class which is used for calculating the
|
||||
* network delay from device to device. For those who wants to add a
|
||||
* custom Network Model to EdgeCloudSim should extend this class and
|
||||
* provide a concreate instance via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.network;
|
||||
|
||||
public abstract class NetworkModel {
|
||||
protected int numberOfMobileDevices;
|
||||
|
||||
public NetworkModel(int _numberOfMobileDevices){
|
||||
numberOfMobileDevices=_numberOfMobileDevices;
|
||||
};
|
||||
|
||||
/**
|
||||
* initializes costom network model
|
||||
*/
|
||||
public abstract void initialize();
|
||||
|
||||
/**
|
||||
* calculates the upload delay from source to destination device
|
||||
*/
|
||||
public abstract double getUploadDelay(int sourceDeviceId, int destDeviceId);
|
||||
|
||||
/**
|
||||
* calculates the download delay from source to destination device
|
||||
*/
|
||||
public abstract double getDownloadDelay(int sourceDeviceId, int destDeviceId);
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Sample Scenario Factory
|
||||
*
|
||||
* Description: Sample 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.sample_application;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.cloudbus.cloudsim.Host;
|
||||
import org.cloudbus.cloudsim.UtilizationModel;
|
||||
import org.cloudbus.cloudsim.VmAllocationPolicy;
|
||||
|
||||
import edu.boun.edgecloudsim.core.ScenarioFactory;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
|
||||
import edu.boun.edgecloudsim.edge_orchestrator.BasicEdgeOrchestrator;
|
||||
import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator;
|
||||
import edu.boun.edgecloudsim.edge_server.VmAllocationPolicy_Custom;
|
||||
import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
|
||||
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.MM1Queue;
|
||||
import edu.boun.edgecloudsim.network.NetworkModel;
|
||||
|
||||
public class SampleScenarioFactory implements ScenarioFactory {
|
||||
private int numOfMobileDevice;
|
||||
private double simulationTime;
|
||||
private String orchestratorPolicy;
|
||||
private SimSettings.SCENARIO_TYPES simScenario;
|
||||
|
||||
SampleScenarioFactory(int _numOfMobileDevice,
|
||||
double _simulationTime,
|
||||
String _orchestratorPolicy,
|
||||
SimSettings.SCENARIO_TYPES _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 BasicEdgeOrchestrator(orchestratorPolicy, simScenario);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MobilityModel getMobilityModel() {
|
||||
return new NomadicMobility(numOfMobileDevice,simulationTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NetworkModel getNetworkModel() {
|
||||
return new MM1Queue(numOfMobileDevice);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VmAllocationPolicy getVmAllocationPolicy(List<? extends Host> hostList, int dataCenterIndex) {
|
||||
return new VmAllocationPolicy_Custom(hostList,dataCenterIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UtilizationModel getCpuUtilizationModel(APP_TYPES _taskType) {
|
||||
return new CpuUtilizationModel_Custom(_taskType);
|
||||
}
|
||||
|
||||
}
|
121
src/edu/boun/edgecloudsim/sample_application/mainApp.java
Normal file
121
src/edu/boun/edgecloudsim/sample_application/mainApp.java
Normal file
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Sample Application
|
||||
*
|
||||
* Description: Sample application for EdgeCloudSim
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.sample_application;
|
||||
|
||||
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();
|
||||
SimLogger.enableFileLog();
|
||||
|
||||
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...");
|
||||
String configName = "default_config";
|
||||
configFile = "config/" + configName + ".properties";
|
||||
applicationsFile = "config/applications.xml";
|
||||
edgeDevicesFile = "config/edge_devices.xml";
|
||||
outputFolder = "D:/" + configName + "/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(SimLogger.isFileLogEnabled())
|
||||
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 (SimSettings.SCENARIO_TYPES scenario : SimSettings.SCENARIO_TYPES.values())
|
||||
{
|
||||
Date ScenarioStartDate = Calendar.getInstance().getTime();
|
||||
now = df.format(ScenarioStartDate);
|
||||
|
||||
SimLogger.printLine("Scenario started at " + now);
|
||||
SimLogger.printLine(scenario + "(" + SS.getOrchestratorPolicy() + ")" + " - duration: " + SS.getSimulationTime()/3600 + " hour(s) - poisson: " + SS.getTaskLookUpTable()[0][2] + " - #devices: " + j + " - ite: " + iterationNumber);
|
||||
SimLogger.getInstance().simStarted(outputFolder,"SIMRESULT_" + scenario + "_" + 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);
|
||||
|
||||
ScenarioFactory sampleFactory = new SampleScenarioFactory(j,SS.getSimulationTime(), SS.getOrchestratorPolicy(), scenario);
|
||||
|
||||
SimManager manager = new SimManager(sampleFactory, j, scenario);
|
||||
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 SCENARIO_TYPES loop
|
||||
}//End of NUMBER_OF_MOBILE_DEVICE 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,104 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Idle/Active Load Generator implementation
|
||||
*
|
||||
* Description:
|
||||
* IdleActiveLoadGenerator implements basic load generator model where the
|
||||
* mobile devices generate task in active period and waits in idle period.
|
||||
* Task interarrival time (load generation period), Idle and active periods
|
||||
* are defined in the configuration file.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.task_generator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.commons.math3.distribution.ExponentialDistribution;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
import edu.boun.edgecloudsim.utils.PoissonDistr;
|
||||
import edu.boun.edgecloudsim.utils.SimLogger;
|
||||
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||
|
||||
public class IdleActiveLoadGenerator extends LoadGeneratorModel{
|
||||
|
||||
public IdleActiveLoadGenerator(int _numberOfMobileDevices, double _simulationTime, SimSettings.SCENARIO_TYPES _simScenario) {
|
||||
super(_numberOfMobileDevices, _simulationTime, _simScenario);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initializeModel() {
|
||||
taskList = new ArrayList<EdgeTask>();
|
||||
|
||||
//exponential number generator for file input size, file output size and task length
|
||||
PoissonDistr[][] poissonRngList = new PoissonDistr[SimSettings.APP_TYPES.values().length][3];
|
||||
|
||||
//create random number generator for each place
|
||||
for(int i=0; i<SimSettings.APP_TYPES.values().length; i++) {
|
||||
if(SimSettings.getInstance().getTaskLookUpTable()[i][0] ==0)
|
||||
break;
|
||||
|
||||
poissonRngList[i][0] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][5]);
|
||||
poissonRngList[i][1] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][6]);
|
||||
poissonRngList[i][2] = new PoissonDistr(SimSettings.getInstance().getTaskLookUpTable()[i][7]);
|
||||
}
|
||||
|
||||
//Each mobile device utilizes an app type (task type)
|
||||
for(int i=0; i<numberOfMobileDevices; i++) {
|
||||
APP_TYPES randomTaskType = null;
|
||||
double taskTypeSelector = SimUtils.getRandomDoubleNumber(0,100);
|
||||
double taskTypePercentage = 0;
|
||||
for (SimSettings.APP_TYPES taskType : SimSettings.APP_TYPES.values()) {
|
||||
taskTypePercentage += SimSettings.getInstance().getTaskLookUpTable()[taskType.ordinal()][0];
|
||||
if(taskTypeSelector <= taskTypePercentage){
|
||||
randomTaskType = taskType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(randomTaskType == null){
|
||||
SimLogger.printLine("Impossible is occured! no random task type!");
|
||||
continue;
|
||||
}
|
||||
|
||||
double poissonMean = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][2];
|
||||
double activePeriod = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][3];
|
||||
double idlePeriod = SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][4];
|
||||
double activePeriodStartTime = SimUtils.getRandomDoubleNumber(10, 10+activePeriod); //start from 10th seconds
|
||||
double virtualTime = activePeriodStartTime; //start from 10th seconds
|
||||
|
||||
ExponentialDistribution rng = new ExponentialDistribution(poissonMean);
|
||||
while(virtualTime < simulationTime) {
|
||||
double interval = rng.sample();
|
||||
|
||||
if(interval <= 0){
|
||||
SimLogger.printLine("Impossible is occured! interval is " + interval + " for device " + i + " time " + virtualTime);
|
||||
continue;
|
||||
}
|
||||
//SimLogger.printLine(virtualTime + " -> " + interval + " for device " + i + " time ");
|
||||
virtualTime += interval;
|
||||
|
||||
if(virtualTime > activePeriodStartTime + activePeriod){
|
||||
activePeriodStartTime = activePeriodStartTime + activePeriod + idlePeriod;
|
||||
virtualTime = activePeriodStartTime;
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean requireCloud = false;
|
||||
if(simScenario != SimSettings.SCENARIO_TYPES.SINGLE_TIER){
|
||||
//decide to use cloud or cloudlet VM
|
||||
int CloudVmPicker = SimUtils.getRandomNumber(0, 100);
|
||||
|
||||
if(CloudVmPicker <= SimSettings.getInstance().getTaskLookUpTable()[randomTaskType.ordinal()][1])
|
||||
requireCloud = true;
|
||||
}
|
||||
|
||||
taskList.add(new EdgeTask(i,randomTaskType, virtualTime, requireCloud, poissonRngList));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Load Generator Model
|
||||
*
|
||||
* Description:
|
||||
* LoadGeneratorModel is an abstract class which is used for
|
||||
* deciding task generation pattern via a task list. For those who
|
||||
* wants to add a custom Load Generator Model to EdgeCloudSim should
|
||||
* extend this class and provide a concreate instance via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.task_generator;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.utils.EdgeTask;
|
||||
|
||||
public abstract class LoadGeneratorModel {
|
||||
protected List<EdgeTask> taskList;
|
||||
protected int numberOfMobileDevices;
|
||||
protected double simulationTime;
|
||||
protected SimSettings.SCENARIO_TYPES simScenario;
|
||||
|
||||
public LoadGeneratorModel(int _numberOfMobileDevices, double _simulationTime, SimSettings.SCENARIO_TYPES _simScenario){
|
||||
numberOfMobileDevices=_numberOfMobileDevices;
|
||||
simulationTime=_simulationTime;
|
||||
simScenario=_simScenario;
|
||||
};
|
||||
|
||||
/*
|
||||
* each task has a virtual start time
|
||||
* it will be used while generating task
|
||||
*/
|
||||
public List<EdgeTask> getTaskList() {
|
||||
return taskList;
|
||||
}
|
||||
|
||||
/*
|
||||
* fill task list according to related task generation model
|
||||
*/
|
||||
public abstract void initializeModel();
|
||||
}
|
36
src/edu/boun/edgecloudsim/utils/EdgeTask.java
Normal file
36
src/edu/boun/edgecloudsim/utils/EdgeTask.java
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - EdgeTask
|
||||
*
|
||||
* Description:
|
||||
* A custom class used in Load Generator Model to store tasks information
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.utils;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.APP_TYPES;
|
||||
|
||||
public class EdgeTask {
|
||||
public APP_TYPES taskType;
|
||||
public boolean requireCloud;
|
||||
public double startTime;
|
||||
public long length, inputFileSize, outputFileSize;
|
||||
public int pesNumber;
|
||||
public int mobileDeviceId;
|
||||
|
||||
public EdgeTask(int _mobileDeviceId, APP_TYPES _taskType, double _startTime, boolean _requireCloud, PoissonDistr[][] poissonRngList) {
|
||||
mobileDeviceId=_mobileDeviceId;
|
||||
requireCloud=_requireCloud;
|
||||
startTime=_startTime;
|
||||
taskType=_taskType;
|
||||
|
||||
inputFileSize = (long)poissonRngList[_taskType.ordinal()][0].sample();
|
||||
outputFileSize =(long)poissonRngList[_taskType.ordinal()][1].sample();
|
||||
length = (long)poissonRngList[_taskType.ordinal()][2].sample();
|
||||
|
||||
pesNumber = (int)SimSettings.getInstance().getTaskLookUpTable()[_taskType.ordinal()][8];
|
||||
}
|
||||
}
|
55
src/edu/boun/edgecloudsim/utils/Location.java
Normal file
55
src/edu/boun/edgecloudsim/utils/Location.java
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Location
|
||||
*
|
||||
* Description: Location class used in EdgeCloudSim
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.utils;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class Location {
|
||||
private int xPos;
|
||||
private int yPos;
|
||||
private int servingWlanId;
|
||||
SimSettings.PLACE_TYPES placeType;
|
||||
public Location(SimSettings.PLACE_TYPES _placeType, int _servingWlanId, int _xPos, int _yPos){
|
||||
servingWlanId = _servingWlanId;
|
||||
placeType=_placeType;
|
||||
xPos = _xPos;
|
||||
yPos = _yPos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other){
|
||||
boolean result = false;
|
||||
if (other == null) return false;
|
||||
if (!(other instanceof Location))return false;
|
||||
if (other == this) return true;
|
||||
|
||||
Location otherLocation = (Location)other;
|
||||
if(this.xPos == otherLocation.xPos && this.yPos == otherLocation.yPos)
|
||||
result = true;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getServingWlanId(){
|
||||
return servingWlanId;
|
||||
}
|
||||
|
||||
public SimSettings.PLACE_TYPES getPlaceType(){
|
||||
return placeType;
|
||||
}
|
||||
|
||||
public int getXPos(){
|
||||
return xPos;
|
||||
}
|
||||
|
||||
public int getYPos(){
|
||||
return yPos;
|
||||
}
|
||||
}
|
63
src/edu/boun/edgecloudsim/utils/PoissonDistr.java
Normal file
63
src/edu/boun/edgecloudsim/utils/PoissonDistr.java
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Poisson Distribution
|
||||
*
|
||||
* Description: Poisson Distribution implementation
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.utils;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class PoissonDistr {
|
||||
/** The num gen. */
|
||||
private final Random numGen;
|
||||
|
||||
/** The mean. */
|
||||
private final double mean;
|
||||
|
||||
/**
|
||||
* Creates a new exponential number generator.
|
||||
*
|
||||
* @param seed the seed to be used.
|
||||
* @param mean the mean for the distribution.
|
||||
*/
|
||||
public PoissonDistr(long seed, double mean) {
|
||||
if (mean <= 0.0) {
|
||||
throw new IllegalArgumentException("Mean must be greater than 0.0");
|
||||
}
|
||||
numGen = new Random(seed);
|
||||
this.mean = mean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new exponential number generator.
|
||||
*
|
||||
* @param mean the mean for the distribution.
|
||||
*/
|
||||
public PoissonDistr(double mean) {
|
||||
if (mean <= 0.0) {
|
||||
throw new IllegalArgumentException("Mean must be greated than 0.0");
|
||||
}
|
||||
numGen = new Random(System.currentTimeMillis());
|
||||
this.mean = mean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a new random number.
|
||||
*
|
||||
* @return the next random number in the sequence
|
||||
*/
|
||||
public double sample() {
|
||||
double L = Math.exp(-mean);
|
||||
int k = 0;
|
||||
double p = 1.0;
|
||||
do {
|
||||
p = p * numGen.nextDouble();
|
||||
k++;
|
||||
} while (p > L);
|
||||
return k - 1;
|
||||
}
|
||||
}
|
467
src/edu/boun/edgecloudsim/utils/SimLogger.java
Normal file
467
src/edu/boun/edgecloudsim/utils/SimLogger.java
Normal file
@ -0,0 +1,467 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Simulation Logger
|
||||
*
|
||||
* Description:
|
||||
* SimLogger is responsible for storing simulation events/results
|
||||
* in to the files in a specific format.
|
||||
* Format is decided in a way to use results in matlab efficiently.
|
||||
* If you need more results or another file format, you should modify
|
||||
* this class.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.utils;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class SimLogger {
|
||||
public static enum TASK_STATUS {CREATED,
|
||||
UPLOADING,
|
||||
PROCESSING,
|
||||
DOWNLOADING,
|
||||
COMLETED,
|
||||
REJECTED_DUE_TO_VM_CAPACITY,
|
||||
REJECTED_DUE_TO_BANDWIDTH,
|
||||
UNFINISHED_DUE_TO_BANDWIDTH,
|
||||
UNFINISHED_DUE_TO_MOBILITY
|
||||
}
|
||||
|
||||
private static boolean fileLogEnabled;
|
||||
private static boolean printLogEnabled;
|
||||
private String filePrefix;
|
||||
private String outputFolder;
|
||||
private Map<Integer, LogItem> taskMap;
|
||||
private LinkedList<VmLoadLogItem> vmLoadList;
|
||||
|
||||
private static SimLogger singleton = new SimLogger( );
|
||||
|
||||
/* A private Constructor prevents any other
|
||||
* class from instantiating.
|
||||
*/
|
||||
private SimLogger(){
|
||||
fileLogEnabled = false;
|
||||
printLogEnabled = false;
|
||||
}
|
||||
|
||||
/* Static 'instance' method */
|
||||
public static SimLogger getInstance( ) {
|
||||
return singleton;
|
||||
}
|
||||
|
||||
public static void enableFileLog() {
|
||||
fileLogEnabled = true;
|
||||
}
|
||||
|
||||
public static void enablePrintLog() {
|
||||
printLogEnabled = true;
|
||||
}
|
||||
|
||||
public static boolean isFileLogEnabled() {
|
||||
return fileLogEnabled;
|
||||
}
|
||||
|
||||
public static void disablePrintLog() {
|
||||
printLogEnabled = false;
|
||||
}
|
||||
|
||||
private void appendToFile(BufferedWriter bw, String line) throws IOException{
|
||||
bw.write(line);
|
||||
bw.newLine();
|
||||
}
|
||||
|
||||
public static void printLine(String msg){
|
||||
if(printLogEnabled)
|
||||
System.out.println(msg);
|
||||
}
|
||||
|
||||
public static void print(String msg){
|
||||
if(printLogEnabled)
|
||||
System.out.print(msg);
|
||||
}
|
||||
|
||||
public void simStarted(String outFolder,String fileName) {
|
||||
filePrefix = fileName;
|
||||
outputFolder = outFolder;
|
||||
taskMap = new HashMap<Integer, LogItem>();
|
||||
vmLoadList = new LinkedList<VmLoadLogItem>();
|
||||
}
|
||||
|
||||
public void addLog(double taskStartTime, int taskId, int taskType, int taskLenght, int taskInputType, int taskOutputSize) {
|
||||
//printLine(taskId+"->"+taskStartTime);
|
||||
taskMap.put(taskId, new LogItem(taskStartTime, taskType, taskLenght, taskInputType, taskOutputSize));
|
||||
}
|
||||
|
||||
public void uploadStarted(int taskId, double taskUploadTime) {
|
||||
taskMap.get(taskId).taskUploadStarted(taskUploadTime);
|
||||
}
|
||||
|
||||
public void uploaded(int taskId, int datacenterId, int hostId, int vmId, int vmType) {
|
||||
taskMap.get(taskId).taskUploaded(datacenterId, hostId, vmId,vmType);
|
||||
}
|
||||
|
||||
public void downloadStarted(int taskId, double taskDownloadTime) {
|
||||
taskMap.get(taskId).taskDownloadStarted(taskDownloadTime);
|
||||
}
|
||||
|
||||
public void downloaded(int taskId, double taskEndTime) {
|
||||
taskMap.get(taskId).taskDownloaded(taskEndTime);
|
||||
}
|
||||
|
||||
public void rejectedDueToVMCapacity(int taskId, double taskRejectTime) {
|
||||
taskMap.get(taskId).taskRejectedDueToVMCapacity(taskRejectTime);
|
||||
}
|
||||
|
||||
public void rejectedDueToBandwidth(int taskId, double taskRejectTime) {
|
||||
taskMap.get(taskId).taskRejectedDueToBandwidth(taskRejectTime);
|
||||
}
|
||||
|
||||
public void failedDueToBandwidth(int taskId, double taskRejectTime) {
|
||||
taskMap.get(taskId).taskFailedDueToBandwidth(taskRejectTime);
|
||||
}
|
||||
|
||||
public void failedDueToMobility(int taskId, double time) {
|
||||
taskMap.get(taskId).taskFailedDueToMobility(time);
|
||||
}
|
||||
|
||||
public void addVmUtilizationLog(double time, double load) {
|
||||
vmLoadList.add(new VmLoadLogItem(time, load));
|
||||
}
|
||||
|
||||
public void simStopped() throws IOException {
|
||||
File file1=null,file2=null,file3=null,file4=null,file5=null;
|
||||
FileWriter fileWriter1=null,fileWriter2=null,fileWriter3=null,fileWriter4=null,fileWriter5=null;
|
||||
BufferedWriter bufferedWriter1=null,bufferedWriter2=null,bufferedWriter3=null,bufferedWriter4=null,bufferedWriter5=null;
|
||||
|
||||
int uncompletedTaskOnCloudlet = 0;
|
||||
int completedTaskOnCloudlet = 0;
|
||||
int uncompletedTaskOnCloud = 0;
|
||||
int completedTaskOnCloud = 0;
|
||||
int rejectedTaskDoToVmCapacity = 0;
|
||||
int rejectedTaskDoToBandwidth = 0;
|
||||
int failedTaskDuetoBandwidth = 0;
|
||||
int failedTaskDuetoMobility = 0;
|
||||
int totalCompletedTask = 0;
|
||||
int totalFailedTask = 0;
|
||||
double totalCost = 0;
|
||||
double totalLanDelay = 0;
|
||||
double totalWanDelay = 0;
|
||||
double totalServiceTime = 0;
|
||||
double totalNetworkDelay = 0;
|
||||
double totalProcessingTime = 0;
|
||||
double totalVmLoad = 0;
|
||||
|
||||
//open all files and prepare them for write
|
||||
if(fileLogEnabled){
|
||||
if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
|
||||
file1 = new File(outputFolder, filePrefix+"_SUCCESS.log");
|
||||
fileWriter1 = new FileWriter(file1, true);
|
||||
bufferedWriter1 = new BufferedWriter(fileWriter1);
|
||||
|
||||
file2 = new File(outputFolder, filePrefix+"_FAIL.log");
|
||||
fileWriter2 = new FileWriter(file2, true);
|
||||
bufferedWriter2 = new BufferedWriter(fileWriter2);
|
||||
}
|
||||
|
||||
file3 = new File(outputFolder, filePrefix+"_VM_LOAD.log");
|
||||
fileWriter3 = new FileWriter(file3, true);
|
||||
bufferedWriter3 = new BufferedWriter(fileWriter3);
|
||||
|
||||
file4 = new File(outputFolder, filePrefix+"_GENERIC.log");
|
||||
fileWriter4 = new FileWriter(file4, true);
|
||||
bufferedWriter4 = new BufferedWriter(fileWriter4);
|
||||
|
||||
file5 = new File(outputFolder, filePrefix+"_LOCATION.log");
|
||||
fileWriter5 = new FileWriter(file5, true);
|
||||
bufferedWriter5 = new BufferedWriter(fileWriter5);
|
||||
|
||||
if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
|
||||
appendToFile(bufferedWriter1, "# taskId;dataCenterId;hostId;vmId;vmType;taskType;taskLenght;taskInputType;taskOutputSize;taskStartTime;taskEndTime;nwDelay");
|
||||
appendToFile(bufferedWriter2, "# taskId;dataCenterId;hostId;vmId;vmType;taskType;taskLenght;taskInputType;taskOutputSize;taskStartTime;taskEndTime;failReason");
|
||||
}
|
||||
|
||||
appendToFile(bufferedWriter3, "# time;load");
|
||||
appendToFile(bufferedWriter4, "# completedTask;uncompletedTask;rejectedTask;failedDueToMobilityTask;avgFailure;avgServiceTime;avgNetworkDelay;avgServerLoad;avgCost");
|
||||
appendToFile(bufferedWriter5, "# time;#ofClient@PlaceType1;#ofClient@PlaceTypen");
|
||||
}
|
||||
|
||||
//extract the result of each task and write it to the file if required
|
||||
for (Map.Entry<Integer, LogItem> entry : taskMap.entrySet()) {
|
||||
Integer key = entry.getKey();
|
||||
LogItem value = entry.getValue();
|
||||
|
||||
if(value.isInWarmUpPeriod())
|
||||
continue;
|
||||
|
||||
if(value.getStatus() == SimLogger.TASK_STATUS.COMLETED){
|
||||
if(value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal()){
|
||||
completedTaskOnCloud++;
|
||||
totalWanDelay += value.getNetworkDelay();
|
||||
}
|
||||
else{
|
||||
completedTaskOnCloudlet++;
|
||||
totalLanDelay += value.getNetworkDelay();
|
||||
}
|
||||
totalCost += value.getCost();
|
||||
totalServiceTime += value.getServiceTime();
|
||||
totalNetworkDelay += value.getNetworkDelay();
|
||||
totalProcessingTime += (value.getServiceTime() - value.getNetworkDelay());
|
||||
|
||||
if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||
appendToFile(bufferedWriter1, value.toString(key));
|
||||
}
|
||||
else if(value.getStatus() == SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY){
|
||||
rejectedTaskDoToVmCapacity++;
|
||||
if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||
appendToFile(bufferedWriter2, value.toString(key));
|
||||
}
|
||||
else if(value.getStatus() == SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH){
|
||||
rejectedTaskDoToBandwidth++;
|
||||
if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||
appendToFile(bufferedWriter2, value.toString(key));
|
||||
}
|
||||
else if(value.getStatus() == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH){
|
||||
failedTaskDuetoBandwidth++;
|
||||
if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||
appendToFile(bufferedWriter2, value.toString(key));
|
||||
}
|
||||
else if(value.getStatus() == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY){
|
||||
failedTaskDuetoMobility++;
|
||||
if(fileLogEnabled && SimSettings.getInstance().getDeepFileLoggingEnabled())
|
||||
appendToFile(bufferedWriter2, value.toString(key));
|
||||
}
|
||||
else {
|
||||
if(value.getVmType() == SimSettings.VM_TYPES.CLOUD_VM.ordinal())
|
||||
uncompletedTaskOnCloud++;
|
||||
else
|
||||
uncompletedTaskOnCloudlet++;
|
||||
}
|
||||
}
|
||||
totalFailedTask = rejectedTaskDoToVmCapacity+rejectedTaskDoToBandwidth+failedTaskDuetoBandwidth;
|
||||
totalCompletedTask = completedTaskOnCloudlet+completedTaskOnCloud;
|
||||
|
||||
//calculate server load
|
||||
for(VmLoadLogItem entry : vmLoadList){
|
||||
totalVmLoad += entry.getLoad();
|
||||
if(fileLogEnabled)
|
||||
appendToFile(bufferedWriter3, entry.toString());
|
||||
}
|
||||
|
||||
if(fileLogEnabled){
|
||||
//write location info to file
|
||||
for(int t=1; t<(SimSettings.getInstance().getSimulationTime()/SimSettings.getInstance().getVmLocationLogInterval()); t++){
|
||||
int[] locationInfo = new int[SimSettings.PLACE_TYPES.values().length];
|
||||
for(int i=0; i<SimManager.getInstance().getNumOfMobileDevice(); i++) {
|
||||
|
||||
Location loc = SimManager.getInstance().getMobilityModel().getLocation(i, t*SimSettings.getInstance().getVmLocationLogInterval());
|
||||
SimSettings.PLACE_TYPES placeType = loc.getPlaceType();
|
||||
locationInfo[placeType.ordinal()]++;
|
||||
}
|
||||
|
||||
Double time=t*SimSettings.getInstance().getVmLocationLogInterval();
|
||||
bufferedWriter5.write(time.toString());
|
||||
for(int i=0; i<locationInfo.length; i++)
|
||||
bufferedWriter5.write(SimSettings.DELIMITER + locationInfo[i]);
|
||||
|
||||
bufferedWriter5.newLine();
|
||||
}
|
||||
|
||||
//write generic results
|
||||
String genericResult = Integer.toString(completedTaskOnCloudlet) + SimSettings.DELIMITER +
|
||||
Integer.toString(uncompletedTaskOnCloudlet) + SimSettings.DELIMITER +
|
||||
Integer.toString(completedTaskOnCloud) + SimSettings.DELIMITER +
|
||||
Integer.toString(uncompletedTaskOnCloud) + SimSettings.DELIMITER +
|
||||
Integer.toString(rejectedTaskDoToVmCapacity) + SimSettings.DELIMITER +
|
||||
Integer.toString(rejectedTaskDoToBandwidth) + SimSettings.DELIMITER +
|
||||
Integer.toString(failedTaskDuetoBandwidth) + SimSettings.DELIMITER +
|
||||
Integer.toString(failedTaskDuetoMobility) + SimSettings.DELIMITER +
|
||||
Double.toString(((double)totalFailedTask*(double)100)/(double)(totalCompletedTask+totalFailedTask)) + SimSettings.DELIMITER +
|
||||
Double.toString(totalServiceTime/(double)totalCompletedTask) + SimSettings.DELIMITER +
|
||||
Double.toString(totalNetworkDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
|
||||
Double.toString(totalLanDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
|
||||
Double.toString(totalWanDelay/(double)totalCompletedTask) + SimSettings.DELIMITER +
|
||||
Double.toString(totalProcessingTime/(double)totalCompletedTask) + SimSettings.DELIMITER +
|
||||
Double.toString(totalVmLoad/(double)vmLoadList.size()) + SimSettings.DELIMITER +
|
||||
Double.toString(totalCost/(double)totalCompletedTask);
|
||||
|
||||
appendToFile(bufferedWriter4,genericResult);
|
||||
|
||||
//close open files
|
||||
if(SimSettings.getInstance().getDeepFileLoggingEnabled()){
|
||||
bufferedWriter1.close();
|
||||
bufferedWriter2.close();
|
||||
}
|
||||
bufferedWriter3.close();
|
||||
bufferedWriter4.close();
|
||||
bufferedWriter5.close();
|
||||
}
|
||||
|
||||
//printout important results
|
||||
printLine("# of uncompleted tasks on Cloudlet/Cloud: " + uncompletedTaskOnCloudlet + "/" + uncompletedTaskOnCloud);
|
||||
printLine("# of completed task on Cloudlet/Cloud: " + (completedTaskOnCloudlet+uncompletedTaskOnCloudlet) + "/" + (completedTaskOnCloud+uncompletedTaskOnCloud));
|
||||
printLine("# of rejected tasks (due to vm capacity): " + rejectedTaskDoToVmCapacity);
|
||||
printLine("# of rejected tasks (due to bandwidth): " + rejectedTaskDoToBandwidth);
|
||||
printLine("# of failed tasks (due to bandwidth): " + failedTaskDuetoBandwidth);
|
||||
printLine("# of failed tasks (due to mobility): " + failedTaskDuetoMobility);
|
||||
printLine("percentage of failed task: " + String.format("%.6f", ((double)totalFailedTask*(double)100)/(double)(totalCompletedTask+totalFailedTask)) + "%");
|
||||
printLine("average service time: " + String.format("%.6f", totalServiceTime/(double)totalCompletedTask) + " seconds. ("
|
||||
+ "processing time: " + String.format("%.6f", totalProcessingTime/(double)totalCompletedTask) + ")");
|
||||
printLine("average netwrok delay: " + String.format("%.6f", totalNetworkDelay/(double)totalCompletedTask) + " seconds. ("
|
||||
+ "LAN delay: " + String.format("%.6f", totalLanDelay/(double)totalCompletedTask) + ", "
|
||||
+ "WAN delay: " + String.format("%.6f", totalWanDelay/(double)totalCompletedTask) + ")");
|
||||
printLine("average server utilization: " + String.format("%.6f", totalVmLoad/(double)vmLoadList.size()) + "%");
|
||||
printLine("average cost: " + totalCost/totalCompletedTask + "$");
|
||||
|
||||
//clear related collections (map list etc.)
|
||||
taskMap.clear();
|
||||
vmLoadList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
class VmLoadLogItem
|
||||
{
|
||||
private double time;
|
||||
private double vmLoad;
|
||||
|
||||
VmLoadLogItem(double _time, double _vmLoad)
|
||||
{
|
||||
time = _time;
|
||||
vmLoad = _vmLoad;
|
||||
}
|
||||
public double getLoad()
|
||||
{
|
||||
return vmLoad;
|
||||
}
|
||||
public String toString()
|
||||
{
|
||||
return time + SimSettings.DELIMITER + vmLoad;
|
||||
}
|
||||
}
|
||||
class LogItem
|
||||
{
|
||||
private SimLogger.TASK_STATUS status;
|
||||
private int datacenterId;
|
||||
private int hostId;
|
||||
private int vmId;
|
||||
private int vmType;
|
||||
private int taskType;
|
||||
private int taskLenght;
|
||||
private int taskInputType;
|
||||
private int taskOutputSize;
|
||||
private double taskStartTime;
|
||||
private double taskEndTime;
|
||||
private double networkDelay;
|
||||
private double bwCost;
|
||||
private double cpuCost;
|
||||
private boolean isInWarmUpPeriod;
|
||||
LogItem (double _taskStartTime, int _taskType, int _taskLenght, int _taskInputType, int _taskOutputSize)
|
||||
{
|
||||
taskStartTime = _taskStartTime;
|
||||
taskType=_taskType;
|
||||
taskLenght=_taskLenght;
|
||||
taskInputType=_taskInputType;
|
||||
taskOutputSize=_taskOutputSize;
|
||||
status = SimLogger.TASK_STATUS.CREATED;
|
||||
taskEndTime = 0;
|
||||
|
||||
if(_taskStartTime < SimSettings.getInstance().getWarmUpPeriod())
|
||||
isInWarmUpPeriod = true;
|
||||
else
|
||||
isInWarmUpPeriod = false;
|
||||
}
|
||||
public void taskUploadStarted(double taskUploadTime) {
|
||||
networkDelay += taskUploadTime;
|
||||
status = SimLogger.TASK_STATUS.UPLOADING;
|
||||
}
|
||||
public void taskUploaded(int _datacenterId, int _hostId, int _vmId, int _vmType) {
|
||||
status = SimLogger.TASK_STATUS.PROCESSING;
|
||||
datacenterId = _datacenterId;
|
||||
hostId = _hostId;
|
||||
vmId = _vmId;
|
||||
vmType=_vmType;
|
||||
}
|
||||
public void taskDownloadStarted(double taskDownloadTime) {
|
||||
networkDelay += taskDownloadTime;
|
||||
status = SimLogger.TASK_STATUS.DOWNLOADING;
|
||||
}
|
||||
public void taskDownloaded(double _taskEndTime) {
|
||||
taskEndTime = _taskEndTime;
|
||||
status = SimLogger.TASK_STATUS.COMLETED;
|
||||
}
|
||||
public void taskRejectedDueToVMCapacity(double _taskRejectTime) {
|
||||
taskEndTime = _taskRejectTime;
|
||||
status = SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY;
|
||||
}
|
||||
public void taskRejectedDueToBandwidth(double _taskRejectTime) {
|
||||
taskEndTime = _taskRejectTime;
|
||||
status = SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH;
|
||||
}
|
||||
public void taskFailedDueToBandwidth(double _time) {
|
||||
taskEndTime = _time;
|
||||
status = SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH;
|
||||
}
|
||||
public void taskFailedDueToMobility(double _time) {
|
||||
taskEndTime = _time;
|
||||
status = SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY;
|
||||
}
|
||||
public void setCost(double _bwCost, double _cpuCos) {
|
||||
bwCost = _bwCost;
|
||||
cpuCost = _cpuCos;
|
||||
}
|
||||
public boolean isInWarmUpPeriod(){
|
||||
return isInWarmUpPeriod;
|
||||
}
|
||||
public double getCost() {
|
||||
return bwCost + cpuCost;
|
||||
}
|
||||
public double getNetworkDelay() {
|
||||
return networkDelay;
|
||||
}
|
||||
public double getServiceTime() {
|
||||
return taskEndTime - taskStartTime;
|
||||
}
|
||||
public SimLogger.TASK_STATUS getStatus(){
|
||||
return status;
|
||||
}
|
||||
public int getVmType(){
|
||||
return vmType;
|
||||
}
|
||||
public String toString (int taskId)
|
||||
{
|
||||
String result = taskId + SimSettings.DELIMITER +
|
||||
datacenterId + SimSettings.DELIMITER +
|
||||
hostId + SimSettings.DELIMITER +
|
||||
vmId + SimSettings.DELIMITER +
|
||||
vmType + SimSettings.DELIMITER +
|
||||
taskType + SimSettings.DELIMITER +
|
||||
taskLenght + SimSettings.DELIMITER +
|
||||
taskInputType + SimSettings.DELIMITER +
|
||||
taskOutputSize + SimSettings.DELIMITER +
|
||||
taskStartTime + SimSettings.DELIMITER +
|
||||
taskEndTime + SimSettings.DELIMITER;
|
||||
|
||||
if(status == SimLogger.TASK_STATUS.COMLETED)
|
||||
result += networkDelay;
|
||||
else if(status == SimLogger.TASK_STATUS.REJECTED_DUE_TO_VM_CAPACITY)
|
||||
result +="1"; //failure reason 1
|
||||
else if(status == SimLogger.TASK_STATUS.REJECTED_DUE_TO_BANDWIDTH)
|
||||
result +="2"; //failure reason 2
|
||||
else if(status == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_BANDWIDTH)
|
||||
result +="3"; //failure reason 3
|
||||
else if(status == SimLogger.TASK_STATUS.UNFINISHED_DUE_TO_MOBILITY)
|
||||
result +="4"; //failure reason 4
|
||||
else
|
||||
result +="0"; //default failure reason
|
||||
return result;
|
||||
}
|
||||
}
|
103
src/edu/boun/edgecloudsim/utils/SimUtils.java
Normal file
103
src/edu/boun/edgecloudsim/utils/SimUtils.java
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Simulation Utils
|
||||
*
|
||||
* Description: Utility class providing helper functions
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.utils;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
|
||||
public class SimUtils {
|
||||
|
||||
public static final Random RNG = new Random(System.currentTimeMillis());
|
||||
|
||||
public static int getRandomNumber(int start, int end) {
|
||||
//return pd.sample();
|
||||
long range = (long)end - (long)start + 1;
|
||||
long fraction = (long)(range * RNG.nextDouble());
|
||||
return (int)(fraction + start);
|
||||
}
|
||||
public static double getRandomDoubleNumber(double start, double end) {
|
||||
//return pd.sample();
|
||||
double range = end - start;
|
||||
double fraction = (range * RNG.nextDouble());
|
||||
return (fraction + start);
|
||||
}
|
||||
public static long getRandomLongNumber(int start, int end) {
|
||||
//return pd.sample();
|
||||
long range = (long)end - (long)start + 1;
|
||||
long fraction = (long)(range * RNG.nextDouble());
|
||||
return (fraction + start);
|
||||
}
|
||||
|
||||
public static void cleanOutputFolder(String outputFolder){
|
||||
//clean the folder where the result files will be saved
|
||||
File dir = new File(outputFolder);
|
||||
if(dir.exists() && dir.isDirectory())
|
||||
{
|
||||
for (File f: dir.listFiles())
|
||||
{
|
||||
if (f.exists() && f.isFile())
|
||||
{
|
||||
if(!f.delete())
|
||||
{
|
||||
SimLogger.printLine("file cannot be cleared: " + f.getAbsolutePath());
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
SimLogger.printLine("Output folder is not available: " + outputFolder);
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
public static String getTimeDifference(Date startDate, Date endDate){
|
||||
String result = "";
|
||||
long duration = endDate.getTime() - startDate.getTime();
|
||||
|
||||
long diffInMilli = TimeUnit.MILLISECONDS.toMillis(duration);
|
||||
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
|
||||
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
|
||||
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
|
||||
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);
|
||||
|
||||
if(diffInDays>0)
|
||||
result += diffInDays + ((diffInDays>1 == true) ? " Days " : " Day ");
|
||||
if(diffInHours>0)
|
||||
result += diffInHours % 24 + ((diffInHours>1 == true) ? " Hours " : " Hour ");
|
||||
if(diffInMinutes>0)
|
||||
result += diffInMinutes % 60 + ((diffInMinutes>1 == true) ? " Minutes " : " Minute ");
|
||||
if(diffInSeconds>0)
|
||||
result += diffInSeconds % 60 + ((diffInSeconds>1 == true) ? " Seconds" : " Second");
|
||||
if(diffInMilli>0 && result.isEmpty())
|
||||
result += diffInMilli + ((diffInMilli>1 == true) ? " Milli Seconds" : " Milli Second");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static SimSettings.PLACE_TYPES stringToPlace(String attractiveness){
|
||||
SimSettings.PLACE_TYPES placeType = null;
|
||||
if(attractiveness.equals("1"))
|
||||
placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L1;
|
||||
else if(attractiveness.equals("2"))
|
||||
placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L2;
|
||||
else if(attractiveness.equals("3"))
|
||||
placeType = SimSettings.PLACE_TYPES.ATTRACTIVENESS_L3;
|
||||
else{
|
||||
SimLogger.printLine("Unknown attractiveness level! Terminating simulation...");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
return placeType;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user