Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219695
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: C/C++

2015-04-29 13:51:45

很多公司都会对机器资源做监控,长期闲置的机器需要回收,再合理分配,提升资源的利用率,从公司层面讲无可厚非。
但存在一个问题,资源还回去之后,很多时候再申请就难,所以很多时候为了留住资源,就需要制造一种虚假繁荣,那就是让机器的CPU一直处于高利用率。

解决这个问题的思路是控制CPU的忙闲时间比例。

下面的代码实现在一台比较空闲的机器上,如何控制CPU的利用率。

  1. /*
  2.  * @file   : kcpu.c
  3.  * @author : sunnyChan
  4.  * @date   : 2015/03/23
  5.  * */

  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include <time.h>
  11. #include <string.h>
  12. #include <sys/time.h>

  13. /* 设置一个统计的时间跨度 */
  14. /* 如果CPU统计工具统计每秒的CPU使用率,INTERVAL 最好设置为1000ms */
  15. #define INTERVAL 100

  16. double get_time();
  17. void print_usage();

  18. double get_time()
  19. {
  20.     struct timeval tv;
  21.     gettimeofday(&tv, NULL);
  22.     return (tv.tv_sec * 1000 + tv.tv_usec * 1.0 / 1000); /* ms */
  23. }

  24. void print_usage()
  25. {
  26.     printf("usage : kcpu -r 50 \n");
  27.     printf("options : \n");
  28.     printf(" -r specify cpu usage rate.\n");
  29.     printf("\n");
  30. }

  31. int main(int argc, char *argv[])
  32. {
  33.     /* 解析和校验参数 */
  34.     if (argc != 3) {
  35.         printf("error : parameters error.\n");
  36.         print_usage();
  37.         exit(1);
  38.     }

  39.     int cpu_rate = 0; /* CPU 使用率 */
  40.     if (strcmp(argv[1], "-r") == 0) {
  41.         cpu_rate = atoi(argv[2]);
  42.         if ((cpu_rate <= 0) || (cpu_rate > 100)) {
  43.             printf("error : specify cpu usage rate error.\n");
  44.             exit(1);
  45.         }
  46.     } else {
  47.         printf("error : parameters error.\n");
  48.         print_usage();
  49.         exit(1);
  50.     }

  51.     /* 根据设置的CPU使用率 计算CPU被占用时间 和 CPU空闲时间 */
  52.     double busy_span = INTERVAL * cpu_rate / 100;
  53.     double idle_span = INTERVAL * (100 - cpu_rate) / 100;

  54.     double start_time; /* 每次统计时段的开始时间,Unix 时间戳,单位ms */

  55.     while (1) {
  56.         /* 获取当前Unix 时间戳,计算到ms */
  57.         start_time = get_time();
  58.         /* 接下来的 busy_span 长的时间使CPU处于忙碌 */
  59.         while ((get_time() - start_time) <= busy_span);
  60.         /* 接下来的 idle_span 长的时间使CPU处于空闲 */
  61.         usleep(idle_span * 1000);
  62.     }
  63.     return 0;
  64. }
现在的服务器大多是SMP(多CPU)架构,这种情况下可以将上述程序改成多线程并发,当然线程个数要等于CPU的线程数,另外也可以Shell 运行多个进程来实现。
  1. #!/bin/bash

  2. # 设置CPU使用率
  3. CPU_RATE="70"
  4. # 由kcpu.c编译后的二进制文件名
  5. BIN_NAME="kcpu"

  6. # 根据CPU的数目,启动相应个数的工具进程
  7. function start_kcpu()
  8. {
  9.     #获取当前机器上的CPU线程数
  10.     cpu_count=$(grep -c "processor" /proc/cpuinfo)
  11.     #根据CPU线程数,启动相应的进程数
  12.     for ((i=0;i<${cpu_count};i++))
  13.     do
  14.         ( ./kcpu -r ${CPU_RATE} & )
  15.     done
  16.     echo "Done!"
  17. }

  18. while [ $# -gt 0 ]
  19. do
  20.     case "X$1" in
  21.         Xstart)
  22.             start_kcpu
  23.             ;;
  24.         Xstop)
  25.             ps -u ${USER} | grep "${BIN_NAME}" | awk '{print "kill -KILL "$1}' |sh
  26.             ;;
  27.         *)
  28.             echo "Error : parameters error"
  29.             echo "Usage : sh run_kcpu.sh [start|stop]"
  30.             exit 1
  31.             ;;
  32.     esac    
  33.     shift 1
  34. done
以上程序需要在空闲的机器上运行,才能比较精确地获取到设置的CPU利用率。

如果机器上有其他CPU消耗型的进程在运行,CPU实际的利用率会比设定的值要高。
这种情况下如果想要精确的控制CPU的使用率很难,因为很难知道其它进程接下来的一个统计时段里将怎样使用CPU。
一种比较接近的思路是参考过去一段时间内CPU的利用情况,当然这种处理方式下误差肯定是存在的。
阅读(3169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~