• linux之cpu模拟负载程序


    工作中我们经常会遇到这样的问题,需要模拟cpu的负载程序,例如模拟cpu占有率抬升10%、20%、50%、70%等,那这样的程序应该如何实现呢?它的原理是什么样的呢?

    思想

    创建一个应用程序,该应用程序的作用可以根据用户的设置占用指定的cpu占有率。例如用户指定占用10%,则该应用程序占用cpu占有率为10%;若设置cpu占有率为50%,则应用程序程序的cpu占有率为50%。

    占用固定cpu占有率的程序

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. typedef long long int int64;
    8. const int NUM_THREADS = 8; //CPU core nums
    9. int INTERVAL = 100;
    10. int cpuinfo = 70; //CPU utilization rate
    11. // time unit is "ms"
    12. int64 GetTickCount()
    13. {
    14. timespec now;
    15. int64 sec, nsec;
    16. clock_gettime(CLOCK_MONOTONIC, &now);
    17. sec = now.tv_sec;
    18. nsec = now.tv_nsec;
    19. return sec * 1000 + nsec / 1000000;
    20. }
    21. void* CPUCost(void *args)
    22. {
    23. int busyTime = INTERVAL * cpuinfo / 100;
    24. int idleTime = INTERVAL - busyTime;
    25. int64 startTime = 0;
    26. std::cout << "XXXX CPUCost" << std::endl;
    27. std::cout << "XXXX cpuinfo = " << cpuinfo << std::endl;
    28. /*
    29. * within INTERVAL ms, INTERVAL = busyTime + idleTime,
    30. * spend busyTime ms to let cpu busy,
    31. * spend idleTime ms top let cpu idle
    32. */
    33. while (true) {
    34. startTime = GetTickCount();
    35. while((GetTickCount() - startTime) <= busyTime);
    36. usleep(idleTime * 1000);
    37. }
    38. }
    39. int main(int argc, char **argv)
    40. {
    41. pthread_t t[NUM_THREADS];
    42. int ret;
    43. std::cout << "please input cpu utilization rate" << std::endl;
    44. std::cin >> cpuinfo;
    45. for(int i = 0; i < NUM_THREADS; i++) {
    46. ret = pthread_create(&t[i], NULL, CPUCost, NULL);
    47. if(ret)
    48. std::cout << "XXXX create err" << std::endl;
    49. std::cout<<"pthread_create i= "<
    50. }
    51. pthread_exit(NULL);
    52. return 0;
    53. }

    上文代码中NUM_THREADS变量的含义是cpu有几个核,该变量修改为cpu的核数;INTERVAL值默认为100,无需修改;cpuinfo,全局变量,用于保存应用程序占用的cpu占有率;GetTickCount函数的作用是获取毫秒时间;CPUCost函数是线程函数,核心逻辑:

    1. /*
    2. * within INTERVAL ms, INTERVAL = busyTime + idleTime,
    3. * spend busyTime ms to let cpu busy,
    4. * spend idleTime ms top let cpu idle
    5. */
    6. while (true)
    7. {
    8. startTime = GetTickCount(); //获取一个开始时间,单位为ms
    9. //busyTime和idleTime的总和为100ms,即在100ms的时间间隔内,程序运行时间为//busyTime,程序空闲时间为idleTime,通过这样的方式来控制cpu占用率,如下的是循环是控制程序运行busyTime时间
    10. while((GetTickCount() - startTime) <= busyTime);
    11. //usleep控制程序睡眠idleTime时间,让出cpu
    12. usleep(idleTime * 1000);
    13. }

    注意事项:

    由于我的环境cpu有8个核,若指定cpu占有率的为70%,则每个核的cpu占有率为70%,总的cpu占有率为70%,所有的cpu核占有率综合为560%左右(70%*8)。

    运行结果如下所示:

    可以看到cpu各个核的cpu占有率均在70%以上,综合的cpu占有率也是79%,各个核的cpu占有率总计为520.9基本与预期相符,达到预期目的。

    cpu占有率动态变化程序(按照正弦函数规律控制cpu占有率)

    代码如下所示:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. #define PI acos(-1)
    9. #define DISCRETEVALUE 100
    10. typedef long long int int64;
    11. const int NUM_THREADS = 8; //CPU core nums
    12. int INTERVAL = 100;
    13. int cpuinfo = 70; //CPU utilization rate
    14. // time unit is "ms"
    15. int64 GetTickCount()
    16. {
    17. timespec now;
    18. int64 sec, nsec;
    19. clock_gettime(CLOCK_MONOTONIC, &now);
    20. sec = now.tv_sec;
    21. nsec = now.tv_nsec;
    22. return sec * 1000 + nsec / 1000000;
    23. }
    24. void* CPUCost(void *args)
    25. {
    26. // int busyTime = INTERVAL * cpuinfo / 100;
    27. // int idleTime = INTERVAL - busyTime;
    28. // int64 startTime = 0;
    29. int busyTime = 50;
    30. int idleTime = 50;
    31. int64 startTime = 0;
    32. //每次递增间隔
    33. float value = 2*PI/DISCRETEVALUE;
    34. int index = 0;
    35. cout<<"value = "<" PI = "<<sin(PI)<
    36. std::cout << "XXXX CPUCost" << std::endl;
    37. std::cout << "XXXX cpuinfo = " << cpuinfo << std::endl;
    38. /*
    39. * within INTERVAL ms, INTERVAL = busyTime + idleTime,
    40. * spend busyTime ms to let cpu busy,
    41. * spend idleTime ms top let cpu idle
    42. */
    43. while (true) {
    44. startTime = GetTickCount();
    45. while((GetTickCount() - startTime) <= busyTime);
    46. usleep(idleTime * 1000);
    47. //添加正弦曲线,
    48. if(index > DISCRETEVALUE)
    49. index = 0;
    50. busyTime = 50 + sin(index*value)*50;
    51. idleTime = 100 - busyTime;
    52. cout<<"busyTime = "<" idleTime = "<"index*value = "<< index*value<<" sin(index*value)*50 = "<<sin(index*value)*50<
    53. index++;
    54. }
    55. }
    56. int main(int argc, char **argv)
    57. {
    58. pthread_t t[NUM_THREADS];
    59. int ret;
    60. std::cout << "please input cpu utilization rate" << std::endl;
    61. std::cin >> cpuinfo;
    62. for(int i = 0; i < NUM_THREADS; i++) {
    63. ret = pthread_create(&t[i], NULL, CPUCost, NULL);
    64. if(ret)
    65. std::cout << "XXXX create err" << std::endl;
    66. std::cout<<"pthread_create i= "<
    67. }
    68. pthread_exit(NULL);
    69. return 0;
    70. }

    结果显示

     完美实现cpu占有率动态控制。

    总结

    核心思想是在100ms内动态的分配应用程序运行时间和空闲时间的比例,从而实现达到控制cpu占有率的目的。

  • 相关阅读:
    Qt自定义日志输出
    【HarmonyOS】元服务服务卡片网络开发
    编写 GPT 提示词的公式 + 资源分享
    AMD AFMF不但能用在游戏,也适用于视频
    MyBatis自定义映射resultMap,处理一对多,多对一
    @Valid注解的作用及@Valid注解与@Validated的区别
    数字信号处理——线性相位型(Ⅰ、Ⅲ型)FIR滤波器设计(1)
    图之最小生成树Prim算法详解(C语言版)
    元宇宙|世界人工智能大会之元宇宙论坛:设计篇
    MindSpore——详解推荐模型的原理与实践
  • 原文地址:https://blog.csdn.net/iqanchao/article/details/133770813