前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker容器内的监控命令数据修正思路

Docker容器内的监控命令数据修正思路

作者头像
Walton
发布2018-04-13 16:45:53
1.6K0
发布2018-04-13 16:45:53
举报
文章被收录于专栏:KubernetesKubernetes

思路概述:编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算逻辑,并生成对应的/proc文件放到容器内/tmp/proc目录,劫持后对应的命令的数据来源就从/tmp/proc/*中获取。

下文以劫持/proc/meminfo为例进行说明:

###编写hijack_meminfo.c,用于劫持/proc/meminfo的open操作,从而劫持free命令的输出。

代码语言:javascript
复制
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdarg.h>
 
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。

代码语言:javascript
复制
MemTotal:        999 kB
MemFree:           999 kB
MemAvailable:     999 kB
Buffers:          999 kB
Cached:           999 kB
SwapCached:            0 kB
Active:           999 kB
Inactive:         999 kB
Active(anon):     999 kB
Inactive(anon):      999 kB
Active(file):     999 kB
Inactive(file):   999 kB
Unevictable:           999 kB
Mlocked:               999 kB
SwapTotal:             999 kB
SwapFree:              999 kB
Dirty:                999 kB
Writeback:             999 kB
AnonPages:        999 kB
Mapped:           999 kB
Shmem:               999 kB
Slab:              999 kB
SReclaimable:      999 kB
SUnreclaim:        999 kB
KernelStack:        999 kB
PageTables:         999 kB
NFS_Unstable:          999 kB
Bounce:                999 kB
WritebackTmp:          999 kB
CommitLimit:      999 kB
Committed_AS:    999 kB
VmallocTotal:   999 kB
VmallocUsed:        999 kB
VmallocChunk:   999 kB
HardwareCorrupted:     999 kB
AnonHugePages:    999 kB
CmaTotal:              999 kB
CmaFree:               999 kB
HugePages_Total:       999
HugePages_Free:        999
HugePages_Rsvd:        999
HugePages_Surp:        999
Hugepagesize:       999 kB
DirectMap4k:       999 kB
DirectMap2M:      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修正的监控命令还不够多,不能满足我们的需求,于是我们就在这基础进行了增量开发。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档