共计 2658 个字符,预计需要花费 7 分钟才能阅读完成。
本篇内容主要讲解“Docker 数据采集的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“Docker 数据采集的原理是什么”吧!
监控目的
减少宕机时间
扩展和性能管理
资源计划
识别异常事件
故障排除、分析
为什么需要监控我们的服务?其中有一些显而易见的原因,比如需要监控工具来提醒服务故障,比如通过监控服务的负载来决定扩容或缩容。如果机器普遍负载不高,则可以考虑缩减一下机器规模,如果数据库连接经常维持在一个高位水平,则可以考虑一下是否可以进行拆库处理,优化一下架构。
##Docker 监控面临的挑战
Docker 特点
像 host 但不是 host
量大
生命周期短 监控盲点(断层)
微服务 集群
全方位
Host(VM)+ Services + Containers + Apps
容器为我们的开发和运维带来了更多的方向和可能性,我们也需要一种现代的监控方案来应对这种变化。
随着不可变基础设施概念的普及,云原生应用的兴起,云计算组件已经越来越像搭建玩具的积木块。很多基础设施生命周期变短,不光容器如此,云主机、VM 也是。
在云计算出现之前,一台机器可能使用 3、5 年甚至更长都不需要重装,主机名也不会变,而现在,可能升级一个版本,就要重建一个云主机或重新启动一个容器。监控对象动态变化,而且非常频繁。即使全部实现自动化,也会在负载和复杂度方面带来不利影响。
监控还有助于进行内部统制,尤其是对安全比较敏感的行业,比如证券、银行等。比如服务器受到攻击时,我们需要分析事件,找到根本原因,识别类似攻击,发现未知的被攻击系统,甚至完成取证等工作。
集群的出现,使应用的拓扑结构也变得复杂,不同应用的指标和日志格式也不统一,再加上要考虑应对多租户的问题,这些都给监控带来了新挑战。
传统的监控内包括对主机、网络和应用的监控,但是 Docker 出现之后,容器这一层很容易被忽略,成为三不管地区,即监控的盲点。
有人说,容器不就是个普通的 OS 么?装个 Zabbix 的探针不就行了么?Docker host 和 Docker 容器都要装 Zabbix 探针……其实问题很多。
除了容器内部看到的 cpu 内存情况不准之外,而且容器生命周期短,重启之后 host 名,ip 地址都会变,所以最好在 Docker host 上安装 Zabbix agent。
如果每个容器都像 OS 那样监控,则 metric 数量将会非常巨大,而且这些数据很可能几分钟之后就无效率了(容器已经停止)。容器生命周期短暂,一旦容器结束运行,之前收集的数据将不再有任何意义。
主要的解决方式就是以 App 或者 Service 为单位进行监控(通过 Tag 等方式)。
##Docker 监控技术基础
docker stats
Remote API
伪文件系统
我们可以通过 docker stats 命令或者 Remote API 以及 Linux 的伪文件系统来获取容器的性能指标。
使用 API 的话需要注意一下,那就是不要给 Docker daemon 带来性能负担。如果你一台主机有 200 个容器,如果非常频繁的采集系统性能可能会大量占据 CPU 时间。
最好的方式应该就是使用伪文件系统。如果你只是想通过 shell 来采集性能数据,则 docker stats 可能是最简单的方式了。
docker stats 命令
该命令默认以流式方式输出,如果想打印出最新的数据并立即退出,可以使用 no-stream=true 参数。
伪文件系统
CPU、内存、磁盘
网络
文件位置大概在(跟系统有关,这是 Systemd 的例子):
Docker 各个版本对这三种方式的支持程度不同,取得 metric 的方式和详细程度也不同,其中网络 metric 是在 1.6.1 之后才能从伪文件系统得到。
Memory
内存的很多性能指标都来自于 memory.stat 文件:
前面的不带 total 的指标,表示的是该 cgroup 中的 process 所使用的、不包括子 cgroup 在内的内存量,而 total 开头的指标则包含了这些进程使用的包括子 cgroup 数据。这里我们看到的数据都是一样的,由于这里并没有子 cgroup。
两个比较重要的指标:
RSS:resident set size
进程的所有数据堆、栈和 memory map 等。rss 可以进一步分类为 active 和 inactive(activeanon and inactiveanon)。在内存不够需要 swap 一部分到磁盘的时候,会选择 inactive 的 rss 进行 swap。
cache memory
缓存到内存中的硬盘文件的大小。比如你读写文件的时候,或者使用 mapped file 的时候,这个内存都会增加。这类内存也可以再细分为 active 和 inactive 的 cache,即 activefile 和 inactivefile。如果系统需要更多内存,则 inactive 的 cache 会被优先重用。
CPU
cpuacct.stat 文件
docker.cpu.system
docker.cpu.user
但是比较遗憾,Docker 不会报告 nice,idle 和 iowait 等事件。
System 也叫 kernel 时间,主要是系统调用所耗费的部分,而 user 则指自己程序的耗费 CPU,如果 User 时间高,则需要好好检查下自己的程序是否有问题,可能需要进行优化。
Blkio
优先从 CFQ(Completely Fair Queuing 完全公平的排队)拿数据,拿不到从这两个文件拿:· blkio.throttle.ioservicebytes,读写字节数 · blkio.throttle.io_serviced,读写次数
Throttle 这个单纯可能有误导,实际这些都不是限制值,而是实际值。每个文件的第一个字段是 major:minor 这样格式的 device ID。
网络数据
iptables
伪文件系统
网络设备接口
Virtual Ethernet
针网络的监控要精确到接口级别,即网卡级别。每个容器在 host 上都有一个对应的 virtual Ethernet,我们可以从这个设备获得 tx 和 rx 信息。
不过找到容器在主机上对应的虚拟网卡比较麻烦。这时候可以在宿主机上通过 ip netns 命令从容器内部取得网络数据。
为了在容器所在网络命名空间中执行 ip netns 命令,我们首先需要找到这个容器进程的 PID。
或者:
实际上 Docker 的实现也是从伪文件系统中读取网络 metric 的:
到此,相信大家对“Docker 数据采集的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!