CPU告警不用愁,用C语言编写CPU使用率限制程序

现在云服务已经深入千家万户了,不仅商用,私用也很多。很多云服务厂商也都有配套的服务器安全模块,可以检测网络流量异常、内存占用量和CPU占用率,并且允许人工设置告警阈值。例如,CPU持续大于90%10分钟,那么你可能就会收到一条告警通知。

有时,或许这样的告警是因为一些恶意行为或者bug导致。但是有时,我们希望我们编写的程序能够尽可能压榨性能去尽快处理一些工作,此时CPU占满或许是一个很正常的行为。可如此就会触发告警,加之一些同道告警强迫症发作,此时就会很为难。如果增加一些sleep操作,莫名其妙的睡眠似乎总是不够优雅与完美。
在这里插入图片描述那么,有没有什么好的解决方案呢?

今天码哥就给大家提供一种解决方案。
在这里插入图片描述
或许有些人听过用过docker,docker容器就是可以做到资源隔离与资源配额的。似乎是我们想要的,那么是否可以借鉴一下呢?

答案是肯定的。

很多时候,我们的程序只是一次性的任务,且有些任务还依赖一些框架,如果将这种任务装入docker容器运行,显然成本和收益的问题让我们内心不太通达。

在Linux中,这样的资源配额限制是通过cgroups来实现的,它能够限制CPU、内存、IO等资源的使用程度。当然cgroups还有一些其他的使用功能,这里就不额外延展啦。

为了应对上面的那种资源限制需求,码哥展示一个用C语言编写的启动程序,帮你轻松解决这类问题。
在这里插入图片描述
限于篇幅,我们只展示CPU限制的方式,内存和IO相关的限制方法与其类似,可参阅网上一些人的文章自行扩展。

下面直接上代码(受限于手机屏幕尺寸,建议大家PC端查看):

/** Author: 码哥比特*/
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mount.h>
#include <sched.h>
#include <errno.h>
#include <string.h>
#include <dirent.h> 
#include <stdlib.h>
#include <sys/stat.h>char *cpu = NULL;
char *group_name = NULL;
char cpu_basedir[256];
int deleted = 0;static void print_help(char *name)
{printf("Usage:\n");printf("%s [OPTIONS] SHELL COMMAND\n", name);printf("\t-c\t\tset cpu rate\n");printf("\t-g\t\tgroup name\n");printf("\t-d\t\tdelete group\n");
}static int parse_args(int argc, char *argv[])
{//...掠过一些参数解析部分
}static void set_limit(void)
{int fd, n, pid = getpid();char tmp[1024];if (cpu != NULL) {if (mkdir(cpu_basedir, S_IRWXU) < 0) {if (errno != EEXIST) {fprintf(stderr, "create cpu group failed");exit(1);}}memset(tmp, 0, sizeof(tmp));snprintf(tmp, sizeof(tmp)-1, "%s/cpu.cfs_quota_us", cpu_basedir);if ((fd = open(tmp, O_WRONLY)) < 0) {fprintf(stderr, "open cpu file failed. %s\n", strerror(errno));exit(1);}memset(tmp, 0, sizeof(tmp));n = snprintf(tmp, sizeof(tmp)-1, "%s\n", cpu);write(fd, tmp, n);close(fd);memset(tmp, 0, sizeof(tmp));snprintf(tmp, sizeof(tmp)-1, "%s/tasks", cpu_basedir);if ((fd = open(tmp, O_WRONLY|O_APPEND)) < 0) {fprintf(stderr, "open cpu tasks failed. %s\n", strerror(errno));exit(1);}memset(tmp, 0, sizeof(tmp));n = snprintf(tmp, sizeof(tmp)-1, "%d\n", pid);write(fd, tmp, n);close(fd);}
}int main(int argc, char *argv[])
{int idx = parse_args(argc, argv);if (group_name == NULL) {fprintf(stderr, "group name must be given\n");print_help(argv[0]);exit(1);}memset(cpu_basedir, 0, sizeof(cpu_basedir));snprintf(cpu_basedir, sizeof(cpu_basedir)-1, "/sys/fs/cgroup/cpu/%s", group_name);if (deleted) {remove(cpu_basedir);}if (idx) {set_limit();execv(argv[idx], argv+idx);}return 0;
}

为了节省篇幅,代码中略过了一些参数解析部分。从帮助信息中,我们也可大致看到程序的使用方式。

# ./cpuctl -c=89000 -g=test_group a.out  #姑且先叫cpuctl吧

这里,-g是用来设置资源组名的,避免和其他资源组冲突。-c是这个资源组下的所有进程CPU占用总和的上限数值,89000是89%的含义。这里要注意,如果你有两个进程在这个资源组下,那么两个进程是平分89%的,也就是每个进程44.5%。a.out则是我们要执行的程序。

我们用一个简单的死循环来测试一下:

#include <stdio.h>int main(void)
{while (1) {}return 0;
}

正常情况下100%无疑,如图:
在这里插入图片描述
下面我们用我们的程序启动器来启动a.out并限制其CPU为89%,如图:
在这里插入图片描述
我们可以看到,其CPU占比会在89%上下小幅浮动,大家可自行尝试。

从代码中,我们可以看到,其实限制的方法是在/sys/fs/cgroup/cpu下建立一个test_group目录,然后向其内的cfs_quota_us文件写入限制额度,再向其内的tasks写入希望限制的进程ID。目前从码哥的使用情况来看,阿里和腾讯的cgroups配置都是在/sys/fs/cgroup中的,可能其他的操作系统有不同的路径。

喜欢的朋友可以关注码哥,也可以在评论区给码哥留言交流,谢谢观看!

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

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

相关文章

华为机试真题实战应用【赛题代码篇】-选修课(附Java、C++和python代码)

目录 题目描述 思路解析 代码实现 Java JS C++ 代码2 python

ESU毅速丨制造企业需不需要建设增材制造中心?

随着科技的不断发展&#xff0c;增材制造技术已经成为制造行业的新宠。越来越多的企业开始考虑建设增材制造中心&#xff0c;以提高生产效率、降低成本、加速产品创新。但是&#xff0c;对于制造企业来说&#xff0c;是否需要建设增材制造中心呢&#xff1f; 首先&#xff0c;我…

SpringCloud全链路灰度发布

日升时奋斗&#xff0c;日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架&#xff1a; 灰度发布的具体实现…

GEE机器学习——利用最短距离方法进行土地分类和精度评定

最短距离方法 最短距离方法(Minimum Distance)是一种常用的模式识别算法,用于计算样本之间的相似度或距离。该方法通过计算样本之间的欧氏距离或其他距离度量,来确定样本之间的相似程度或差异程度。 最短距离方法的具体步骤如下: 1. 数据准备:收集并准备用于训练的数据…

golang学习-函数

1、匿名函数 没有函数名的函数&#xff0c;格式如下&#xff1a; func(参数)返回值{ 函数体 } func main() {//将匿名函数保存到变量中sum : func(x, y int) int {return x y}fmt.Println(sum(10, 20)) //通过变量调用匿名函数//自执行函数:匿名函数定义完加()直接执行fu…

Java中的继承、方法覆盖和多态

一、继承 关于java语言当中的继承&#xff1a; 1.继承是面向对象三大特征之一&#xff0c;三大特征分别是&#xff1a;封装、继承、多态 2.继承最”基本“的作用是&#xff1a;代码复用。但是继承最”重要“的作用是&#xff1a;有了 继承才有了以后”方法的覆盖“和”多态机制…

利用Monte Carlo进行数值积分(二)

进步空间很大的算法版本 话说去年6月的一个周六&#xff0c;我很无聊地发了一个帖子&#xff0c;写了一个自己感觉有点无聊的帖子。 Matlab多重积分的两种实现【从六重积分到一百重积分】https://withstand.blog.csdn.net/article/details/127564478 这个帖子居然成了我这种懒…

springboot整合 hibernate详解

springboot整合 hibernate详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入研究Spring Boot与Hibernate整合的技术&#xff0c;解析其…

实现数字的千分位,表示,

重点如下 区分是否是负数区分是否有小数点使用正则表达式\B 是指非单词边界? 是正向查找?! 是负向查找 代表有一个或者多个() 是分组g 代表全局匹配 function splitStr(num) {// 转化成字符串let numStr ${num}let isNegative falseif (numStr.startsWith(-)) {isNegativ…

求解建公路问题

课程设计题目 求解建公路问题 课程设计目的 深入掌握 Prim 和 Kruskal算法在求解实际问题中的应用 问题描述 假设有 n 个村庄,编号从到,现在修建一些道路使任意两个村庄之间可以互相连通。所谓两个村庄 A 和B是连通的,指当且仅当A 和 B之间有一条道路或者存在一个村庄 C 使得…

QT通过QPdfWriter类实现pdf文件生成与输出

一.QPdfWriter类介绍 本文代码工程下载地址&#xff1a; https://download.csdn.net/download/xieliru/88736664?spm1001.2014.3001.5503 QPdfWrite是一个用于创建PDF文件的类&#xff0c;它是Qt库的一部分。它提供了一些方法和功能&#xff0c;使您能够创建和写入PDF文件。…

#Prompt##提示词工程##AIGC##LLM#使用大型预训练语言模型的关键考量

如果有不清楚的地方可以评论区留言&#xff0c;我会给大家补上的&#xff01; 本文包括&#xff1a; Prompt 的一些行业术语介绍 Prompt 写好提示词的方法经验介绍&#xff08;附示例教程&#xff09; LLM自身存在的问题&#xff08;可以用Prompt解决的以及无法用Prompt解决的&…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

动态规划篇-00:解题思想与框架

引言 这篇文章是我的第一个专栏的第一篇文章。 在这篇文章中&#xff0c;我将总结我对于动态规划的认识与解题框架。这些思想和框架将会在后面的习题中反复出现。 解题思想 对于所有的算法题来说&#xff0c;本质上都是“穷举”——列出所有的结果&#xff0c;然后选择最优…

数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)

今天跟大伙分享下关于数组中差值的最大值&#xff08;寻找一个数组中左侧最大值与右侧最小值的差值&#xff09;的计算思路的算法题&#xff0c;解决方案有许多&#xff0c;这里简单进行抛砖引玉。 题目一&#xff1a; 数组中差值的最大值&#xff08;寻找一个数组中左侧最大值…

javascript编程求三个数中最大的数

使用javascript编程求输入的三个数中最大数&#xff0c;并在页面打印出来 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>…

DrissionPage获取浏览器Network数据包

DrissionPage是什么&#xff1f; GitHub - g1879/DrissionPage: 基于python的网页自动化工具。既能控制浏览器&#xff0c;也能收发数据包。可兼顾浏览器自动化的便利性和requests的高效率。功能强大&#xff0c;内置无数人性化设计和便捷功能。语法简洁而优雅&#xff0c;代码…

深度学习基本介绍-李沐

目录 AI分类&#xff1a;模型分类&#xff1a;广告案例&#xff1a; bilibili视频链接&#xff1a;https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类&#xff1a; 模型分类&#xff1a; 图…

【每日一题】删除排序链表中的重复元素

文章目录 Tag题目来源解题思路方法一&#xff1a;比较相邻两节点 写在最后 Tag 【遍历】【链表】【2024-01-14】 题目来源 83. 删除排序链表中的重复元素 解题思路 方法一&#xff1a;比较相邻两节点 思路 比较两个相邻的节点&#xff0c;如果下一个节点值和当前节点值一样…

简单高效 LaTeX 科学排版 第004集 命令与环境

这是《简单高效LaTeX》的第四个视频&#xff0c;主要演示讨论基本命令与排版环境&#xff0c;还有保留字符。 视频地址&#xff1a;https://www.ixigua.com/7298100920137548288?id7298102807985390120&logTagf853f23a668f8a2ee405