linux之cpu模拟负载程序

news2024/12/23 10:12:39

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

思想

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

占用固定cpu占有率的程序

#include <iostream>
#include <pthread.h>
#include <time.h>
#include <math.h>
#include <unistd.h>

using namespace std;

typedef long long int int64;
const int NUM_THREADS = 8; //CPU core nums
int INTERVAL = 100;
int cpuinfo = 70; //CPU utilization rate

// time unit is "ms"
int64 GetTickCount()
{
    timespec now;
    int64 sec, nsec;

    clock_gettime(CLOCK_MONOTONIC, &now);
    sec = now.tv_sec;
    nsec = now.tv_nsec;

    return sec * 1000 + nsec / 1000000;
}

void* CPUCost(void *args)
{
    int busyTime = INTERVAL * cpuinfo / 100;
    int idleTime = INTERVAL - busyTime;
    int64 startTime = 0;

    std::cout << "XXXX CPUCost" << std::endl;
    std::cout << "XXXX cpuinfo = " << cpuinfo << std::endl;

    /*
     * within INTERVAL ms, INTERVAL = busyTime + idleTime,
     * spend busyTime ms to let cpu busy,
     * spend idleTime ms top let cpu idle
     */
    while (true) {
        startTime = GetTickCount();
        while((GetTickCount() - startTime) <= busyTime);
        usleep(idleTime * 1000);
    }
}

int main(int argc, char **argv)
{
    pthread_t t[NUM_THREADS];
    int ret;

    std::cout << "please input cpu utilization rate" << std::endl;
    std::cin >> cpuinfo;
    for(int i = 0; i < NUM_THREADS; i++) {
        ret = pthread_create(&t[i], NULL, CPUCost, NULL);
        if(ret)
            std::cout << "XXXX create err" << std::endl;
        std::cout<<"pthread_create i= "<<i<<std::endl;
    }

    pthread_exit(NULL);
    return 0;
}

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

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

注意事项:

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

运行结果如下所示:

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

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

代码如下所示:

#include <iostream>
#include <pthread.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
#include <math.h>

using namespace std;

#define PI acos(-1)
#define DISCRETEVALUE 100
typedef long long int int64;
const int NUM_THREADS = 8; //CPU core nums
int INTERVAL = 100;
int cpuinfo = 70; //CPU utilization rate

// time unit is "ms"
int64 GetTickCount()
{
    timespec now;
    int64 sec, nsec;

    clock_gettime(CLOCK_MONOTONIC, &now);
    sec = now.tv_sec;
    nsec = now.tv_nsec;

    return sec * 1000 + nsec / 1000000;
}

void* CPUCost(void *args)
{
//    int busyTime = INTERVAL * cpuinfo / 100;
//    int idleTime = INTERVAL - busyTime;
//    int64 startTime = 0;
    int busyTime = 50;
    int idleTime = 50;
    int64 startTime = 0;
    //每次递增间隔
    float value = 2*PI/DISCRETEVALUE;
    int index = 0;

    cout<<"value = "<<value <<" PI = "<<sin(PI)<<endl;
    std::cout << "XXXX CPUCost" << std::endl;
    std::cout << "XXXX cpuinfo = " << cpuinfo << std::endl;

    /*
     * within INTERVAL ms, INTERVAL = busyTime + idleTime,
     * spend busyTime ms to let cpu busy,
     * spend idleTime ms top let cpu idle
     */
    while (true) {
        startTime = GetTickCount();
        while((GetTickCount() - startTime) <= busyTime);
        usleep(idleTime * 1000);
        //添加正弦曲线,
        if(index > DISCRETEVALUE)
            index = 0;
        busyTime = 50 + sin(index*value)*50;
        idleTime = 100 - busyTime;
        cout<<"busyTime = "<<busyTime<<"  idleTime = "<<idleTime << "index*value = "<< index*value<<"  sin(index*value)*50 = "<<sin(index*value)*50<<endl;
        index++;
    }
}

int main(int argc, char **argv)
{
    pthread_t t[NUM_THREADS];
    int ret;

    std::cout << "please input cpu utilization rate" << std::endl;
    std::cin >> cpuinfo;

    for(int i = 0; i < NUM_THREADS; i++) {
        ret = pthread_create(&t[i], NULL, CPUCost, NULL);
        if(ret)
            std::cout << "XXXX create err" << std::endl;
        std::cout<<"pthread_create i= "<<i<<std::endl;
    }

    pthread_exit(NULL);
    return 0;
}

结果显示

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现制造业信息化转型?

一、制造业信息化历史 &#xff08;1&#xff09;1930年代 库存控制、管理 当时计算机系统尚未出现&#xff0c;人们为了解决库存管控的难题&#xff0c;提出了订货点法——当库存量降低到某一预先设定的点时&#xff0c;即开始发出订货单补充库存&#xff0c;直至库存量降低…

git删除文件

qt中点击删除文件后&#xff0c;不要从git版本控制中删除此文件 git rm test.txt 然后git add&#xff0c;git commit-m""

PLSQL下载并安装

官方下载连接&#xff1a;https://www.allroundautomations.com/registered-plsqldev/ 我们这边下载12.0.7版本 别忘了一起下载中文安装包 下载完全部安装一下 产品编号Product Code: kfj6yg6rfyhqcha6cbgs6fsw3kyje7a6qr 序列号Serial Number: 276182 口令Password: xs374c…

Linux简单磁盘命令

查看磁盘总站用量&#xff1a;df -h 查看当前目录的子目录磁盘占用情况: du -sh ./*

【高等数学】极限(下)(最全万字详解)

文章目录 极限(上)超链接5、极限存在法则5.1、夹逼准则5.1.1、数列夹逼准则5.1.2、函数夹逼准则5.1.3、第一重要极限 5.2、单调有界准则5.2.1、第二重要极限 6、函数的连续性与间断点6.1、函数的连续性6.1.1、定义6.1.2、左连续右连续 6.2、函数的间断点6.2.1、第一类间断点6.2…

炒股杠杆加杠杆安全|股票杠杆的安全玩法是怎样?

炒股杠杆和股票杠杆是一种高风险高收益的投资方式&#xff0c;需要在了解风险和做好风险管理的前提下进行。下面将介绍一些股票杠杆的安全玩法&#xff0c;帮助你更好地理解这种投资方式。 1. 了解自己的风险承受能力 在投资前&#xff0c;你需要了解自己的风险承受能力&…

云贝教育 |【DSI】Oracle数据库系列课-葵花宝典技术内幕实战课程

云贝教育DSI系列课&#xff1a; Oracle数据库深入浅出 零基础课程【DSI系列Ⅰ】 Oracle数据库特殊恢复原理与实战【DSI系列Ⅱ】 Oracle数据库 SQL Tuning【DSI系列Ⅲ】 Oracle数据库 DB Performance Tuning【DSI系Ⅳ】 DSI的意义 DSI课程是基于Oracle DSI403e和BBED工具修…

JUC并发工具类在大厂的应用场景详解

jdk提供了比synchronized更加高级的各种同步工具&#xff0c;包括 ReentrantLock 、 Semaphore 、 CountDownLatch 、 CyclicBarrier等&#xff0c;可以实现更加丰富的多线程操作。 (前三个是重点) 一. ReentrantLock ReentrantLock是一种可重入的独占锁&#xff0c;它允许同一…

spark集群环境下,实现人口平均年龄计算

文章目录 任务目标0. 版本信息1. 计算生成renkou.txt2. 文件上传至spark3. 上传文件时&#xff0c;可能出现的常见错误4. 编写spark文件5. 上传集群6. 集群环境下提交任务 任务目标 在虚拟机上部署spark集群&#xff0c;给定renkou.txt文件&#xff0c;输出平均年龄 renkou.t…

淘宝天猫商品评论数据接口,淘宝天猫商品评论API接口,淘宝API

淘宝商品评论数据接口可以通过淘宝开放平台API获取。 通过构建合理的请求URL&#xff0c;可以向淘宝服务器发起HTTP请求&#xff0c;获取商品评论数据。接口返回的数据一般为JSON格式&#xff0c;包含了商品的各种评价信息。获取到商品评论数据后&#xff0c;可以对其进行处理…

京东商品评论数据接口,京东API接口

京东商品评论内容数据接口步骤如下&#xff1a; 访问京东开放平台并注册一个开发者账号。创建一个应用并获取到API的权限。在开发者的控制台中找到API的使用文档。在文档中找到获取商品评论的API接口&#xff0c;点击获取key和secret。构造请求URL&#xff0c;请求URL的路径为…

SAP-MM/QM 移动原因维护

业务场景&#xff1a; 质检反馈现有的几种退货原因不能满足业务需求&#xff0c;需要增加&#xff0c;那么启用质检的退货原因和未启用质检的退货原因分别在哪里维护呢&#xff1f; 经过查找&#xff0c;退货原因不是按模块区分的&#xff0c;而是按移动类型确定的&#xff0c…

CRM系统:客户培育提高业绩的方法

多数情况下客户线索不会在首次沟通后就表现出强烈购买的意愿&#xff0c;这期间需要经过不断地沟通和培育才能进入到产品购买阶段。CRM客户管理系统帮助销售挖掘价值客户、高效跟进客户直至成交。下面说说&#xff0c;CRM系统如何客户培育提高业绩。 一、筛选潜在客户 企业客…

xcode打包macos报错:FlutterInputs.xcfilelist 和 FlutterOutputs.xcfilelist

xcode 打包macos的时候&#xff0c;报错如下&#xff1a; Unable to load contents of the file list: ‘macos/ephemeral/FlutterInputs.xcfilelist’ ‘macos/ephemeral/FlutterOutputs.xcfilelist’ 解决方案&#xff1a; 我的项目macos下没有找到FlutterInputs.xcfilelis…

[计算机入门] 应用软件介绍(娱乐类)

3.21 应用软件介绍(娱乐类) 3.21.1 音乐&#xff1a;酷狗 音乐软件是一类可以帮助人们播放、管理和发现音乐的应用程序。它们提供了丰富的音乐内容&#xff0c;用户可以通过搜索、分类浏览或个性化推荐等方式找到自己喜欢的歌曲、专辑或艺术家。音乐软件还通常支持创建和管理…

【LeetCode高频SQL50题-基础版】打卡第4天:第21~25题

文章目录 【LeetCode高频SQL50题-基础版】打卡第四天&#xff1a;第21~25题⛅前言即时食物配送II&#x1f512;题目&#x1f511;题解 游戏玩法分析IV&#x1f512;题目&#x1f511;题解 每位教师所教授的科目种类的数量&#x1f512;题目&#x1f511;题解 查询近30天活跃用户…

Adobe发布Firefly 2,提升图像质量和用户体验

&#x1f989; AI新闻 &#x1f680; Adobe发布Firefly 2&#xff0c;提升图像质量和用户体验 摘要&#xff1a;Adobe升级了其AIGC生图平台Firefly为Firefly 2&#xff0c;该版本通过引入矢量图生成功能、提升图像质量和增加多项新功能&#xff0c;大幅改善了用户体验。Firef…

用3-8译码器实现全减器

描述 请使用3-8译码器和必要的逻辑门实现全减器&#xff0c;全减器接口图如下&#xff0c;A是被减数&#xff0c;B是减数&#xff0c;Ci是来自低位的借位&#xff0c;D是差&#xff0c;Co是向高位的借位。 3-8译码器代码如下&#xff0c;可将参考代码添加并例化到本题答案中。 …

Spring 1.依赖 2.xml 3.对象 4.测试

配置模型 依赖注入 很简单 框架很简单 依赖 xml 对象 测试 依赖 写在pom mvn网址找spring 2.写类 就是对象 测试 我们获取对象&#xff08;spring创建&#xff09; 才能用 配置文件 官网找 下拉 粘贴标红 点击它告诉系统是一个 然后第二次就点加入不是新创建

虹科干货 | 虹科带你了解车载以太网-SOME/IP协议

在标准的网络七层架构中&#xff0c;SOME/IP&#xff08;Scalable service-Oriented Middleware over IP) 作为应用层协议运行于车载以太网四层以上&#xff0c;作为以太网通信中间件来实现应用层和IP层的数据交互&#xff0c;使其不依赖于操作系统&#xff0c;又能兼容AUTOSAR…