The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/314
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === dirty/writeback ... and so on Signed-off-by LiMing Wu <19092...@suning.com>
From 498524de1ff2514b9eecd9f6dee4eb163cc49ee3 Mon Sep 17 00:00:00 2001 From: LiMing Wu <19092...@suning.com> Date: Fri, 17 Jan 2020 11:34:07 +0800 Subject: [PATCH] add some metrics for meminfo dirty/writeback ... and so on Signed-off-by LiMing Wu <19092...@suning.com> --- bindings.c | 220 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 154 insertions(+), 66 deletions(-) diff --git a/bindings.c b/bindings.c index d11f0e5..6170501 100644 --- a/bindings.c +++ b/bindings.c @@ -63,6 +63,28 @@ struct cpuacct_usage { bool online; }; +struct memory_stat { + unsigned long long hierarchical_memory_limit; + unsigned long long hierarchical_memsw_limit; + unsigned long long total_cache; + unsigned long long total_rss; + unsigned long long total_rss_huge; + unsigned long long total_shmem; + unsigned long long total_mapped_file; + unsigned long long total_dirty; + unsigned long long total_writeback; + unsigned long long total_swap; + unsigned long long total_pgpgin; + unsigned long long total_pgpgout; + unsigned long long total_pgfault; + unsigned long long total_pgmajfault; + unsigned long long total_inactive_anon; + unsigned long long total_active_anon; + unsigned long long total_inactive_file; + unsigned long long total_active_file; + unsigned long long total_unevictable; +}; + /* The function of hash table.*/ #define LOAD_SIZE 100 /*the size of hash_table */ #define FLUSH_TIME 5 /*the flush rate */ @@ -1231,6 +1253,82 @@ void free_keys(struct cgfs_files **keys) free(keys); } +bool cgfs_get_mstat(const char *controller, const char *cgroup, + const char *file, struct memory_stat *mstat) +{ + int ret, fd, cfd; + size_t len = 0; + char *fnam, *tmpc; + + tmpc = find_mounted_controller(controller, &cfd); + if (!tmpc) + return false; + + /* Make sure we pass a relative path to *at() family of functions. + * . + /cgroup + / + file + \0 + */ + len = strlen(cgroup) + strlen(file) + 3; + fnam = alloca(len); + ret = snprintf(fnam, len, "%s%s/%s", *cgroup == '/' ? "." : "", cgroup, file); + if (ret < 0 || (size_t)ret >= len) + return false; + + fd = openat(cfd, fnam, O_RDONLY); + if (fd < 0) + return false; + + FILE *f = fdopen(fd, "r"); + len = 0; + char *line = NULL; + ssize_t linelen; + + if (!f) + return NULL; + + while ((linelen = getline(&line, &len, f)) != -1) { + if (strncmp(line, "hierarchical_memory_limit", 25) == 0) { + sscanf(line, "hierarchical_memory_limit %llu", &(mstat->hierarchical_memory_limit)); + } else if (strncmp(line, "hierarchical_memsw_limit", 24) == 0) { + sscanf(line, "hierarchical_memsw_limit %llu", &(mstat->hierarchical_memsw_limit)); + } else if (strncmp(line, "total_cache", 11) == 0) { + sscanf(line, "total_cache %llu", &(mstat->total_cache)); + } else if (strncmp(line, "total_rss", 9) == 0) { + sscanf(line, "total_rss %llu", &(mstat->total_rss)); + } else if (strncmp(line, "total_rss_huge", 14) == 0) { + sscanf(line, "total_rss_huge %llu", &(mstat->total_rss_huge)); + } else if (strncmp(line, "total_shmem", 11) == 0) { + sscanf(line, "total_shmem %llu", &(mstat->total_shmem)); + } else if (strncmp(line, "total_mapped_file", 17) == 0) { + sscanf(line, "total_mapped_file %llu", &(mstat->total_mapped_file)); + } else if (strncmp(line, "total_dirty", 11) == 0) { + sscanf(line, "total_dirty %llu", &(mstat->total_dirty)); + } else if (strncmp(line, "total_writeback", 15) == 0) { + sscanf(line, "total_writeback %llu", &(mstat->total_writeback)); + } else if (strncmp(line, "total_swap", 10) == 0) { + sscanf(line, "total_swap %llu", &(mstat->total_swap)); + } else if (strncmp(line, "total_pgpgin", 12) == 0) { + sscanf(line, "total_pgpgin %llu", &(mstat->total_pgpgin)); + } else if (strncmp(line, "total_pgpgout", 13) == 0) { + sscanf(line, "total_pgpgout %llu", &(mstat->total_pgpgout)); + } else if (strncmp(line, "total_pgfault", 13) == 0) { + sscanf(line, "total_pgfault %llu", &(mstat->total_pgfault)); + } else if (strncmp(line, "total_pgmajfault", 16) == 0) { + sscanf(line, "total_pgmajfault %llu", &(mstat->total_pgmajfault)); + } else if (strncmp(line, "total_inactive_anon", 19) == 0) { + sscanf(line, "total_inactive_anon %llu", &(mstat->total_inactive_anon)); + } else if (strncmp(line, "total_active_anon", 17) == 0) { + sscanf(line, "total_active_anon %llu", &(mstat->total_active_anon)); + } else if (strncmp(line, "total_inactive_file", 19) == 0) { + sscanf(line, "total_inactive_file %llu", &(mstat->total_inactive_file)); + } else if (strncmp(line, "total_active_file", 17) == 0) { + sscanf(line, "total_active_file %llu", &(mstat->total_active_file)); + } else if (strncmp(line, "total_unevictable", 17) == 0) { + sscanf(line, "total_unevictable %llu", &(mstat->total_unevictable)); + } + } + return true; +} + bool cgfs_get_value(const char *controller, const char *cgroup, const char *file, char **value) { int ret, fd, cfd; @@ -3367,43 +3465,6 @@ static bool startswith(const char *line, const char *pref) return false; } -static void parse_memstat(char *memstat, unsigned long *cached, - unsigned long *active_anon, unsigned long *inactive_anon, - unsigned long *active_file, unsigned long *inactive_file, - unsigned long *unevictable, unsigned long *shmem) -{ - char *eol; - - while (*memstat) { - if (startswith(memstat, "total_cache")) { - sscanf(memstat + 11, "%lu", cached); - *cached /= 1024; - } else if (startswith(memstat, "total_active_anon")) { - sscanf(memstat + 17, "%lu", active_anon); - *active_anon /= 1024; - } else if (startswith(memstat, "total_inactive_anon")) { - sscanf(memstat + 19, "%lu", inactive_anon); - *inactive_anon /= 1024; - } else if (startswith(memstat, "total_active_file")) { - sscanf(memstat + 17, "%lu", active_file); - *active_file /= 1024; - } else if (startswith(memstat, "total_inactive_file")) { - sscanf(memstat + 19, "%lu", inactive_file); - *inactive_file /= 1024; - } else if (startswith(memstat, "total_unevictable")) { - sscanf(memstat + 17, "%lu", unevictable); - *unevictable /= 1024; - } else if (startswith(memstat, "total_shmem")) { - sscanf(memstat + 11, "%lu", shmem); - *shmem /= 1024; - } - eol = strchr(memstat, '\n'); - if (!eol) - return; - memstat = eol+1; - } -} - static void get_blkio_io_value(char *str, unsigned major, unsigned minor, char *iotype, unsigned long *v) { char *eol; @@ -3512,10 +3573,8 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, char *cg; char *memusage_str = NULL, *memstat_str = NULL, *memswlimit_str = NULL, *memswusage_str = NULL; - unsigned long memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, - cached = 0, hosttotal = 0, active_anon = 0, inactive_anon = 0, - active_file = 0, inactive_file = 0, unevictable = 0, shmem = 0, - hostswtotal = 0; + unsigned long memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0; + struct memory_stat *mstat = NULL; char *line = NULL; size_t linelen = 0, total_len = 0, rv = 0; char *cache = d->buf; @@ -3544,7 +3603,9 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, memlimit = get_min_memlimit(cg, "memory.limit_in_bytes"); if (!cgfs_get_value("memory", cg, "memory.usage_in_bytes", &memusage_str)) goto err; - if (!cgfs_get_value("memory", cg, "memory.stat", &memstat_str)) + + mstat = (struct memory_stat *)malloc(sizeof(struct memory_stat)); + if (!cgfs_get_mstat("memory", cg, "memory.stat", mstat)) goto err; // Following values are allowed to fail, because swapaccount might be turned @@ -3563,10 +3624,6 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, memlimit /= 1024; memusage /= 1024; - parse_memstat(memstat_str, &cached, &active_anon, - &inactive_anon, &active_file, &inactive_file, - &unevictable, &shmem); - f = fopen("/proc/meminfo", "r"); if (!f) goto err; @@ -3589,9 +3646,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, snprintf(lbuf, 100, "MemAvailable: %8lu kB\n", memlimit - memusage + cached); printme = lbuf; } else if (startswith(line, "SwapTotal:") && memswlimit > 0 && opts && opts->swap_off == false) { - sscanf(line+sizeof("SwapTotal:")-1, "%lu", &hostswtotal); - if (hostswtotal < memswlimit) - memswlimit = hostswtotal; + memswlimit -= memlimit; snprintf(lbuf, 100, "SwapTotal: %8lu kB\n", memswlimit); printme = lbuf; } else if (startswith(line, "SwapTotal:") && opts && opts->swap_off == true) { @@ -3607,39 +3662,63 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, snprintf(lbuf, 100, "SwapFree: %8lu kB\n", 0UL); printme = lbuf; } else if (startswith(line, "Slab:")) { - snprintf(lbuf, 100, "Slab: %8lu kB\n", 0UL); + snprintf(lbuf, 100, "Slab: %8lu kB\n", 0UL); printme = lbuf; } else if (startswith(line, "Buffers:")) { snprintf(lbuf, 100, "Buffers: %8lu kB\n", 0UL); printme = lbuf; } else if (startswith(line, "Cached:")) { - snprintf(lbuf, 100, "Cached: %8lu kB\n", cached); + snprintf(lbuf, 100, "Cached: %8llu kB\n", + (mstat->total_cache)/1024); printme = lbuf; } else if (startswith(line, "SwapCached:")) { snprintf(lbuf, 100, "SwapCached: %8lu kB\n", 0UL); printme = lbuf; } else if (startswith(line, "Active:")) { - snprintf(lbuf, 100, "Active: %8lu kB\n", - active_anon + active_file); + snprintf(lbuf, 100, "Active: %8llu kB\n", + (mstat->total_active_anon + mstat->total_active_file)/1024); printme = lbuf; } else if (startswith(line, "Inactive:")) { - snprintf(lbuf, 100, "Inactive: %8lu kB\n", - inactive_anon + inactive_file); + snprintf(lbuf, 100, "Inactive: %8llu kB\n", + (mstat->total_inactive_anon + mstat->total_inactive_file)/1024); printme = lbuf; } else if (startswith(line, "Active(anon)")) { - snprintf(lbuf, 100, "Active(anon): %8lu kB\n", active_anon); + snprintf(lbuf, 100, "Active(anon): %8llu kB\n", + (mstat->total_active_anon)/1024); printme = lbuf; } else if (startswith(line, "Inactive(anon)")) { - snprintf(lbuf, 100, "Inactive(anon): %8lu kB\n", inactive_anon); + snprintf(lbuf, 100, "Inactive(anon): %8llu kB\n", + (mstat->total_inactive_anon)/1024); printme = lbuf; } else if (startswith(line, "Active(file)")) { - snprintf(lbuf, 100, "Active(file): %8lu kB\n", active_file); + snprintf(lbuf, 100, "Active(file): %8llu kB\n", + (mstat->total_active_file)/1024); printme = lbuf; } else if (startswith(line, "Inactive(file)")) { - snprintf(lbuf, 100, "Inactive(file): %8lu kB\n", inactive_file); + snprintf(lbuf, 100, "Inactive(file): %8llu kB\n", + (mstat->total_inactive_file)/1024); printme = lbuf; } else if (startswith(line, "Unevictable")) { - snprintf(lbuf, 100, "Unevictable: %8lu kB\n", unevictable); + snprintf(lbuf, 100, "Unevictable: %8llu kB\n", + (mstat->total_unevictable)/1024); + printme = lbuf; + } else if (startswith(line, "Dirty")) { + snprintf(lbuf, 100, "Dirty: %8llu kB\n", + (mstat->total_dirty)/1024); + printme = lbuf; + } else if (startswith(line, "Writeback")) { + snprintf(lbuf, 100, "Writeback: %8llu kB\n", + (mstat->total_writeback)/1024); + printme = lbuf; + } else if (startswith(line, "AnonPages")) { + snprintf(lbuf, 100, "AnonPages: %8llu kB\n", + (mstat->total_active_anon + + mstat->total_inactive_anon + - mstat->total_shmem)/1024); + printme = lbuf; + } else if (startswith(line, "Mapped")) { + snprintf(lbuf, 100, "Mapped: %8llu kB\n", + (mstat->total_mapped_file)/1024); printme = lbuf; } else if (startswith(line, "SReclaimable")) { snprintf(lbuf, 100, "SReclaimable: %8lu kB\n", 0UL); @@ -3648,7 +3727,8 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, snprintf(lbuf, 100, "SUnreclaim: %8lu kB\n", 0UL); printme = lbuf; } else if (startswith(line, "Shmem:")) { - snprintf(lbuf, 100, "Shmem: %8lu kB\n", shmem); + snprintf(lbuf, 100, "Shmem: %8llu kB\n", + (mstat->total_shmem)/1024); printme = lbuf; } else if (startswith(line, "ShmemHugePages")) { snprintf(lbuf, 100, "ShmemHugePages: %8lu kB\n", 0UL); @@ -3656,6 +3736,10 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, } else if (startswith(line, "ShmemPmdMapped")) { snprintf(lbuf, 100, "ShmemPmdMapped: %8lu kB\n", 0UL); printme = lbuf; + } else if (startswith(line, "AnonHugePages")) { + snprintf(lbuf, 100, "AnonHugePages: %8llu kB\n", + (mstat->total_rss_huge)/1024); + printme = lbuf; } else printme = line; @@ -3692,6 +3776,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, free(memswlimit_str); free(memswusage_str); free(memstat_str); + free(mstat); return rv; } @@ -5698,12 +5783,15 @@ static int refresh_load(struct load_node *p, char *path) if (f != NULL) { while (getline(&line, &linelen, f) != -1) { /* Find State */ - if ((line[0] == 'S') && (line[1] == 't')) - break; + if (strncmp(line, "State", 5) == 0) { + if (strncmp(line, "State R", 7) == 0 || + strncmp(line, "State D", 7) == 0) { + run_pid++; + } + break; + } } - if ((line[7] == 'R') || (line[7] == 'D')) - run_pid++; - fclose(f); + fclose(f); } } closedir(dp);
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel