diff --git a/source/tools/monitor/unity/collector/plugin/podmem/memcg.cpp b/source/tools/monitor/unity/collector/plugin/podmem/memcg.cpp index df078aa3b2bd6c037c522a523757f541c46f7ff2..7cb44cd9f59cef5cced685a17126d20eec0ba5fc 100644 --- a/source/tools/monitor/unity/collector/plugin/podmem/memcg.cpp +++ b/source/tools/monitor/unity/collector/plugin/podmem/memcg.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace std; #ifndef KPF_RESERVED @@ -28,8 +29,6 @@ using namespace std; #define MAX_BIT (26) -map files; -map inodes; static bool full_scan; static unsigned int scan_rate = 4; struct file_info { @@ -45,6 +44,16 @@ struct file_info { int shmem; int del; }; +map files; +struct myComp +{ + bool operator()(const unsigned long &a,const unsigned long &b) + { + return files[a]->cached >= files[b]->cached; + } +}; +set fileset; +map inodes; extern struct member_attribute *get_offset(string struct_name, string member_name); static int prepend(char **buffer, int *buflen, const char *str, int namelen, int off) @@ -118,7 +127,7 @@ static int get_filename(unsigned long dentry, char *filename, int len) * pfn: page pfn * cinode: cgroup inode */ -static int get_dentry(unsigned long pfn, unsigned long cinode, int active, int shmem, int dirty) +static int get_dentry(unsigned long pfn, unsigned long cinode, int active, int shmem, int dirty, int top) { map::iterator iter; unsigned long page = PFN_TO_PAGE(pfn); @@ -153,7 +162,7 @@ static int get_dentry(unsigned long pfn, unsigned long cinode, int active, int s } kcore_readmem(map + att->offset, &cached, sizeof(cached)); /* skip file cache < 100K */ - if (cached*4 < 100) + if (fileset.size() >= top and (cached*4 < (files[*(--fileset.end())]->cached))) return 0; att = get_offset("address_space", "host"); @@ -275,6 +284,15 @@ static int get_dentry(unsigned long pfn, unsigned long cinode, int active, int s strncpy(info->filename, end, sizeof(info->filename) - 2); info->filename[sizeof(info->filename) -1] = '0'; files[i_ino] = info; + fileset.insert(i_ino); + if(fileset.size() > top) + { + i_ino = *(--fileset.end()); + fileset.erase(--fileset.end()); + iter=files.find(i_ino); + free(iter->second); + files.erase(iter); + } return 0; } @@ -305,67 +323,24 @@ bool cached_cmp(const pair& a, const pair::iterator iter; - vector< pair > vec(files.begin(), files.end()); + set::iterator iter2; struct file_info *info; int size = 0; - for (iter = files.begin(); iter != files.end(); ++iter) { - info = (*iter).second; + for (iter2 = fileset.begin(); iter2 != fileset.end(); ++iter2) { + info = files[*iter2]; if (!info) { continue; } - } - sort(vec.begin(), vec.end(), cached_cmp); - - for (int i = 0; i < vec.size(); ++i) { - info = vec[i].second; - if (!info) { - continue; - } - //printf("inode=%lu file=%s cached=%lu size=%lu cinode=%lu active=%lu inactive=%lu shmem=%d \ - // delete=%d cgcached=%lu dirty=%lu\n", info->inode, info->filename, info->cached, info->size,\ - // info->cinode, info->active*4, info->inactive*4, info->shmem, info->del, info->cgcached*4, info->dirty*4); - - if (i <= top - 1) - size += sprintf(res + size, "cinode=%lu cached=%lu size=%lu file=%s\n",info->cinode,info->cached, info->size,info->filename); + size += sprintf(res + size, "cinode=%lu cached=%lu size=%lu file=%s\n", info->cinode,info->cached, info->size,info->filename); free(info); } files.clear(); - return 0; -} -static int output_file_cached(unsigned int top) -{ - map::iterator iter; - vector< pair > vec(files.begin(), files.end()); - struct file_info *info; + fileset.clear(); - for (iter = files.begin(); iter != files.end(); ++iter) { - info = (*iter).second; - if (!info) { - continue; - } - } - sort(vec.begin(), vec.end(), cached_cmp); - - for (int i = 0; i < vec.size(); ++i) { - info = vec[i].second; - if (!info) { - continue; - } - printf("inode=%lu file=%s cached=%lu size=%lu cinode=%lu active=%lu inactive=%lu shmem=%d \ - delete=%d cgcached=%lu dirty=%lu\n", info->inode, info->filename, info->cached, info->size,\ - info->cinode, info->active*4, info->inactive*4, info->shmem, info->del, info->cgcached*4, info->dirty*4); - - //size += sprintf(res + size, "cinode=%lu cached=%lu size=%lu file=%s\n", info->cinode,info->cached, info->size,info->filename); - free(info); - if (i >= top - 1) - break; - } - return 0; + return 0; } - int scan_pageflags_nooutput(struct options *opt, char *res) { unsigned long pageflag; @@ -407,61 +382,13 @@ int scan_pageflags_nooutput(struct options *opt, char *res) shmem = !!(pageflag & (1 <top); } } output_file_cached_string(opt->top, res); return 0; } -int scan_pageflags(struct options *opt) -{ - unsigned long pageflag; - unsigned long pfn = 0; - unsigned long inode = 0; - int active = 0; - int dirty = 0; - int shmem = 0; - - if (opt->rate != 0) { - scan_rate = opt->rate; - } - full_scan = opt->fullscan; - while (1) { - int ret = 0; - pageflag = 0; - - pfn += scan_rate ;/* skip 2M*/ - - if (pfn > max_pfn) - break; - ret = kpageflags_read(&pageflag, sizeof(pageflag), sizeof(pageflag)*pfn); - if (ret != sizeof(pageflag)) { - break; - } - if (pageflag & (1 << KPF_NOPAGE) || !pageflag) - continue; - - if ((pageflag & (1<> KPF_RESERVED) & 0x1)) - continue; - if (pageflag & (1 << KPF_ANON)) - continue; - - active = !!((1<top); - return 0; -} - int memcg_cgroup_path(const char *cgrouppath) { struct stat st; diff --git a/source/tools/monitor/unity/collector/plugin/podmem/memread.cpp b/source/tools/monitor/unity/collector/plugin/podmem/memread.cpp index f9eb4e63fc3411e3a59d53a7d8d1658b59d83937..d53189b27f8430dc208aebca601d1dff0d41bb42 100644 --- a/source/tools/monitor/unity/collector/plugin/podmem/memread.cpp +++ b/source/tools/monitor/unity/collector/plugin/podmem/memread.cpp @@ -432,94 +432,3 @@ char* scanall() scan_pageflags_nooutput(&opt,outputres); return outputres; } -/* -int main(int argc, char *argv[]) -{ - int ch, ret; - - const char *sopt = "hmf:c:a:r:t:"; - const struct option lopt[] = { - {"help", 0, NULL, 'h'}, - {"podmem", 0, NULL, 'm'}, - {"file", 0, NULL, 'f'}, - {"cgroup", 0, NULL, 'c'}, - {"all", 0, NULL, 'a'}, - {"rate", 0, NULL, 'r'}, - {"top", 0, NULL, 't'}, - { NULL, 0, NULL, 0 } - }; - opt.rate = 1; - opt.top = 10; - - while ((ch = getopt_long(argc, argv, sopt, lopt, &optind)) != -1) { - switch (ch) { - case 'h': - show_usage(); - return 0; - case 'm': - opt.podmem = true; - break; - case 'f': - opt.cgroupfile = strdup(optarg); - break; - case 'c': - opt.cgroup = strdup(optarg); - break; - case 'a': - opt.fullscan = atoi(optarg); - break; - case 't': - opt.top = atoi(optarg); - break; - case 'r': - opt.rate = atoi(optarg); - break; - case '?': - LOG_ERROR("try `%s --help' for more information\n", - argv[0]); - return -1; - } - } - - if (getuid()) { - LOG_ERROR("must be root\n"); - ret = -EPERM; - goto out; - } - - ret = get_pageshift(); - if (ret != 0) { - LOG_ERROR("failed to page shift\n"); - goto out; - } - - ret = setup(); - if (ret != 0) { - LOG_ERROR("failed to setup\n"); - goto out; - } - if (kpagecgroup_fd <= 0 && opt.podmem == true) { - opt.fullscan = 1; - } - if (opt.cgroupfile) { - memcg_cgroup_file(opt.cgroupfile); - } - - if (opt.cgroup) { - memcg_cgroup_path(opt.cgroup); - } - - if (opt.cgroupfile||opt.cgroup||opt.podmem) { - scan_pageflags(&opt); - } - - if (opt.cgroupfile) { - free(opt.cgroupfile); - } - if (opt.cgroup) { - free(opt.cgroup); - } - cleanup(); -out: - return ret; -}*/