- 1 for (int _count = (purchase_service_info.purchased_Service_number - 1); _count >= 0; _count--)
- 2 {
- 3 //if (purchase_service_info.purchase_service_nodeA_remainCPU[_count] >= 0)
- 4 //{
- 5 float remain_cpu = (purchase_service_info.purchase_service_nodeA_remainCPU[_count]
- 6 + purchase_service_info.purchase_service_nodeB_remainCPU[_count])*1.0f
- 7 / purchase_service_info.purchase_service_ID_Info[_count][1] * 1.0f;
- 8
- 9 float remain_mem = (purchase_service_info.purchase_service_nodeA_remainMEM[_count]
- 10 + purchase_service_info.purchase_service_nodeB_remainMEM[_count])*1.0f
- 11 / purchase_service_info.purchase_service_ID_Info[_count][2] * 1.0f;
- 12
- 13 if ((remain_cpu > 0.8f) && (remain_cpu < 0.99f) && (remain_mem > 0.8f) && (remain_mem < 0.99f))
- 14 //if ((remain_cpu > 0.8f) && (remain_mem > 0.8f))
- 15 {
- 16 //for (int vm_tra = 3; purchase_service_info.purchase_service_ID_Info[_count][vm_tra] != 0; vm_tra= vm_tra+4)
- 17 for (int vm_tra = 3; vm_tra <= 239; vm_tra = vm_tra + 4) //30 -- 119 and 40 --159
- 18 {
- 19 if (purchase_service_info.purchase_service_ID_Info[_count][vm_tra] > 100)
- 20 {
- 21 for (int service_tra = 0; service_tra < 2600; service_tra++)
- 22 {
- 23 if (service_tra != _count) //服务器不能自己迁移到自己本身
- 24 {
- 25 //if (purchase_service_info.purchase_service_ID_Info[service_tra][vm_tra + 1]) //如果是双节点
- 26 if (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] == 1) //如果是双节点
- 27 {
- 28 if ((purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] >= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2))
- 29 && (purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] >= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2))
- 30 && (purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] >= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2))
- 31 && (purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] >= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2))
- 32 )
- 33 {
- 34 #ifdef My_PRINT
- 35 cout << "nodeA_remain cpu:" << purchase_service_info.purchase_service_nodeA_remainCPU[_count] << " 1 " << purchase_service_info.purchase_service_ID_Info[_count][1] << endl;
- 36 cout << "nodeB_remain cpu:" << purchase_service_info.purchase_service_nodeB_remainCPU[_count] << " 1 " << purchase_service_info.purchase_service_ID_Info[_count][1] << endl;
- 37 cout << "nodeA_remain mem:" << purchase_service_info.purchase_service_nodeA_remainMEM[_count] << " 1 " << purchase_service_info.purchase_service_ID_Info[_count][2] << endl;
- 38 cout << "nodeB_remain mem:" << purchase_service_info.purchase_service_nodeB_remainMEM[_count] << " 1 " << purchase_service_info.purchase_service_ID_Info[_count][2] << endl;
- 39 #endif
- 40
- 41 purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] -= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2);
- 42 purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] -= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2);
- 43 purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] -= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2);
- 44 purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] -= (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2);
- 45
- 46 //需要补充选定服务器移出去的虚拟机的CPU和MEM
- 47 purchase_service_info.purchase_service_nodeA_remainCPU[_count] += (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2);
- 48 purchase_service_info.purchase_service_nodeB_remainCPU[_count] += (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] / 2);
- 49 purchase_service_info.purchase_service_nodeA_remainMEM[_count] += (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2);
- 50 purchase_service_info.purchase_service_nodeB_remainMEM[_count] += (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] / 2);
- 51
- 52 #ifdef My_PRINT
- 53 cout << "nodeA_remain cpu:" << purchase_service_info.purchase_service_nodeA_remainCPU[_count] << " 2 " << purchase_service_info.purchase_service_ID_Info[_count][1] << endl;
- 54 cout << "nodeB_remain cpu:" << purchase_service_info.purchase_service_nodeB_remainCPU[_count] << " 2 " << purchase_service_info.purchase_service_ID_Info[_count][1] << endl;
- 55 cout << "nodeA_remain mem:" << purchase_service_info.purchase_service_nodeA_remainMEM[_count] << " 2 " << purchase_service_info.purchase_service_ID_Info[_count][2] << endl;
- 56 cout << "nodeB_remain mem:" << purchase_service_info.purchase_service_nodeB_remainMEM[_count] << " 2 " << purchase_service_info.purchase_service_ID_Info[_count][2] << endl;
- 57 #endif
- 58
- 59 //vmOnServer[vmId] = vector<int>{ serverId,vmCores,vmMemory,1,2 };
- 60
- 61 vmOnServer[std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra])] = vector<int>{
- 62 purchase_service_info.purchase_service_ID_Info[service_tra][0],
- 63 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2],
- 64 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3],1,2 };
- 65
- 66
- 67
- 68 assert(purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] >= 0
- 69 && purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] >= 0
- 70 && purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] >= 0
- 71 && purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] >= 0);
- 72
- 73
- 74 assert((purchase_service_info.purchase_service_ID_Info[_count][1] / 2) >= purchase_service_info.purchase_service_nodeA_remainCPU[_count]
- 75 && (purchase_service_info.purchase_service_ID_Info[_count][1] / 2) >= purchase_service_info.purchase_service_nodeB_remainCPU[_count]
- 76 && (purchase_service_info.purchase_service_ID_Info[_count][2] / 2) >= purchase_service_info.purchase_service_nodeA_remainMEM[_count]
- 77 && (purchase_service_info.purchase_service_ID_Info[_count][2] / 2) >= purchase_service_info.purchase_service_nodeB_remainMEM[_count]);
- 78
- 79 string s;
- 80 string _migration = "migration";
- 81 s = "(" + _migration + ", ";
- 82 s += std::to_string(1) + ")\n";//(migration, count_migration)
- 83 res.push_back(s);
- 84 #ifdef My_PRINT
- 85 cout << s << endl;
- 86 #endif
- 87
- 88 s = "(" + std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra]) + ", ";
- 89 s += std::to_string(purchase_service_info.purchase_service_ID_Info[service_tra][0]) + ")\n";//(虚拟机ID, 目的服务器ID)*/
- 90
- 91 res.push_back(s);
- 92
- 93 //添加移入服务器上虚拟机的信息
- 94 for (int load_vm = 0; load_vm < 60; load_vm++) //因为del的原因,需要解决删除信息的方面
- 95 {
- 96 if (purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] == 0)
- 97 {
- 98 purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra];
- 99 purchase_service_info.purchase_service_ID_Info[service_tra][4 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1]; //Nodes
- 100 purchase_service_info.purchase_service_ID_Info[service_tra][5 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2]; //CPU
- 101 purchase_service_info.purchase_service_ID_Info[service_tra][6 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3]; //MEM
- 102
- 103 break;
- 104 }
- 105
- 106
- 107 }
- 108
- 109 //需要删除从服务器移走虚拟机的信息
- 110 purchase_service_info.purchase_service_ID_Info[_count][vm_tra] = 0;
- 111 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] = 0; //Nodes
- 112 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] = 0; //CPU
- 113 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] = 0; //MEM
- 114
- 115 #ifdef My_PRINT
- 116 cout << s << endl;
- 117 #endif
- 118
- 119 //计算功耗需要 扣除服务器的虚拟机数量
- 120 serverRunVms[_count]--;
- 121 serverRunVms[service_tra]++;
- 122
- 123
- 124 count_migration--;
- 125
- 126 //break; //如果判断是可以移植的话,即进行移植,移植完之后 立马进行下一个虚拟机
- 127 return 0;
- 128 }
- 129 else
- 130 {
- 131 //否则判断下一个服务器 CPU和MEM(从小号往大号)
- 132 }
- 133 }
- 134 else if (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] == 2)//需要对A节点点进行选择移植 不需要除/2
- 135 {
- 136 if ((purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] >= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2])
- 137 && (purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] >= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3]))
- 138 {
- 139
- 140 purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] -= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2];
- 141 purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] -= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3];
- 142
- 143 //需要补充选定服务器移出去的虚拟机的CPU和MEM
- 144 purchase_service_info.purchase_service_nodeA_remainCPU[_count] += purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2];
- 145 purchase_service_info.purchase_service_nodeA_remainMEM[_count] += purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3];
- 146
- 147
- 148 vmOnServer[std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra])] = vector<int>{
- 149 purchase_service_info.purchase_service_ID_Info[service_tra][0],
- 150 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2],
- 151 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3],1 };
- 152
- 153
- 154 assert(purchase_service_info.purchase_service_nodeA_remainCPU[service_tra] >= 0
- 155 && purchase_service_info.purchase_service_nodeA_remainMEM[service_tra] >= 0);
- 156
- 157
- 158 assert(purchase_service_info.purchase_service_ID_Info[_count][1] / 2 >= purchase_service_info.purchase_service_nodeA_remainCPU[_count]
- 159 && purchase_service_info.purchase_service_ID_Info[_count][2] / 2 >= purchase_service_info.purchase_service_nodeA_remainMEM[_count]);
- 160
- 161 string s;
- 162 string _migration = "migration";
- 163 s = "(" + _migration + ", ";
- 164 s += std::to_string(1) + ")\n";//(migration, count_migration)
- 165 res.push_back(s);
- 166 #ifdef My_PRINT
- 167 cout << s << endl;
- 168 #endif
- 169
- 170 s = "(" + std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra]) + ", ";
- 171 string _AA_A = "A";
- 172 s += std::to_string(purchase_service_info.purchase_service_ID_Info[service_tra][0]) + ", ";//(虚拟机ID, 目的服务器ID, A)
- 173 s += _AA_A + ")\n";
- 174 res.push_back(s);
- 175
- 176 //添加移入服务器上虚拟机的信息
- 177 for (int load_vm = 0; load_vm < 60; load_vm++) //因为del的原因,需要解决删除信息的方面
- 178 {
- 179 if (purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] == 0)
- 180 {
- 181 purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra];
- 182 purchase_service_info.purchase_service_ID_Info[service_tra][4 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1]; //Nodes
- 183 purchase_service_info.purchase_service_ID_Info[service_tra][5 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2]; //CPU
- 184 purchase_service_info.purchase_service_ID_Info[service_tra][6 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3]; //MEM
- 185
- 186 break;
- 187 }
- 188
- 189
- 190 }
- 191
- 192 //需要删除从服务器移走虚拟机的信息
- 193 purchase_service_info.purchase_service_ID_Info[_count][vm_tra] = 0;
- 194 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] = 0; //Nodes
- 195 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] = 0; //CPU
- 196 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] = 0; //MEM
- 197 #ifdef My_PRINT
- 198 cout << s << endl;
- 199 #endif
- 200
- 201 //计算功耗需要 扣除服务器的虚拟机数量
- 202 serverRunVms[_count]--;
- 203 serverRunVms[service_tra]++;
- 204
- 205
- 206 count_migration--;
- 207
- 208 //break; //如果判断是可以移植的话,即进行移植,移植完之后 立马进行下一个虚拟机
- 209 return 0;
- 210 }
- 211 else
- 212 {
- 213 ;
- 214 }
- 215 }
- 216 else if (purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] == 3)//需要对B节点点进行选择移植 不需要除/2
- 217 {
- 218 if ((purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] >= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2])
- 219 && (purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] >= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3]))
- 220 {
- 221
- 222
- 223 purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] -= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2];
- 224 purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] -= purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3];
- 225
- 226 #ifdef TEST
- 227 cout << purchase_service_info.purchase_service_nodeB_remainCPU[_count] << purchase_service_info.purchase_service_ID_Info[_count][1] << endl;
- 228 #endif
- 229 //需要补充选定服务器移出去的虚拟机的CPU和MEM
- 230 purchase_service_info.purchase_service_nodeB_remainCPU[_count] += purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2];
- 231 purchase_service_info.purchase_service_nodeB_remainMEM[_count] += purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3];
- 232
- 233
- 234 vmOnServer[std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra])] = vector<int>{
- 235 purchase_service_info.purchase_service_ID_Info[service_tra][0],
- 236 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2],
- 237 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3],2 };
- 238
- 239
- 240 #ifdef TEST
- 241 cout << purchase_service_info.purchase_service_nodeB_remainCPU[_count] << endl;
- 242 #endif
- 243
- 244 assert(purchase_service_info.purchase_service_nodeB_remainCPU[service_tra] >= 0
- 245 && purchase_service_info.purchase_service_nodeB_remainMEM[service_tra] >= 0);
- 246
- 247
- 248 assert(purchase_service_info.purchase_service_ID_Info[_count][1] / 2 >= purchase_service_info.purchase_service_nodeB_remainCPU[_count]
- 249 && purchase_service_info.purchase_service_ID_Info[_count][2] / 2 >= purchase_service_info.purchase_service_nodeB_remainMEM[_count]);
- 250
- 251 string s;
- 252 string _migration = "migration";
- 253 s = "(" + _migration + ", ";
- 254 s += std::to_string(1) + ")\n";//(migration, count_migration)
- 255 res.push_back(s);
- 256 #ifdef My_PRINT
- 257 cout << s << endl;
- 258 #endif
- 259
- 260 s = "(" + std::to_string(purchase_service_info.purchase_service_ID_Info[_count][vm_tra]) + ", ";
- 261 string _BB_B = "B";
- 262 s += std::to_string(purchase_service_info.purchase_service_ID_Info[service_tra][0]) + ", ";//(虚拟机ID, 目的服务器ID, B)
- 263 s += _BB_B + ")\n";
- 264 res.push_back(s);
- 265
- 266 //添加移入服务器上虚拟机的信息
- 267 for (int load_vm = 0; load_vm < 60; load_vm++) //因为del的原因,需要解决删除信息的方面
- 268 {
- 269 if (purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] == 0)
- 270 {
- 271 purchase_service_info.purchase_service_ID_Info[service_tra][3 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra];
- 272 purchase_service_info.purchase_service_ID_Info[service_tra][4 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1]; //Nodes
- 273 purchase_service_info.purchase_service_ID_Info[service_tra][5 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2]; //CPU
- 274 purchase_service_info.purchase_service_ID_Info[service_tra][6 + 4 * load_vm] = purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3]; //MEM
- 275
- 276 break;
- 277 }
- 278
- 279
- 280 }
- 281
- 282 //需要删除从服务器移走虚拟机的信息
- 283 purchase_service_info.purchase_service_ID_Info[_count][vm_tra] = 0;
- 284 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 1] = 0; //Nodes
- 285 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 2] = 0; //CPU
- 286 purchase_service_info.purchase_service_ID_Info[_count][vm_tra + 3] = 0; //MEM
- 287
- 288
- 289 #ifdef My_PRINT
- 290 cout << s << endl;
- 291 #endif
- 292
- 293 //计算功耗需要 扣除服务器的虚拟机数量
- 294 serverRunVms[_count]--;
- 295 serverRunVms[service_tra]++;
- 296
- 297
- 298 count_migration--;
- 299
- 300 //break; //如果判断是可以移植的话,即进行移植,移植完之后 立马进行下一个虚拟机
- 301 return 0;
- 302 }
- 303 else
- 304 {
- 305 ;
- 306 }
- 307 }
- 308
- 309 if (count_migration == 0)
- 310 {
- 311 return 0;
- 312 }
- 313 }
- 314 else
- 315 {
- 316 ;
- 317 }
- 318 }
- 319 }
- 320 else
- 321 {
- 322 ;
- 323 }
- 324 }
- 325 //不移动
- 326 /*
- 327 if (no_shift == 1)
- 328 {
- 329 string s = "(migration, 0)\n";
- 330 res.push_back(s);
- 331
- 332 no_shift = 0;
- 333 }
- 334 */
- 335
- 336 }
- 337 else
- 338 {
- 339 //否则判断上一个服务器 CPU和MEM(从大号往小号)
- 340 }
- 341
- 342 if (count_migration == 0)
- 343 {
- 344 return 0;
- 345 }
- 346 //}
- 347 }