linux中Docker容器内的监控命令数据修正思路
这篇文章主要介绍了linux中Docker容器内的监控命令数据修正思路,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
思路概述:编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算逻辑,并生成对应的/proc文件放到容器内/tmp/proc目录,劫持后对应的命令的数据来源就从/tmp/proc/*中获取。
下文以劫持/proc/meminfo为例进行说明:
###编写hijack_meminfo.c,用于劫持/proc/meminfo的open操作,从而劫持free命令的输出。
#define _GNU_SOURCE#include#include #include #include int open( const char * pathname, int flags){ typeof(open) *old_open; old_open = dlsym(RTLD_NEXT, "open"); //printf("in my hijack open!"); // 劫持/proc/meminfo的open char *s_meminfo = strstr(pathname, "/proc/meminfo"); if (s != NULL) { /* TODO:调用自己开发的容器meminfo信息收集函数,生成meminfo到容器目录/tmp/proc/meminfo */ (*old_open)("/tmp/proc/meminfo", flags); } else { (*old_open)(pathname, flags); }}
###编译hijack_meminfo.c,生成动态链接库libhijack_meminfo.so。
$ gcc -shared -fPIC hijack_meminfo.c -o libhijack_meminfo.so -ldl
###将libhijack_meminfo.so的全路径配置到环境变量LD_PRELOAD,系统会进行open函数的劫持。
$ export LD_PRELOAD=
pwd/libhijack_meminfo.so
###为了测试和便于观察,我们将手动生成文件/tmp/proc/meminfo。
MemTotal: 999 kBMemFree: 999 kBMemAvailable: 999 kBBuffers: 999 kBCached: 999 kBSwapCached: 0 kBActive: 999 kBInactive: 999 kBActive(anon): 999 kBInactive(anon): 999 kBActive(file): 999 kBInactive(file): 999 kBUnevictable: 999 kBMlocked: 999 kBSwapTotal: 999 kBSwapFree: 999 kBDirty: 999 kBWriteback: 999 kBAnonPages: 999 kBMapped: 999 kBShmem: 999 kBSlab: 999 kBSReclaimable: 999 kBSUnreclaim: 999 kBKernelStack: 999 kBPageTables: 999 kBNFS_Unstable: 999 kBBounce: 999 kBWritebackTmp: 999 kBCommitLimit: 999 kBCommitted_AS: 999 kBVmallocTotal: 999 kBVmallocUsed: 999 kBVmallocChunk: 999 kBHardwareCorrupted: 999 kBAnonHugePages: 999 kBCmaTotal: 999 kBCmaFree: 999 kBHugePages_Total: 999HugePages_Free: 999HugePages_Rsvd: 999HugePages_Surp: 999Hugepagesize: 999 kBDirectMap4k: 999 kBDirectMap2M: 999 kB
###执行free/top命令, 观察是否劫持/proc/meminfo成功。
根据这个思路,我们分析了常用的监控命令(free, top, iostat, vmstat, sar, df, uptime等)数据计算方法,对相关/proc文件进行了open/fopen 的劫持,并重新根据容器内对应的cgroup fs 数据重新计算的这些监控命令的监控数据。
因为我们有些场景是胖容器的场景,运维需要像监控VM/PM一样的监控docker容器,因此才会需要我们去对容器内的监控命令进行修正。
在这里,我要推荐一个携程的一个开源项目docker-monitor-injector,我们也是参考它的思路进行开发的。为什么没有直接使用它呢?因为docker-monitor-injector修正的监控命令还不够多,不能满足我们的需求,于是我们就在这基础进行了增量开发。
感谢你能够认真阅读完这篇文章,希望小编分享的"linux中Docker容器内的监控命令数据修正思路"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!