mesos學習之cgroup

最近在啃mesos源碼,mesos用cgroup作資源隔離,因爲以前沒有接觸linux container,因此寫了一些小代碼作了一些小試驗來學習一下cgroup。 linux

/proc/mounts文件是以/etc/mtab文件的格式給出當前系統所掛載的文件系統信息,這個文件也能反映出任何手工安裝從而在/etc/mtab文件中沒有包含的文件系統。當掛載cgroups後,cgroups的掛載點的信息也出如今/proc/mounts中,在我機器上/proc/mounts的條目信息以下: 學習

image

從左至右的信息是:文件系統name,掛載點絕對路徑,文件系統類型,選項,dump的頻率和fsck的檢查次數。 測試

我在/home/test_dir/cgroups目錄下掛載了cgroup的cpu和memory子系統,在/home/test_dir/cgroups2目錄下掛載cgroup的net_cls子系統。 spa

輸入以下兩行命令: .net

image

image

以在/proc/mounts中顯示分別顯示出了這兩個目錄。 資源

image

/proc/cgroups記錄着全部cgroup子系統的狀態: get

image

從左到右的條目分別是子系統name,hierarchy ID,子系統的cgroup控制組數目,子系統是否可用(1可用,0不可用) 源碼

那麼這兩個文件能夠用來幹嗎呢? string

咱們能夠經過查看/proc/cgroups是否存在來判斷cgroup在機器上是否可用。能夠經過解析/proc/cgroups文件獲取全部可用的cgroup的子系統信息。 it

咱們能夠經過解析/proc/mounts文件內容查看cgroup是否被掛載和指定路徑掛載了那些子系統。

寫了一段測試代碼,使用setmntent/getmntent/hasmntent來查看指定目錄是否掛載了子系統。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mntent.h>

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;
}

這段代碼運行的結果是:

image

做者zy,QQ 105789990

相關文章
相關標籤/搜索