• -------------------------------------------------------------
  • ====================================

mesos学习之cgroup

mesos dewbay 6年前 (2019-04-12) 2030次浏览 已收录 0个评论 扫描二维码

最近在啃mesos源码,mesoscgroup做资源隔离,由于之前没有接触 linux container,所以写了一些小代码做了一些小试验来学习一下cgroup

/proc/mounts 文件是以/etc/mtab 文件的格式给出当前系统所挂载的文件系统信息,这个文件也能反映出任何手工安装从而在/etc/mtab 文件中没有包含的文件系统。当挂载cgroups 后,cgroups 的挂载点的信息也出现在/proc/mounts 中,在我机器上/proc/mounts 的条目信息如下:

从左至右的信息是:文件系统 name,挂载点绝对路径,文件系统类型,选项,dump 的频率和 fsck 的检查次数。

我在/home/test_dir/cgroups 目录下挂载了cgroup的 cpu 和 memory 子系统,在/home/test_dir/cgroups2 目录下挂载 cgroup 的 net_cls 子系统。

输入如下两行命令:

以在/proc/mounts 中显示分别显示出了这两个目录。

/proc/cgroups 记录着所有 cgroup 子系统的状态:

从左到右的条目分别是子系统 name,hierarchy ID,子系统的 cgroup 控制组数目,子系统是否可用(1 可用,0 不可用)

那么这两个文件可以用来干嘛呢?

我们可以通过查看/proc/cgroups 是否存在来判断 cgroup 在机器上是否可用。可以通过解析/proc/cgroups 文件获取所有可用的 cgroup 的子系统信息。

我们可以通过解析/proc/mounts 文件内容查看 cgroup 是否被挂载和指定路径挂载了那些子系统。

写了一段测试代码,使用 setmntent/getmntent/hasmntent 来查看指定目录是否挂载了子系统。

include

include

include

include

bool checkDirMounted(const char* dir, const char* subsys[], size_t num)
{
    if (!dir || !subsys || 0 == num) {
        return false;
    }

    FILE* file = setmntent(“/proc/mounts”, “r”);
    if (file == NULL) {
        return false;
    }

    while (true) {
        struct mntent* mntent = getmntent(file);
        if (mntent == NULL) {
            break;
        }

        if (strcmp(mntent->mnt_type, “cgroup”) != 0
            || strcmp(mntent->mnt_dir, dir) != 0) {
            continue;
        }

        for (size_t i = 0; i < num; ++i) {
            bool failed = !subsys[i] || !hasmntopt(mntent, subsys[i]);
            if (failed) {
                endmntent(file);
                return false;

           }
        }

        return true;
    }
    endmntent(file);
    return false;
}

int main()
{
    //我在/home/test_dir/cgroups 目录下挂在了 cgroup,使用了如下命令:
    //mount -t cgroup -o cpu,memory test_cgroups /home/test_dir/cgroups
    const char* dir = “/home/test_dir/cgroups”;
    const char* subSystem[] = {“memory”, “cpu”};
    //查看指定目录是否挂载了 memory 和 cpu
    if (checkDirMounted(dir, subSystem, 2)) {
        printf(“%s have already mount %s,%s\n”, dir, subSystem[0], subSystem[1]);
    }
    return 0;
}

这段代码运行的结果是:


作者:tycoon1988
来源:CSDN
原文:https://blog.csdn.net/tycoon1988/article/details/42916061
版权声明:本文为博主原创文章,转载请附上博文链接!


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mesos学习之cgroup
喜欢 (1)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址