⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 loadtest是根据数学上的均匀分布随机的生成CPU利用率的负载要求
💻 CPP
字号:
#include<stdio.h>#include<sys/time.h>#include<unistd.h>#include<stdlib.h>#include <fcntl.h>#include<signal.h>#include<sys/wait.h>#include<sys/types.h>#include<string.h>#include<memory.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include<string>using namespace std;#define MAXID 50#define MAXNAME 50#define MAXBUF 256#define SERVERIP "192.168.178.50"#define SERVERPORT 4567#include"IniFile.h"#include"libvirt.h"/* the data structure of time */  typedef struct timeInfo   {       long long cpu_time;       struct timeval real_time;   } timeInfoNode;typedef struct domainInfo{   int id;   char ip[16];   char domainname[MAXNAME];   int weight;   int cap;   int time;}domainInfoNode;domainInfoNode DomainInfo[MAXID];struct ClientParam{   int id;   int time;   int clientsock;};int ids[MAXID];   /* the hypervisor connection */  static virConnectPtr conn = NULL;void getTimeInfo(int id, timeInfoNode * infos){    virDomainPtr dom = NULL;       virDomainInfo info;       int ret;       /* Find the domain of the given id */      dom = virDomainLookupByID(conn, id);       if (dom == NULL)       {           fprintf(stderr, "Failed to find Domain %d\n", id);          // freeDom(dom);          // closeConn();         return ;      }       /* Get the information of the domain */      ret = virDomainGetInfo(dom, &info);       if (ret < 0)       {           fprintf(stderr, "Failed to get information for Domain %d\n", id);       //    freeDom(dom);       //    closeConn();       }         /* get the start of realTime*/      if (gettimeofday(&(infos->real_time), NULL) ==  - 1)       {           fprintf(stderr, "Failed to get start time\n");           return;       }       /* get the start of CPUTime*/      infos->cpu_time = info.cpuTime; /* nanosecond */    //  freeDom(dom); }double getDomainInfo(int id, timeInfoNode infos)   {       virDomainPtr dom = NULL;       virDomainInfo info;       int ret;       struct timeval realTime;       int cpu_diff, real_diff;       double usage;         /* Find the domain of the given id */      dom = virDomainLookupByID(conn, id);       if (dom == NULL)       {           fprintf(stderr, "Failed to find Domain %d\n", id);     //      freeDom(dom);       //    closeConn();             return 0;    }        /* Get the information of the domain */      ret = virDomainGetInfo(dom, &info);       if (ret < 0)       {           fprintf(stderr, "Failed to get information for Domain %d\n", id);        //   freeDom(dom);         //  closeConn();           return 0;     }       /* get the end of realTime*/      if (gettimeofday(&realTime, NULL) ==  - 1)       {           fprintf(stderr, "Failed to get start time\n");           return 0;       }       /* calculate the usage of cpu */      cpu_diff = (info.cpuTime - infos.cpu_time) / 1000;       real_diff = 1000000 *(realTime.tv_sec - infos.real_time.tv_sec) +            (realTime.tv_usec - infos.real_time.tv_usec);       usage = cpu_diff / (double)(real_diff);       /* print the results */     /* usage = usage*100/DomainInfo[id].cap*100;    if(usage>100)        usage = 100;    printf("usage=%.2lf\n",usage);*/     return usage*100;}  double GetCpurate(int id){  timeInfoNode * infos = new timeInfoNode;  //conn = virConnectOpenReadOnly(NULL);  getTimeInfo(id,infos);  printf("infos->cpu_time=%lld\n",infos->cpu_time);  sleep(1);  double usage = getDomainInfo(id,*infos);  return usage;}struct Log{  double cpurate;//cpu资源利用率  double alloccpu;//分配的CPU  double reallycpu;//实际用的cpu}#define MAXLOG 50struct ClientInfo{	pthread_t pid;	int domainid;        char ip[16];        int cnt;        Log log[MAXLOG]};ClientInfo clientinfo[MAXID];int  nparams;void GetDomainInfoin(int idCount){  int i,status;  int ret = fork();  if(ret==0)  {    freopen("domaininfo.tmp","w",stdout);    char * argv[ ]={"xm","sched-credit",(char*)0};    int rst = execv("/usr/sbin/xm",argv);    fclose(stdout);  }   wait(&status);   printf("已经输出\n");   i = 0;   int flag = 0;   freopen("domaininfo.tmp","r",stdin);   char buf[1000];   fgets(buf,sizeof(buf),stdin);   while(scanf("%s %d %d %d",DomainInfo[i].domainname,&DomainInfo[i].id,&DomainInfo[i].weight,&DomainInfo[i].cap)!=EOF)   {     i++;   }   fclose(stdin);   for(i = 0;i<idCount;i++)   {     printf("%s %d %d %d\n",DomainInfo[i].domainname,DomainInfo[i].id,DomainInfo[i].weight,DomainInfo[i].cap);   }  }int Domainnumber = 0;void Init(){   int i;  int status;  conn = virConnectOpenReadOnly(NULL);  if (conn == NULL)  {      fprintf(stderr, "Failed to connect to hypervisor\n");      return ;  }  int idCount = virConnectListDomains(conn, &ids[0], MAXID);     if (idCount < 0)     {           fprintf(stderr, "Failed to list the domains\n");          // closeConn();           return ;     }  printf("Domain Totals: %d\n", idCount);  printf("读取配置前的信息\n");  GetDomainInfoin(idCount);  IniFile Init;  Init.SetFile("InitDomain.ini");  int errLine;  bool sus = Init.load(errLine);  if(!sus)printf("读取配置文件失败\n");  Domainnumber = Init.ReadInteger("DomainInfo","Number");  char par1[10],par2[10],par3[10],buf[255];  int sum = 0;  string ip;  for(i = 0;i<idCount;i++)  {    sprintf(buf,"Domain%d",i);    DomainInfo[i].weight =  Init.ReadInteger(buf,"weight");    ip = Init.ReadString(buf,"ip");    strcpy(DomainInfo[i].ip,ip.c_str());    DomainInfo[i].time = Init.ReadInteger(buf,"time");    sprintf(par1,"%d", DomainInfo[i].id);    sprintf(par2,"%d",DomainInfo[i].weight);    int ret = fork();    if(ret==0)    {         char * argv[ ]={"xm","sched-credit","-d",par1,"-w",par2,(char*)0};         int rst = execv("/usr/sbin/xm",argv);    }    wait(&status);    sum +=DomainInfo[i].weight;  }  int cap = 100;  for(i = 0;i<idCount;i++)  {   if(i==idCount-1)   {     DomainInfo[i].cap =cap ;   }   else  {   DomainInfo[i].cap = (int)((DomainInfo[i].weight*100)/sum*1.0);   cap = cap - DomainInfo[i].cap;  }   sprintf(par1,"%d", DomainInfo[i].id);   sprintf(par2,"%d",DomainInfo[i].cap);   int ret = fork();    if(ret==0)     {          char * argv[ ]={"xm","sched-credit","-d",par1,"-c",par2,(char*)0};          int rst = execv("/usr/sbin/xm",argv);     }     wait(&status);  }  printf("设置完后的信息\n");  GetDomainInfoin(idCount);}#define CLIENTNUM 10int ssock,csock;struct sockaddr_in client_addr,server_addr;char buf[MAXBUF];int clientnum=0;ClientParam clientparam[MAXID];int GetdomainId(char* ip){   int id,i;   for(i = 0;i<Domainnumber;i++)   {      if(!strcmp(DomainInfo[i].ip,ip))             return i;   }   return -1;}void *clientmsg(void* param){  ClientParam* ptr =(ClientParam*)param;  char snd_buf[1024];  int time = ptr->time;  int id = ptr->id;  while(1)  {    memset(snd_buf,0,sizeof(snd_buf));    sprintf(snd_buf,"%s","workload");    printf("发送%s消息\n",snd_buf);    send(clientparam[id].clientsock,snd_buf,sizeof(snd_buf),0);    sleep(time);  //  printf("物理CPU利用率%.2lf",GetCpurate(10));  }}int GetIdbydomainid(int id){  int i;  for(i = 0;i<clientnum;i++)   {      if(clientinfo[i].domainid == id)          return i;   }   return -1;}void *checkcpurate(void* param){  int i;  int time;  int id;  ClientInfo clienttmpinfo[MAXID];  double cpurate[MAXID];  while(1)  {    sleep(time);    for(i = 0;i<idCount;i++)    {      cpurate[i] =GetCpurate(DomainInfo[i].id);      id = GetIdbydomainid(DomainInfo[i].id);      clientinfo[id].cnt++;      if(clientinfo[id].cnt==MAXID)      {         cnt--;              }      clientinfo[id].log[cnt-1].reallycpu = GetCpurate(DomainInfo[i].id);      clientinfo[id].log[cnt-1].alloccpu = clientinfo[id].log[cnt-1].alloccpu;      clientinfo[id].log[cnt].cpurate = clientinfo[id].log[cnt].reallycpu/clientinfo[id].log[cnt].alloccpu;    }  }}int main(){  Init();  if((ssock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)  {    perror("socket error:");    exit(1);  }  socklen_t clen = sizeof(client_addr);  memset(&server_addr,0,sizeof(server_addr));  server_addr.sin_family     =AF_INET;  server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  server_addr.sin_port=htons(SERVERPORT);  if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)  {   perror("bind error");   exit(1);  }  if(listen(ssock,10)<0)  {    perror("listen error:");    exit(1);  }  sockaddr_in addr;   int ret;  socklen_t  len = sizeof(addr);  printf("服务器%s启动......\n",SERVERIP);  memset(&clientinfo,0,sizeof(clientinfo));  while(csock=accept(ssock,(struct sockaddr *)&client_addr,&clen))  {    clientparam[clientnum].clientsock=csock;   // getsockname(ssock,(struct sockaddr *)&addr ,&len);     sprintf(clientinfo[clientnum].ip,"%s",inet_ntoa(client_addr.sin_addr));    printf("来自%s的连接\n",clientinfo[clientnum].ip);    clientinfo[clientnum].domainid = GetdomainId(clientinfo[clientnum].ip);    clientinfo[clientnum].log[0].alloccpu = DomainInfo[clientinfo[clientnum].domainid].cap*1.0;    clientparam[clientnum].id = clientnum;    clientparam[clientnum].time = DomainInfo[clientinfo[clientnum].domainid].time;    printf("time=%d\n",clientparam[clientnum].time);    ret = pthread_create(&clientinfo[clientnum].pid, NULL, clientmsg, &clientparam[clientnum]);    if(ret<0)      printf("创建线程失败\n");    else     printf("线程创建成功\n");    clientnum++;  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -