/ 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%无疑,如图:CPU100%下面我们用我们的程序启动器来启动a.out并限制其CPU为89%,如图:CPU 89%我们可以看到,其CPU占比会在89%上下小幅浮动,大家可自行尝试从代码中,我们可以看到,其实限制的方法是在/sys/fs/cgroup/cpu下建立一个test_group目录,然后向其内的cfs_quota_us文件写入限制额度,再向其内的tasks写入希望限制的进程ID目前从码哥的使用情况来看,阿里和腾讯的cgroups配置都是在/sys/fs/cgroup中的,可能其他的操作系统有不同的路径喜欢的朋友可以关注码哥,也可以在评论区给码哥留言交流,谢谢观看(图片来源网络,侵删)
0 评论