From 052d4b16cecddd6efcedacfbba08e54e33e81206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Mon, 5 Apr 2021 20:54:58 +0200 Subject: [PATCH] birbnetes basics added --- scripts/birbnetes/.gitignore | 1 + scripts/birbnetes/compile.sh | 4 + scripts/birbnetes/config/applications.xml | 18 +++ .../config/default_config.properties | 42 +++++ scripts/birbnetes/config/edge_devices.xml | 71 +++++++++ scripts/birbnetes/matlab/getConfiguration.m | 53 +++++++ scripts/birbnetes/matlab/plotAvgFailedTask.m | 21 +++ .../birbnetes/matlab/plotAvgNetworkDelay.m | 21 +++ .../birbnetes/matlab/plotAvgProcessingTime.m | 21 +++ scripts/birbnetes/matlab/plotAvgServiceTime.m | 21 +++ .../birbnetes/matlab/plotAvgVmUtilization.m | 9 ++ scripts/birbnetes/matlab/plotGenericResult.m | 149 ++++++++++++++++++ .../birbnetes/matlab/plotTaskFailureReason.m | 27 ++++ scripts/birbnetes/run_scenarios.sh | 59 +++++++ scripts/birbnetes/runner.sh | 18 +++ scripts/birbnetes/simulation.list | 1 + .../birbnetes/BirbnetesScenarioFactory.java | 75 +++++++++ .../applications/birbnetes/MainApp.java | 121 ++++++++++++++ .../mobility/StationaryMobility.java | 110 +++++++++++++ 19 files changed, 842 insertions(+) create mode 100644 scripts/birbnetes/.gitignore create mode 100644 scripts/birbnetes/compile.sh create mode 100644 scripts/birbnetes/config/applications.xml create mode 100644 scripts/birbnetes/config/default_config.properties create mode 100644 scripts/birbnetes/config/edge_devices.xml create mode 100644 scripts/birbnetes/matlab/getConfiguration.m create mode 100644 scripts/birbnetes/matlab/plotAvgFailedTask.m create mode 100644 scripts/birbnetes/matlab/plotAvgNetworkDelay.m create mode 100644 scripts/birbnetes/matlab/plotAvgProcessingTime.m create mode 100644 scripts/birbnetes/matlab/plotAvgServiceTime.m create mode 100644 scripts/birbnetes/matlab/plotAvgVmUtilization.m create mode 100644 scripts/birbnetes/matlab/plotGenericResult.m create mode 100644 scripts/birbnetes/matlab/plotTaskFailureReason.m create mode 100644 scripts/birbnetes/run_scenarios.sh create mode 100644 scripts/birbnetes/runner.sh create mode 100644 scripts/birbnetes/simulation.list create mode 100644 src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java create mode 100644 src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java create mode 100644 src/edu/boun/edgecloudsim/mobility/StationaryMobility.java diff --git a/scripts/birbnetes/.gitignore b/scripts/birbnetes/.gitignore new file mode 100644 index 0000000..53752db --- /dev/null +++ b/scripts/birbnetes/.gitignore @@ -0,0 +1 @@ +output diff --git a/scripts/birbnetes/compile.sh b/scripts/birbnetes/compile.sh new file mode 100644 index 0000000..aa3cedd --- /dev/null +++ b/scripts/birbnetes/compile.sh @@ -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:../../lib/colt.jar" -sourcepath ../../src ../../src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java -d ../../bin diff --git a/scripts/birbnetes/config/applications.xml b/scripts/birbnetes/config/applications.xml new file mode 100644 index 0000000..f7ac597 --- /dev/null +++ b/scripts/birbnetes/config/applications.xml @@ -0,0 +1,18 @@ + + + + 100 + 1 + 7 + 0 + 2 + 20 + 88 + 2 + 750 + 1 + 4 + 20 + 5 + + \ No newline at end of file diff --git a/scripts/birbnetes/config/default_config.properties b/scripts/birbnetes/config/default_config.properties new file mode 100644 index 0000000..43d7ed5 --- /dev/null +++ b/scripts/birbnetes/config/default_config.properties @@ -0,0 +1,42 @@ +#default config file +simulation_time=30 +warm_up_period=3 +vm_load_check_interval=0.1 +location_check_interval=0.1 +file_log_enabled=true +deep_file_log_enabled=false + +min_number_of_mobile_devices=100 +max_number_of_mobile_devices=1000 +mobile_device_counter_size=100 + +wan_propagation_delay=0.1 +lan_internal_delay=0.005 +wlan_bandwidth=200 +wan_bandwidth=15 +gsm_bandwidth=0 + +#all the host on cloud runs on a single datacenter +number_of_host_on_cloud_datacenter=1 +number_of_vm_on_cloud_host=4 +core_for_cloud_vm=4 +mips_for_cloud_vm=10000 +ram_for_cloud_vm=32000 +storage_for_cloud_vm=1000000 + +#mobile devices has no processing unit in this scenario +core_for_mobile_vm=4 +mips_for_mobile_vm=1000 +ram_for_mobile_vm=4000 +storage_for_mobile_vm=16000 + +#use ',' for multiple values +orchestrator_policies=NEXT_FIT + +#use ',' for multiple values +simulation_scenarios=SINGLE_TIER,TWO_TIER,TWO_TIER_WITH_EO + +#mean waiting time in seconds +attractiveness_L1_mean_waiting_time=500 +attractiveness_L2_mean_waiting_time=300 +attractiveness_L3_mean_waiting_time=120 diff --git a/scripts/birbnetes/config/edge_devices.xml b/scripts/birbnetes/config/edge_devices.xml new file mode 100644 index 0000000..6daa000 --- /dev/null +++ b/scripts/birbnetes/config/edge_devices.xml @@ -0,0 +1,71 @@ + + + + 0.1 + 3.0 + 0.05 + 0.1 + + 1 + 1 + 0 + 0 + + + + 8 + 4000 + 8000 + 200000 + + + 2 + 1000 + 2000 + 50000 + + + 2 + 1000 + 2000 + 50000 + + + + + + + 0.1 + 3.0 + 0.05 + 0.1 + + 2 + 2 + 1 + 0 + + + + 8 + 4000 + 8000 + 200000 + + + 2 + 1000 + 2000 + 50000 + + + 2 + 1000 + 2000 + 50000 + + + + + + \ No newline at end of file diff --git a/scripts/birbnetes/matlab/getConfiguration.m b/scripts/birbnetes/matlab/getConfiguration.m new file mode 100644 index 0000000..834d5c1 --- /dev/null +++ b/scripts/birbnetes/matlab/getConfiguration.m @@ -0,0 +1,53 @@ +%-------------------------------------------------------------- +%description +% returns a value according to the given argumentssss +%-------------------------------------------------------------- +function [ret_val] = getConfiguration(argType) + if(argType == 1) + ret_val = 'D:\sim_results'; + elseif(argType == 2) + ret_val = 1; %Number of iterations + elseif(argType == 3) + ret_val = 100; %min number of mobile device + elseif(argType == 4) + ret_val = 100; %step size of mobile device count + elseif(argType == 5) + ret_val =1000; %max number of mobile device + elseif(argType == 6) + ret_val = 1; %xTickLabelCoefficient + elseif(argType == 7) + ret_val = {'SINGLE_TIER','TWO_TIER','TWO_TIER_WITH_EO'}; + elseif(argType == 8) + ret_val = {'1-tier','2-tier','2-tier with EO'}; + elseif(argType == 9) + ret_val=[10 3 12 12]; %position of figure + elseif(argType == 10) + ret_val = 'Number of Mobile Devices'; %Common text for x axis + elseif(argType == 11) + ret_val = 1; %return 1 if you want to save figure as pdf + elseif(argType == 12) + ret_val = 0; %return 1 if you want to plot errors + elseif(argType == 20) + ret_val=1; %return 1 if graph is plotted colerful + elseif(argType == 21) + ret_val=[0.55 0 0]; %color of first line + elseif(argType == 22) + ret_val=[0 0.15 0.6]; %color of second line + elseif(argType == 23) + ret_val=[0 0.23 0]; %color of third line + elseif(argType == 24) + ret_val=[0.6 0 0.6]; %color of fourth line + elseif(argType == 25) + ret_val=[0.08 0.08 0.08]; %color of fifth line + elseif(argType == 26) + ret_val=[0 0.8 0.8]; %color of sixth line + elseif(argType == 27) + ret_val=[0.8 0.4 0]; %color of seventh line + elseif(argType == 28) + ret_val=[0.8 0.8 0]; %color of eighth line + elseif(argType == 40) + ret_val={'-k*','-ko','-ks','-kv','-kp','-kd','-kx','-kh'}; %line style (marker) of the colerless line + elseif(argType == 50) + ret_val={':k*',':ko',':ks',':kv',':kp',':kd',':kx',':kh'}; %line style (marker) of the colerfull line + end +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotAvgFailedTask.m b/scripts/birbnetes/matlab/plotAvgFailedTask.m new file mode 100644 index 0000000..c1d4afe --- /dev/null +++ b/scripts/birbnetes/matlab/plotAvgFailedTask.m @@ -0,0 +1,21 @@ +function [] = plotAvgFailedTask() + + plotGenericResult(1, 2, 'Failed Tasks (%)', 'ALL_APPS', 'percentage_for_all'); + plotGenericResult(1, 2, {'Failed Tasks for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all'); + plotGenericResult(1, 2, 'Failed Tasks for Health App (%)', 'HEALTH_APP', 'percentage_for_all'); + plotGenericResult(1, 2, {'Failed Tasks for';'Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_all'); + plotGenericResult(1, 2, 'Failed Tasks for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all'); + + plotGenericResult(2, 2, 'Failed Tasks on Edge (%)', 'ALL_APPS', 'percentage_for_all'); + plotGenericResult(2, 2, {'Failed Tasks on Edge';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all'); + plotGenericResult(2, 2, 'Failed Tasks on Edge for Health App (%)', 'HEALTH_APP', 'percentage_for_all'); + plotGenericResult(2, 2, 'Failed Tasks on Edge for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all'); + plotGenericResult(2, 2, 'Failed Tasks on Edge for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all'); + + plotGenericResult(3, 2, 'Failed Tasks on Cloud (%)', 'ALL_APPS', 'percentage_for_all'); + plotGenericResult(3, 2, {'Failed Tasks on Cloud for';'Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_all'); + plotGenericResult(3, 2, 'Failed Tasks on Cloud for Health App (%)', 'HEALTH_APP', 'percentage_for_all'); + plotGenericResult(3, 2, 'Failed Tasks on Cloud for Infotainment App (%)', 'INFOTAINMENT_APP', 'percentage_for_all'); + plotGenericResult(3, 2, 'Failed Tasks on Cloud for Heavy Comp. App (%)', 'HEAVY_COMP_APP', 'percentage_for_all'); + +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotAvgNetworkDelay.m b/scripts/birbnetes/matlab/plotAvgNetworkDelay.m new file mode 100644 index 0000000..4edd5d4 --- /dev/null +++ b/scripts/birbnetes/matlab/plotAvgNetworkDelay.m @@ -0,0 +1,21 @@ +function [] = plotAvgNetworkDelay() + + plotGenericResult(1, 7, 'Average Network Delay (sec)', 'ALL_APPS', ''); + plotGenericResult(1, 7, {'Average Network Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(1, 7, 'Average Network Delay for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(1, 7, {'Average Network Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(1, 7, {'Average Network Delay';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', ''); + + plotGenericResult(5, 1, 'Average WLAN Delay (sec)', 'ALL_APPS', ''); + plotGenericResult(5, 1, {'Average WLAN Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(5, 1, 'Average WLAN Delay for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(5, 1, {'Average WLAN Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(5, 1, {'Average WLAN Delay';'for Heavy Comp. App %(sec)'}, 'HEAVY_COMP_APP', ''); + + plotGenericResult(5, 3, 'Average WAN Delay (sec)', 'ALL_APPS', ''); + plotGenericResult(5, 3, {'Average WAN Delay';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(5, 3, 'Average WAN Delay for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(5, 3, {'Average WAN Delay';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(5, 3, {'Average WAN Delay';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', ''); + +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotAvgProcessingTime.m b/scripts/birbnetes/matlab/plotAvgProcessingTime.m new file mode 100644 index 0000000..103e48e --- /dev/null +++ b/scripts/birbnetes/matlab/plotAvgProcessingTime.m @@ -0,0 +1,21 @@ +function [] = plotAvgProcessingTime() + + plotGenericResult(1, 6, 'Processing Time (sec)', 'ALL_APPS', ''); + plotGenericResult(1, 6, 'Processing Time for Augmented Reality App (sec)', 'AUGMENTED_REALITY', ''); + plotGenericResult(1, 6, 'Processing Time for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(1, 6, 'Processing Time for Infotainment App (sec)', 'INFOTAINMENT_APP', ''); + plotGenericResult(1, 6, 'Processing Time for Heavy Comp. App (sec)', 'HEAVY_COMP_APP', ''); + + plotGenericResult(2, 6, 'Processing Time on Edge (sec)', 'ALL_APPS', ''); + plotGenericResult(2, 6, {'Processing Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(2, 6, {'Processing Time on Edge';'for Health App (sec)'}, 'HEALTH_APP', ''); + plotGenericResult(2, 6, {'Processing Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(2, 6, {'Processing Time on Edge';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', ''); + + plotGenericResult(3, 6, 'Processing Time on Cloud (sec)', 'ALL_APPS', ''); + plotGenericResult(3, 6, {'Processing Time on Cloud';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(3, 6, {'Processing Time on Cloud';'for Health App (sec)'}, 'HEALTH_APP', ''); + plotGenericResult(3, 6, {'Processing Time on Cloud';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(3, 6, {'Processing Time on Cloud';'for Heavy Computation App (sec)'}, 'HEAVY_COMP_APP', ''); + +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotAvgServiceTime.m b/scripts/birbnetes/matlab/plotAvgServiceTime.m new file mode 100644 index 0000000..1682f30 --- /dev/null +++ b/scripts/birbnetes/matlab/plotAvgServiceTime.m @@ -0,0 +1,21 @@ +function [] = plotAvgServiceTime() + + plotGenericResult(1, 5, 'Service Time (sec)', 'ALL_APPS', ''); + plotGenericResult(1, 5, {'Service Time for';'Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(1, 5, 'Service Time for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(1, 5, 'Service Time for Infotainment App (sec)', 'INFOTAINMENT_APP', ''); + plotGenericResult(1, 5, {'Service Time for';'Compute Intensive App (sec)'}, 'HEAVY_COMP_APP', ''); + + plotGenericResult(2, 5, 'Service Time on Edge (sec)', 'ALL_APPS', ''); + plotGenericResult(2, 5, {'Service Time on Edge';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(2, 5, 'Service Time on Edge for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(2, 5, {'Service Time on Edge';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(2, 5, {'Service Time on Edge';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', ''); + + plotGenericResult(3, 5, 'Service Time on Cloud (sec)', 'ALL_APPS', ''); + plotGenericResult(3, 5, {'Service Time on Cloud';'for Augmented Reality App (sec)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(3, 5, 'Service Time on Cloud for Health App (sec)', 'HEALTH_APP', ''); + plotGenericResult(3, 5, {'Service Time on Cloud';'for Infotainment App (sec)'}, 'INFOTAINMENT_APP', ''); + plotGenericResult(3, 5, {'Service Time on Cloud';'for Heavy Comp. App (sec)'}, 'HEAVY_COMP_APP', ''); + +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotAvgVmUtilization.m b/scripts/birbnetes/matlab/plotAvgVmUtilization.m new file mode 100644 index 0000000..ac092c3 --- /dev/null +++ b/scripts/birbnetes/matlab/plotAvgVmUtilization.m @@ -0,0 +1,9 @@ +function [] = plotAvgVmUtilization() + + plotGenericResult(2, 8, 'Average VM Utilization (%)', 'ALL_APPS', ''); + plotGenericResult(2, 8, {'Average VM Utilization';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', ''); + plotGenericResult(2, 8, 'Average VM Utilization for Health App (%)', 'HEALTH_APP', ''); + plotGenericResult(2, 8, 'Average VM Utilization for Infotainment App (%)', 'INFOTAINMENT_APP', ''); + plotGenericResult(2, 8, 'Average VM Utilization for Heavy Comp. App (%)', 'HEAVY_COMP_APP', ''); + +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotGenericResult.m b/scripts/birbnetes/matlab/plotGenericResult.m new file mode 100644 index 0000000..d5dee9b --- /dev/null +++ b/scripts/birbnetes/matlab/plotGenericResult.m @@ -0,0 +1,149 @@ +function [] = plotGenericResult(rowOfset, columnOfset, yLabel, appType, calculatePercentage) + folderPath = getConfiguration(1); + numOfSimulations = getConfiguration(2); + startOfMobileDeviceLoop = getConfiguration(3); + stepOfMobileDeviceLoop = getConfiguration(4); + endOfMobileDeviceLoop = getConfiguration(5); + xTickLabelCoefficient = getConfiguration(6); + + scenarioType = getConfiguration(7); + legends = getConfiguration(8); + numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1; + + pos=getConfiguration(9); + + all_results = zeros(numOfSimulations, size(scenarioType,2), numOfMobileDevices); + min_results = zeros(size(scenarioType,2), numOfMobileDevices); + max_results = zeros(size(scenarioType,2), numOfMobileDevices); + + for s=1:numOfSimulations + for i=1:size(scenarioType,2) + for j=1:numOfMobileDevices + try + mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1); + filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_',char(scenarioType(i)),'_NEXT_FIT_',int2str(mobileDeviceNumber),'DEVICES_',appType,'_GENERIC.log'); + + readData = dlmread(filePath,';',rowOfset,0); + value = readData(1,columnOfset); + if(strcmp(calculatePercentage,'percentage_for_all')) + readData = dlmread(filePath,';',1,0); + totalTask = readData(1,1)+readData(1,2); + value = (100 * value) / totalTask; + elseif(strcmp(calculatePercentage,'percentage_for_completed')) + readData = dlmread(filePath,';',1,0); + totalTask = readData(1,1); + value = (100 * value) / totalTask; + elseif(strcmp(calculatePercentage,'percentage_for_failed')) + readData = dlmread(filePath,';',1,0); + totalTask = readData(1,2); + value = (100 * value) / totalTask; + end + + all_results(s,i,j) = value; + catch err + error(err) + end + end + end + end + + if(numOfSimulations == 1) + results = all_results; + else + results = mean(all_results); %still 3d matrix but 1xMxN format + end + + results = squeeze(results); %remove singleton dimensions + + for i=1:size(scenarioType,2) + for j=1:numOfMobileDevices + x=all_results(:,i,j); % Create Data + SEM = std(x)/sqrt(length(x)); % Standard Error + ts = tinv([0.05 0.95],length(x)-1); % T-Score + CI = mean(x) + ts*SEM; % Confidence Intervals + + if(CI(1) < 0) + CI(1) = 0; + end + + if(CI(2) < 0) + CI(2) = 0; + end + + min_results(i,j) = results(i,j) - CI(1); + max_results(i,j) = CI(2) - results(i,j); + end + end + + types = zeros(1,numOfMobileDevices); + for i=1:numOfMobileDevices + types(i)=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop); + end + + hFig = figure; + set(hFig, 'Units','centimeters'); + set(hFig, 'Position',pos); + set(0,'DefaultAxesFontName','Times New Roman'); + set(0,'DefaultTextFontName','Times New Roman'); + set(0,'DefaultAxesFontSize',10); + set(0,'DefaultTextFontSize',12); + if(getConfiguration(20) == 1) + for i=1:1:numOfMobileDevices + xIndex=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop); + + markers = getConfiguration(50); + for j=1:size(scenarioType,2) + plot(xIndex, results(j,i),char(markers(j)),'MarkerFaceColor',getConfiguration(20+j),'color',getConfiguration(20+j)); + hold on; + end + end + + for j=1:size(scenarioType,2) + if(getConfiguration(12) == 1) + errorbar(types, results(j,:), min_results(j,:),max_results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5); + else + plot(types, results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5); + end + hold on; + end + + set(gca,'color','none'); + else + markers = getConfiguration(40); + for j=1:size(scenarioType,2) + if(getConfiguration(12) == 1) + errorbar(types, results(j,:),min_results(j,:),max_results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2); + else + plot(types, results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.2); + end + hold on; + end + + end + + lgnd = legend(legends,'Location','NorthWest'); + if(getConfiguration(20) == 1) + set(lgnd,'color','none'); + end + + hold off; + axis square + xlabel(getConfiguration(10)); + set(gca,'XTick', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop); + set(gca,'XTickLabel', (startOfMobileDeviceLoop*xTickLabelCoefficient):(stepOfMobileDeviceLoop*xTickLabelCoefficient):endOfMobileDeviceLoop); + ylabel(yLabel); + set(gca,'XLim',[startOfMobileDeviceLoop-5 endOfMobileDeviceLoop+5]); + + set(get(gca,'Xlabel'),'FontSize',12) + set(get(gca,'Ylabel'),'FontSize',12) + set(lgnd,'FontSize',11) + + if(getConfiguration(11) == 1) + set(hFig, 'PaperUnits', 'centimeters'); + set(hFig, 'PaperPositionMode', 'manual'); + set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]); + set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size + filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType); + saveas(gcf, filename, 'pdf'); + end +end \ No newline at end of file diff --git a/scripts/birbnetes/matlab/plotTaskFailureReason.m b/scripts/birbnetes/matlab/plotTaskFailureReason.m new file mode 100644 index 0000000..0356b15 --- /dev/null +++ b/scripts/birbnetes/matlab/plotTaskFailureReason.m @@ -0,0 +1,27 @@ +function [] = plotTaskFailureReason() + + plotGenericResult(1, 10, 'Failed Task due to VM Capacity (%)', 'ALL_APPS', 'percentage_for_failed'); + plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed'); + plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed'); + plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed'); + plotGenericResult(1, 10, {'Failed Task due to VM Capacity';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed'); + + plotGenericResult(1, 11, 'Failed Task due to Mobility (%)', 'ALL_APPS', 'percentage_for_failed'); + plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed'); + plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed'); + plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed'); + plotGenericResult(1, 11, {'Failed Task due to Mobility';'for Heavy Computation App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed'); + + plotGenericResult(5, 5, 'Failed Tasks due to WLAN failure (%)', 'ALL_APPS', 'percentage_for_failed'); + plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed'); + plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed'); + plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed'); + plotGenericResult(5, 5, {'Failed Tasks due to WLAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed'); + + plotGenericResult(5, 7, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'percentage_for_failed'); + plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Augmented Reality App (%)'}, 'AUGMENTED_REALITY', 'percentage_for_failed'); + plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Health App (%)'}, 'HEALTH_APP', 'percentage_for_failed'); + plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Infotainment App (%)'}, 'INFOTAINMENT_APP', 'percentage_for_failed'); + plotGenericResult(5, 7, {'Failed Tasks due to WAN failure';'for Heavy Comp. App (%)'}, 'HEAVY_COMP_APP', 'percentage_for_failed'); + +end \ No newline at end of file diff --git a/scripts/birbnetes/run_scenarios.sh b/scripts/birbnetes/run_scenarios.sh new file mode 100644 index 0000000..c770335 --- /dev/null +++ b/scripts/birbnetes/run_scenarios.sh @@ -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 diff --git a/scripts/birbnetes/runner.sh b/scripts/birbnetes/runner.sh new file mode 100644 index 0000000..82afb86 --- /dev/null +++ b/scripts/birbnetes/runner.sh @@ -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:../../lib/colt.jar' edu.boun.edgecloudsim.applications.birbnetes.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 diff --git a/scripts/birbnetes/simulation.list b/scripts/birbnetes/simulation.list new file mode 100644 index 0000000..3a4122a --- /dev/null +++ b/scripts/birbnetes/simulation.list @@ -0,0 +1 @@ +default_config;edge_devices.xml;applications.xml \ No newline at end of file diff --git a/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java b/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java new file mode 100644 index 0000000..a642f4c --- /dev/null +++ b/src/edu/boun/edgecloudsim/applications/birbnetes/BirbnetesScenarioFactory.java @@ -0,0 +1,75 @@ +package edu.boun.edgecloudsim.applications.birbnetes; + +import edu.boun.edgecloudsim.cloud_server.CloudServerManager; +import edu.boun.edgecloudsim.cloud_server.DefaultCloudServerManager; +import edu.boun.edgecloudsim.edge_client.DefaultMobileDeviceManager; +import edu.boun.edgecloudsim.edge_client.MobileDeviceManager; +import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.DefaultMobileServerManager; +import edu.boun.edgecloudsim.edge_client.mobile_processing_unit.MobileServerManager; +import edu.boun.edgecloudsim.edge_orchestrator.BasicEdgeOrchestrator; +import edu.boun.edgecloudsim.edge_orchestrator.EdgeOrchestrator; +import edu.boun.edgecloudsim.edge_server.DefaultEdgeServerManager; +import edu.boun.edgecloudsim.edge_server.EdgeServerManager; +import edu.boun.edgecloudsim.mobility.MobilityModel; +import edu.boun.edgecloudsim.mobility.StationaryMobility; +import edu.boun.edgecloudsim.network.MM1Queue; +import edu.boun.edgecloudsim.network.NetworkModel; +import edu.boun.edgecloudsim.task_generator.IdleActiveLoadGenerator; +import edu.boun.edgecloudsim.task_generator.LoadGeneratorModel; + +public class BirbnetesScenarioFactory implements edu.boun.edgecloudsim.core.ScenarioFactory { + private int numOfMobileDevice; + private double simulationTime; + private String orchestratorPolicy; + private String simScenario; + + BirbnetesScenarioFactory(int _numOfMobileDevice, + double _simulationTime, + String _orchestratorPolicy, + String _simScenario){ + orchestratorPolicy = _orchestratorPolicy; + numOfMobileDevice = _numOfMobileDevice; + simulationTime = _simulationTime; + simScenario = _simScenario; + } + + @Override + public LoadGeneratorModel getLoadGeneratorModel() { + return new IdleActiveLoadGenerator(numOfMobileDevice, simulationTime, simScenario); + } + + @Override + public EdgeOrchestrator getEdgeOrchestrator() { + return new BasicEdgeOrchestrator(orchestratorPolicy, simScenario); + } + + @Override + public MobilityModel getMobilityModel() { + return new StationaryMobility(numOfMobileDevice,simulationTime); + } + + @Override + public NetworkModel getNetworkModel() { + return new MM1Queue(numOfMobileDevice, simScenario); + } + + @Override + public EdgeServerManager getEdgeServerManager() { + return new DefaultEdgeServerManager(); + } + + @Override + public CloudServerManager getCloudServerManager() { + return new DefaultCloudServerManager(); + } + + @Override + public MobileDeviceManager getMobileDeviceManager() throws Exception { + return new DefaultMobileDeviceManager(); + } + + @Override + public MobileServerManager getMobileServerManager() { + return new DefaultMobileServerManager(); + } +} diff --git a/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java b/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java new file mode 100644 index 0000000..ec48948 --- /dev/null +++ b/src/edu/boun/edgecloudsim/applications/birbnetes/MainApp.java @@ -0,0 +1,121 @@ +package edu.boun.edgecloudsim.applications.birbnetes; + +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; +import org.cloudbus.cloudsim.Log; +import org.cloudbus.cloudsim.core.CloudSim; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +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 output and file output of this application + SimLogger.enablePrintLog(); + + int iterationNumber = 1; + String configFile = ""; + String outputFolder = ""; + String edgeDevicesFile = ""; + String applicationsFile = ""; + if (args.length == 5){ + configFile = args[0]; + edgeDevicesFile = args[1]; + applicationsFile = args[2]; + outputFolder = args[3]; + iterationNumber = Integer.parseInt(args[4]); + } + else{ + SimLogger.printLine("Simulation setting file, output folder and iteration number are not provided! Using default ones..."); + configFile = "scripts/birbnetes/config/default_config.properties"; + applicationsFile = "scripts/birbnetes/config/applications.xml"; + edgeDevicesFile = "scripts/birbnetes/config/edge_devices.xml"; + outputFolder = "sim_results/ite" + iterationNumber; + } + + //load settings from configuration file + SimSettings SS = SimSettings.getInstance(); + if(SS.initialize(configFile, edgeDevicesFile, applicationsFile) == false){ + SimLogger.printLine("cannot initialize simulation settings!"); + System.exit(0); + } + + if(SS.getFileLoggingEnabled()){ + SimLogger.enableFileLog(); + SimUtils.cleanOutputFolder(outputFolder); + } + + DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + Date SimulationStartDate = Calendar.getInstance().getTime(); + String now = df.format(SimulationStartDate); + SimLogger.printLine("Simulation started at " + now); + SimLogger.printLine("----------------------------------------------------------------------"); + + for(int j=SS.getMinNumOfMobileDev(); j<=SS.getMaxNumOfMobileDev(); j+=SS.getMobileDevCounterSize()) + { + for(int k=0; k> treeMapArray; + + public StationaryMobility(int _numberOfMobileDevices, double _simulationTime) { + super(_numberOfMobileDevices, _simulationTime); + // TODO Auto-generated constructor stub + } + + @Override + public void initialize() { + treeMapArray = new ArrayList>(); + + ExponentialDistribution[] expRngList = new ExponentialDistribution[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(); + int placeTypeIndex = Integer.parseInt(attractiveness); + + expRngList[i] = new ExponentialDistribution(SimSettings.getInstance().getMobilityLookUpTable()[placeTypeIndex]); + } + + //initialize tree maps and position of mobile devices + for(int i=0; i()); + + 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(); + int placeTypeIndex = Integer.parseInt(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 shortly after the simulation started (e.g. 10 seconds) + treeMapArray.get(i).put(SimSettings.CLIENT_ACTIVITY_START_TIME, new Location(placeTypeIndex, wlan_id, x_pos, y_pos)); + } + + for(int i=0; i treeMap = treeMapArray.get(i); + + while(treeMap.lastKey() < SimSettings.getInstance().getSimulationTime()) { + boolean placeFound = false; + int currentLocationId = treeMap.lastEntry().getValue().getServingWlanId(); + double waitingTime = expRngList[currentLocationId].sample(); + + 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(); + int placeTypeIndex = Integer.parseInt(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(placeTypeIndex, wlan_id, x_pos, y_pos)); + } + } + if(!placeFound){ + SimLogger.printLine("impossible is occurred! location cannot be assigned to the device!"); + System.exit(1); + } + } + } + + } + + @Override + public Location getLocation(int deviceId, double time) { + TreeMap treeMap = treeMapArray.get(deviceId); + + Map.Entry e = treeMap.floorEntry(0.0); + + if(e == null){ + SimLogger.printLine("impossible is occurred! no location is found for the device '" + deviceId + "' at " + time); + System.exit(1); + } + + return e.getValue(); + } + +}