{"id":367,"date":"2015-01-06T13:56:35","date_gmt":"2015-01-06T05:56:35","guid":{"rendered":"http:\/\/cmesoft.com\/?p=367"},"modified":"2015-01-06T14:00:26","modified_gmt":"2015-01-06T06:00:26","slug":"%e8%99%9a%e6%9c%ba%e8%b5%84%e6%ba%90%e5%88%86%e9%85%8d%e7%ae%97%e6%b3%95","status":"publish","type":"post","link":"http:\/\/cmesoft.com\/?p=367","title":{"rendered":"\u865a\u673a\u8d44\u6e90\u5206\u914d\u65b9\u6cd5"},"content":{"rendered":"<p>\u524d\u63d0\uff1a<\/p>\n<p>\u5df2\u7ecf\u77e5\u9053\u865a\u673a\u7684\u914d\u7f6e\u548c\u7269\u7406\u673a\u5269\u4f59\u7684\u8d44\u6e90\uff0c\u5206\u522b\u7528CPU\u6838\u6570\u548c\u5185\u5b58\u5927\u5c0f\uff08MB\uff09\u6765\u8868\u793a\uff0c\u6bd4\u5982VM\u7684\u914d\u7f6e\u6587\u4ef6\u4e3a\uff1a<\/p>\n<p>cat vm.txt<\/p>\n<p>192.168.1.100\u00a0\u00a0\u00a0 cpu\u00a0 \u5185\u5b58<br \/>\n192.168.1.101\u00a0\u00a0 cpu \u5185\u5b58<br \/>\n192.168.1.103\u00a0\u00a0 cpu\u00a0 \u5185\u5b58<\/p>\n<p>\u8981\u628a\u8fd9\u4e9bvm\u751f\u4ea7\u5230\u4e00\u6279\u7269\u7406\u673a\u4e0a\uff0c\u8fd9\u4e9b\u7269\u7406\u673a\u5f52\u5c5e\u4e0d\u540c\u7684\u7c7b\u578b\uff0c\u6216\u8005\u96c6\u7fa4\uff0c\u7528colo\u6807\u8bc6\uff0c\u7269\u7406\u673a\u8d44\u6e90\u6587\u4ef6\u5982\u4e0b\uff1a<\/p>\n<p>colo1\u00a0\u00a0\u00a0\u00a0 \u7269\u7406\u673a1\u00a0\u00a0\u00a0 \u53ef\u7528cpu\u00a0 \u53ef\u7528\u5185\u5b58<br \/>\ncolo2\u00a0\u00a0\u00a0 \u7269\u7406\u673a2\u00a0\u00a0\u00a0\u00a0 \u53ef\u7528cpu\u00a0 \u53ef\u7528\u5185\u5b58<\/p>\n<p>\u76ee\u6807\uff1a\u628avm\u751f\u4ea7\u5230\u8fd9\u4e9b\u7269\u7406\u673a\u4e0a\u9762\uff0c\u5e76\u4e14\u4f7f\u5f97\u6bcf\u53f0\u7269\u7406\u673a\u6709\u4e00\u5b9a\u7684cpu\u548c\u5185\u5b58\u9884\u7559\u4e0b\u6765\uff0c\u7b97\u6cd5\u5982\u4e0b\uff1a<br \/>\n<coolcode lang=\"shell\"><\/p>\n<p><\/coolcode>#include <stdio.h><br \/>\n#include <stdlib.h><br \/>\n#include <string.h><br \/>\ntypedef struct _vm<br \/>\n{<br \/>\nchar ip[16];<br \/>\nint cpu;<br \/>\nint mem;<br \/>\nvoid * next;<br \/>\n}vm_t;<br \/>\nvm_t g_vmlist[5000];<br \/>\nint  g_vmnum = 0;<br \/>\ntypedef struct _nc<br \/>\n{<br \/>\nchar name[64];<br \/>\nint cpu;<br \/>\nint mem;<br \/>\nvm_t* vmlist;<br \/>\nint vm_num;<br \/>\nvoid* next;<br \/>\n}nc_t;<\/p>\n<p>typedef struct _colo<br \/>\n{<br \/>\nchar name [64];<br \/>\nnc_t* nc_list;<br \/>\nint nc_num;<br \/>\n}colo_t;<br \/>\n#define COLO_NUM 10<br \/>\ntypedef struct _region<br \/>\n{<br \/>\ncolo_t  clist [COLO_NUM];<br \/>\nint colo_num;<br \/>\n}region_t;<br \/>\nregion_t g_reg;<\/p>\n<p>int load_vm(const char* fname);<br \/>\nint load_nc(const char* fname);<br \/>\nint assign_vm(void);<br \/>\nvoid print_res(void);<br \/>\nint main (int argc, char* argv[])<br \/>\n{<br \/>\nload_vm(&#8220;vm.txt&#8221;);<br \/>\nload_nc (&#8220;resource.txt&#8221;);<br \/>\nassign_vm();<br \/>\nprint_res();<br \/>\nreturn 0;<br \/>\n}<\/p>\n<p>int load_vm(const char* fname)<br \/>\n{<br \/>\nFILE * fp =  fopen (fname, &#8220;r&#8221;);<br \/>\nif (fp == NULL)<br \/>\n{<br \/>\nprintf (&#8220;can not find file &#8216;%s&#8217; to op\\nn&#8221;, fname);<br \/>\nreturn 0;<br \/>\n}<br \/>\nchar szline[1024] = {0};<\/p>\n<p>while (fgets(szline, 1024, fp))<br \/>\n{<br \/>\nint cpu = 0,mem=0;<br \/>\nchar ip[16] = {0};<br \/>\nif (sscanf(szline, &#8220;%s %d %d&#8221;, ip, &#038;cpu, &#038;mem) != 3)<br \/>\n{<br \/>\nprintf (&#8220;error data:%s&#8221;, szline);<br \/>\ncontinue;<br \/>\n}<br \/>\nmemset (g_vmlist + g_vmnum, 0, sizeof(vm_t));<br \/>\nvm_t * pv = g_vmlist + g_vmnum;<br \/>\nstrcpy(pv->ip, ip);<br \/>\npv->cpu = cpu;<br \/>\npv->mem = mem;<br \/>\ng_vmnum++;<br \/>\n\/\/printf (&#8220;%s&#8221;,szline);<br \/>\n}<br \/>\nfclose (fp);<br \/>\n\/\/printf (&#8220;%u vm(s) loaded\\n&#8221;, g_vmnum);<br \/>\nreturn g_vmnum;<br \/>\n}<br \/>\nvoid insert_nc (const char* nc,const char* colo,  int cpu,  int mem);<br \/>\nint load_nc(const char* fname)<br \/>\n{<br \/>\nFILE * fp =  fopen (fname, &#8220;r&#8221;);<br \/>\nif (fp == NULL)<br \/>\n{<br \/>\nprintf (&#8220;can not find file &#8216;%s&#8217; to op\\nn&#8221;, fname);<br \/>\nreturn 0;<br \/>\n}<br \/>\nchar szline[1024] = {0};<br \/>\ng_reg.colo_num = 0;<\/p>\n<p>int i = 0;<\/p>\n<p>for (i = 0; i  < COLO_NUM; i++)\n{\nmemset (g_reg.clist + i, 0, sizeof(colo_t));\n}\n\nwhile (fgets(szline, 1024, fp))\n{\nchar colo[8] = {0},nc[64] = {0};\nint cpu = 0, mem = 0;\nif (sscanf(szline, \"%s %s %d %d\", colo,nc,&#038;cpu,&#038;mem) != 4)\n{\nprintf(\"read bad data:%s\", szline);\ncontinue;\n}\ninsert_nc (nc, colo, cpu, mem);\n}\nfclose(fp);\nreturn  g_reg.colo_num;\n}\nvoid insert_nc (const char* strnc,const char* colo,  int cpu,  int mem)\n{\nnc_t nc;\nmemset (&#038;nc,0,sizeof(nc));\nstrcpy (nc.name, strnc);\nnc.cpu = cpu;\nnc.mem = mem;\nnc.vmlist = NULL;\nnc.vm_num = 0;\nnc.next = NULL;\n\nint i = 0;\nint pos = -1;\nfor (i = 0; i < g_reg.colo_num; i++)\n{\nif (strcmp(colo, g_reg.clist[i].name) == 0)\n{\npos = i;\nbreak;\n}\n}\n\nif (pos == -1)\n{\npos = i;\nstrcpy (g_reg.clist[pos].name, colo);\ng_reg.clist[pos].nc_list = NULL;\ng_reg.clist[pos].nc_num = 0;\ng_reg.colo_num++;\n}\ncolo_t * pc = g_reg.clist + pos;\n\nnc_t * pn = (nc_t*) malloc(sizeof(nc_t));\nmemset (pn, 0, sizeof(nc_t));\nmemcpy(pn, &#038;nc, sizeof(nc_t));\nif (pc->nc_list == NULL)<br \/>\n{<br \/>\npc->nc_list = pn;<br \/>\npc->nc_num = 1;<br \/>\n}else<br \/>\n{<br \/>\npn->next = pc->nc_list;<br \/>\npc->nc_list = pn;<br \/>\npc->nc_num++;<br \/>\n}<br \/>\n\/\/printf (&#8220;adding to colo &#8216;%s (%d)&#8217;,total nc: %u %s %u %u\\n&#8221;, pc->name, pos, pc->nc_num, pn->name, pn->cpu, pn->mem);<br \/>\n}<br \/>\nconst nc_t * ins_vm(vm_t * pv, int pos);<br \/>\nint assign_vm(void)<br \/>\n{<br \/>\nint  i = 0;<br \/>\nint pos = 0;<br \/>\nfor (i = 0; i < g_vmnum; )\n{\nvm_t * pv = g_vmlist + i;\npv->next = NULL;<br \/>\nconst nc_t * ret = ins_vm (pv, pos);<br \/>\nif (ret == NULL)<br \/>\n{<br \/>\n\/\/printf(&#8220;Migrating %s====>%d %d %s failed\\n&#8221;, pv->ip, pv->cpu, pv->mem, g_reg.clist[pos].name);<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\n\/\/printf(&#8220;Migrating %s %u %u ==> %s  %u %u  success \\n&#8221;, pv->ip, pv->cpu, pv->mem, ret->name, ret->cpu, ret->mem);<br \/>\ni++;<br \/>\n}<br \/>\npos = (pos + 1) % g_reg.colo_num;<br \/>\n}<br \/>\nreturn 1;<br \/>\n}<br \/>\nconst nc_t * ins_vm(vm_t * pv, int pos)<br \/>\n{<br \/>\ncolo_t * pc = g_reg.clist + pos;<br \/>\nnc_t * pn = pc->nc_list;<br \/>\nnc_t * ret = NULL;<\/p>\n<p>while (pn)<br \/>\n{<br \/>\nint acpu = 4;<\/p>\n<p>if (pv->cpu >= acpu) acpu = pv->cpu;<br \/>\nif ((pn->cpu &#8211; pv->cpu >= acpu) &#038;&#038; (pn->mem &#8211; pv->mem >= pv->mem))<br \/>\n{<br \/>\npn->cpu -= pv->cpu;<br \/>\npn->mem -= pv->mem;<br \/>\nret = pn;<br \/>\nif (pn->vmlist == NULL)<br \/>\n{<br \/>\npn->vmlist = pv;<br \/>\npn->vm_num = 1;<br \/>\n}else<br \/>\n{<br \/>\npv->next = pn->vmlist;<br \/>\npn->vmlist = pv;<br \/>\npn->vm_num++;<br \/>\n}<br \/>\nbreak;<br \/>\n}<br \/>\n\/\/printf (&#8220;%s %u %u\\n&#8221;, pn->name, pn->cpu, pn->mem);<br \/>\npn = pn->next;<br \/>\n}<br \/>\nreturn ret;<br \/>\n}<br \/>\nvoid print_res(void)<br \/>\n{<br \/>\nint i = 0;<br \/>\nfor (i = 0; i < g_reg.colo_num; i++)\n{\ncolo_t * pc = g_reg.clist + i;\nnc_t * pn = pc->nc_list;<br \/>\nwhile (pn)<br \/>\n{<br \/>\nvm_t * pv = pn->vmlist;<br \/>\nwhile (pv)<br \/>\n{<br \/>\nprintf (&#8220;%s %d %d => %s %s %d %d\\n&#8221;, pv->ip, pv->cpu, pv->mem, pc->name, pn->name,pn->cpu, pn->mem);<br \/>\npv = pv->next;<br \/>\n}<br \/>\npn = pn->next;<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u63d0\uff1a \u5df2\u7ecf\u77e5\u9053\u865a\u673a\u7684\u914d\u7f6e\u548c\u7269\u7406\u673a\u5269\u4f59\u7684\u8d44\u6e90\uff0c\u5206\u522b\u7528CPU\u6838\u6570\u548c\u5185\u5b58\u5927\u5c0f\uff08MB\uff09\u6765\u8868\u793a\uff0c\u6bd4\u5982VM\u7684\u914d\u7f6e\u6587\u4ef6\u4e3a\uff1a&hellip;&nbsp;<a href=\"http:\/\/cmesoft.com\/?p=367\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">\u865a\u673a\u8d44\u6e90\u5206\u914d\u65b9\u6cd5<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[13],"tags":[],"class_list":["post-367","post","type-post","status-publish","format-standard","hentry","category-cc"],"_links":{"self":[{"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/posts\/367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/cmesoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=367"}],"version-history":[{"count":5,"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/posts\/367\/revisions"}],"predecessor-version":[{"id":372,"href":"http:\/\/cmesoft.com\/index.php?rest_route=\/wp\/v2\/posts\/367\/revisions\/372"}],"wp:attachment":[{"href":"http:\/\/cmesoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/cmesoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=367"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/cmesoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}