目前市场上的虚拟化技术种类很多,例如moby(docker)、LXC、RKT等等。在带来方便应用部署和资源充分利用的好处的同时,如何监控相应Container及其内部应用进程成为运维人员不可避免遇到的新情况。UAV.Container从虚拟化技术的基础原理和Linux操作系统的内核特性出发,得到Container容器和内部进程的各维度监控数据,使无论是虚拟机或物理机运维人员,还是业务运维人员角度,都能得到合适的监控维度。

虚拟化技术从基础原理上主要是cgroups、namespace和file system的应用,而操作系统作为cgroup和namespace根节点,无论在container里启动何种应用,从内核角度上来说,肯定在操作系统有其一定的特征和表现形式。我们需要做的就是对这些特征做加工处理,以得到相应的监控数据。

下面我们以docker技术举例,其他虚拟化技术类似。

一、Container ID

Container ID是一个Container的唯一标识。从容器监控的角度我们需要能得到该进程在哪个Container里运行。在操作系统层面,进程的cgroup的挂载情况就能有所体现。如图所示,我们在一个ID为3411554ff684的Container内部跑一个Tomcat进程。

由于Container的pid namespace是操作系统的pid namespace的子namespace,那么该进程在操作系统级也应该有相应的pid,用docker top命令验证一下:

该容器内进程在宿主机上的进程号为1848。接下来进入/proc/1848/cgroup下看看该进程的cgroup挂载情况

从cgroup文件里清楚的显示了实现了该容器的虚拟化技术、Container ID和此container的资源挂载路径,对比一下这里面显示的Container ID,和创建Container时的ID完全相同。这也验证了通过扫描宿主机进程的cgroup信息可以获得Container ID。这样就将pid和Container ID做了关联。

二、CPU

虽然cgroup管控了该cgroup下所有进程的CPU使用情况,但从操作系统的角度上,不论进程是否隶属于某个子cgroup下,仍然是共用宿主机的CPU。所以监控宿主机上该进程的CPU就能得到进程的CPU监控指标。

Linux上常用的CPU监控命令是top。top对CPU监控的原理是在time1时刻获取CPU从启动时的累计总时间countAll1和busy总时间countBusy1,再到time2时刻获取CPU总时间countAll2和busy总时间countBusy2,最后用busy的时间差值减去总时间的差值得到了在time1到time2这个时间段内机器CPU的占用情况。也就是:

CPU占用率(%) = (countBusy2 - countBusy1)/(countAll2 - countAll1) * 100

进程同理,在两个时刻分别得到每个进程的busy总时间countProcBusy1和countProcBusy2,则得到进程CPU占用率:

进程CPU占用率(%) = (countProcBusy2 - countProcBusy1)/(countProcAll2 - countProcAll1)*100

宿主机从启动开始的CPU总时间片可以从/proc/stat下获取:

第一行是总的CPU使用情况,具体参数的意思:

所以,选择当前为time1,3秒后为time2,countAll = user + nice + system + idle + iowait + irq + softirq + stealstolean + guest + guest_nice。countBusy为countAll减去idle的值,这样上面第一个公式的所有需要的值就齐了,可以直接计算。

第二行、第三行是每个逻辑CPU的使用情况,这里记下有两个逻辑CPU,CPU的逻辑核数与CPU显示模式irix和solaris有关。

接下来是countProcBusy的计算,进程的CPU时间片位于/proc/$pid/stat下,如图所示:

这个文件里面体现了很多进程的相关信息。其中第14、15、16、17个参数与CPU有关。

所以,countProcBusy = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。而countProcAll2-countProcAll1=3s,通过两个时刻的countProcBusy和countProcAll,进程CPU的占用率就能得到了。

其中需要注意的问题有两点:

1) jiffies实际上指的是内核时钟使用的节拍总数,所以这里的jiffies需要换算成秒才能应用上面的除法公式。

2) 刚刚我们谈到CPU显示模式irix和solaris,简单来说irix模式就是机器有N个逻辑CPU,CPU显示上限就是N*100%,solaris模式就是不管机器有多少逻辑CPU,CPU显示上限就是100%,而/proc/$pid/stat显示的是计算了所有逻辑CPU时间的,所以两种显示方式意味着计算方法稍有差异,solaris模式的结果需要在上面进程CPU占用率公式基础之上除以逻辑核数。

三、内存

进程内存的监控有两个维度的数据:一是物理占用内存大小,二是进程内存占用百分比的大小。

进程内存占用率(%) = 进程物理内存占用大小 / 宿主机总内存大小 * 100

与CPU类似,/proc/$pid/status文件记录了进程物理内存使用情况,其中VmRSS即为该进程目前所占实际物理内存的大小。

/proc/meminfo文件下记录了机器内存占用情况,这个文件很长,截取其中的一部分展示一下,MemTotal就是宿主机总内存大小:

这样,这个进程的物理内存占用和机器总内存就都得到了,相应的进程内存的占用率也就得到了。

四、磁盘IO

磁盘IO获取也很简单,/proc/$pid/io已经帮我们把这个进程的io情况记录下来了,但是与CPU类似,io文件里存的也是该进程从启动到现在的io总量,那么:

磁盘I/O(bytes/秒) = (time2时刻I/O – time1时刻I/O) / (time2 – time1)

其中的read_bytes和write_bytes分别为该进程从启动到目前为止的读取字节数和写入字节数,分别取2个时刻的值,根据上面的公式,就得到了该进程的磁盘IO。

五、端口号和连接数

由于Network Namespace对网络做了隔离,所以如果进程在Container内部运行,该进程的端口信息也应该是进程本身监听的端口号,而不是真正实际对外的端口,而Container内外端口的映射机制是由应用的虚拟化技术本身控制的,这就避免不了与实现容器的虚拟化技术打交道了,那么问题就转化成获取容器内进程本身监听的端口了。

/proc/$pid/net/tcp(tcp6,udp,udp6)就对端口号和连接数做了相应的历史记录。这些文件格式都类似,以tcp6举例

解释几个关键的key:

因为st = 0A代表listen,所以从其中挑选出st = 0A的数据,取出对应的inode号,这里这个inode号是socket号,则问题转换为了这个进程是否还存在这个socket号代表的socket。在/proc/$pid/fd下有该进程所有的fd(file descriptor),截取一段举个例子。

每个文件描述符后面的软链实际上就是打开的文件,以socket开头的就是这个进程打开的socket,在中括号中间的部分就是socket号。拿着这个socket号和上面tcp6里获得的inode号做一个匹配,如果对应上,那么tcp6里的st = 0A的端口就是这个进程监听的。至于容器内外端口的映射,这就需要根据应用的虚拟化技术的映射方法来获取了。连接数计算与端口扫描是同理的,区别只在于需要对st = 01(establish)进行扫描计数累加。

六、总结

  • 上面的方法将容器内所有进程的CPU、内存、磁盘IO、端口号和连接数都拿到了。根据Container ID就可以对不同的Container的对应数据做加和,就获得了Container级的监控数据。
  • 在容器内的进程是通过在操作系统级别反映出的pid和Container ID的对应关系来关联的。这样就可以通过读取/proc下的文件来获取监控数据。

参考文档:

http://elixir.free-electrons.com/linux/v3.10/ident

作者:周新宇

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69918724/viewspace-2654731/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69918724/viewspace-2654731/

Container及其内部进程监控剖析相关推荐

  1. python进程监控 supervisor_使用Python的Supervisor进行进程监控以及自动启动

    做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下. 结合之前在腾讯工作的经验,也会讲讲腾讯的 ...

  2. linux 进程自重启,linux 进程监控和自动重启的简单实现

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

  3. 使用 Azure Monitor 快速构建 OS 内部指标监控平台

    Azure Monitor 可以用于收集.分析和处理来自云与本地环境的遥测数据的综合解决方案,支持将应用程序和服务的可用性最大化.帮助企业了解应用程序的性能,并主动识别影响应用程序及其所依赖资源的问题 ...

  4. linux里进程监控和自动重启,Linux - linux进程监控和自动重启的简单实现

    linux进程监控和自动重启的简单实现 目的:linux 下服务器程序会由于各类缘由dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能.linux 实现原理:由定时任务crontab调 ...

  5. bat php 监控网站,HTML_进程监控实现代码[vbs+bat],运行后会在%windir%\system32\目录 - phpStudy...

    进程监控实现代码[vbs+bat] 运行后会在%windir%\system32\目录下生成jk.vbs, 并且自动添加注册表启动项,另外在D:\会生成一个隐藏属性的JK.VBS, 3秒间隔监控进程, ...

  6. AIX进程监控与管理

    AIX进程监控与管理 一, PS命令 1.1 显示10个消耗cpu最多的进程 1.2 显示10个消耗存储空间最多的进程 1.3 按顺序显示系统中受罚的进程: 1.4 按照优先级顺序显示系统中的进程 1 ...

  7. shell实现简单的进程监控脚本

    一个简单的需求:shell实现进程监控watchdog功能,配合计划任务每分钟执行一次shell脚本,对进程进行监控,如果意外中断那么启动他,如果正常则什么都不需要去做. #!/bin/bash NA ...

  8. linux防火墙阻断目的,基于Linux防火墙的内部邮件监控与阻断系统

    基于Linux防火墙的内部邮件监控与阻断系统 给出了一种邮件监听与阻断系统的设计和实现方案.方案的实现建立在Linu (本文共3页) 阅读全文>> 毫无疑问,通过电子邮件发送各种信息是个简 ...

  9. linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...

    Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...

  10. linux 进程监控和自动重启的简单实现

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

最新文章

  1. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
  2. 还不懂Docker?一个故事安排的明明白白!
  3. c语言循环设计思想结构,C语言程序设计_05循环结构程序设计讲述.pptx
  4. Linux安装ansible自动化运维工具
  5. 数据结构 思维导图【绪论、线性表、栈、队列和数组、树与二叉树、图、查找、排序】
  6. 星期五基准功能Java
  7. java 开发详解_面向接口编程详解-Java篇
  8. 微信公众平台开发之留言板
  9. LUNA16_Challange数据预处理2
  10. 【Python数据分析】数据挖掘建模——分类与预测——决策树
  11. angular学习笔记
  12. 【NOIP2016提高A组模拟9.14】数列编辑器
  13. js一键批量打印_轻松用Lodop实现批量打印功能
  14. 计算机连接网络是飞行模式怎么办,电脑wifi界面只有飞行模式怎么办
  15. 怎么将flac文件转成mp3文件
  16. Unity游戏开发入门
  17. 【云栖大会】马云口中创造未来的年轻人,把数据+环保玩出了新花样
  18. ChatGpt - 基于人工智能检索进行论文写作
  19. 双向适配器 java_类适配器,双向适配器
  20. 2022年制冷与空调设备运行操作最新解析及制冷与空调设备运行操作作业考试题库

热门文章

  1. 单件模式(Singleton Pattern
  2. word分节符,分页符的区别,链接到上一页
  3. GooglePlay商店如何优化
  4. win10远程桌面_怎么选择Win10系统版本?家庭版与专业版的对比介绍
  5. win7计算机右键菜单多,Win7如何清除右键多余菜单?Win7清理右键菜单方法
  6. 机器学习-数据科学库 13 政治献金数据案例
  7. 机器学习:PageRank
  8. 16 《万用之物:盐的故事》-豆瓣评分7.5
  9. QIIME 2教程. 03老司机上路指南Experience(2021.2)
  10. lol排位服务器维护赢了没加分,LOL最新排位制裁,“挂机退游戏会被限制加分,力度将逐次叠加”...