本篇内容主要讲解“Docker容器内存监控怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker容器内存监控怎么实现”吧!
目前创新互联已为1000+的企业提供了网站建设、域名、网站空间、绵阳服务器托管、企业网站设计、贵溪网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
要明白docker容器内存是如何计算的,首先要明白linux中内存的相关概念。
使用free命令可以查看当前内存使用情况。
[root@localhost ~]$ free total used free shared buffers cachedMem: 264420684 213853512 50567172 71822688 2095364 175733516-/+ buffers/cache: 36024632 228396052Swap: 16777212 1277964 15499248
这里有几个概念:
mem: 物理内存
swap: 虚拟内存。即可以把数据存放在硬盘上的数据
shared: 共享内存。存在在物理内存中。
buffers: 用于存放要输出到disk(块设备)的数据的
cached: 存放从disk上读出的数据
为方便说明,我对free的结果做了一个对应。
[root@localhost ~]$ free total used free shared buffers cachedMem: total_mem used_mem free_mem shared_mem buffer cache -/+ buffers/cache: real_used real_freeSwap: total_swap used_swap free_swap
一般认为,buffer和cache是还可以再进行利用的内存,所以在计算空闲内存时,会将其剔除。
因此这里有几个等式:
real_used = used_mem - buffer - cachereal_free = free_mem + buffer + cachetotal_mem = used_mem + free_mem
了解了这些,我们再来看free的数据源。其实其数据源是来自于/proc/memeinfo文件。
[root@localhost ~]$ cat /proc/meminfo MemTotal: 264420684 kBMemFree: 50566436 kBBuffers: 2095356 kBCached: 175732644 kBSwapCached: 123688 kBActive: 165515340 kBInactive: 37004224 kBActive(anon): 92066880 kBInactive(anon): 4455076 kBActive(file): 73448460 kBInactive(file): 32549148 kBUnevictable: 362900 kBMlocked: 74696 kBSwapTotal: 16777212 kBSwapFree: 15499248 kBDirty: 2860 kBWriteback: 0 kBAnonPages: 24932928 kBMapped: 58165040 kBShmem: 71822688 kBSlab: 8374496 kBSReclaimable: 8163096 kBSUnreclaim: 211400 kBKernelStack: 45824 kBPageTables: 606296 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 148987552 kBCommitted_AS: 114755628 kBVmallocTotal: 34359738367 kBVmallocUsed: 772092 kBVmallocChunk: 34225428328 kBHardwareCorrupted: 0 kBAnonHugePages: 22083584 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kBDirectMap4k: 7168 kBDirectMap2M: 2015232 kBDirectMap1G: 266338304 kB
说完linux的内存,我们再来看下docker的内存监控。docker自身提供了一种内存监控的方式,即可以通过docker stats对容器内存进行监控。
该方式实际是通过对cgroup中相关数据进行取值从而计算得到。
cgroup中的memory子系统为hierarchy提供了如下文件。
[root@localhost ~]$ ll /cgroup/memory/docker/53a11f13c08099dd6d21030dd2ddade54d5cdd7ae7e9e68f5ba055ad28498b6f/ 总用量 0--w--w--w- 1 root root 0 2月 22 12:51 cgroup.event_control-rw-r--r-- 1 root root 0 5月 25 17:07 cgroup.procs-rw-r--r-- 1 root root 0 2月 22 12:51 memory.failcnt--w------- 1 root root 0 2月 22 12:51 memory.force_empty-rw-r--r-- 1 root root 0 3月 30 17:06 memory.limit_in_bytes-rw-r--r-- 1 root root 0 2月 22 12:51 memory.max_usage_in_bytes-rw-r--r-- 1 root root 0 2月 22 12:51 memory.memsw.failcnt-rw-r--r-- 1 root root 0 3月 30 17:06 memory.memsw.limit_in_bytes-rw-r--r-- 1 root root 0 2月 22 12:51 memory.memsw.max_usage_in_bytes-r--r--r-- 1 root root 0 2月 22 12:51 memory.memsw.usage_in_bytes-rw-r--r-- 1 root root 0 2月 22 12:51 memory.move_charge_at_immigrate-rw-r--r-- 1 root root 0 2月 22 12:51 memory.oom_control-rw-r--r-- 1 root root 0 3月 30 17:06 memory.soft_limit_in_bytes-r--r--r-- 1 root root 0 2月 22 12:51 memory.stat-rw-r--r-- 1 root root 0 2月 22 12:51 memory.swappiness-r--r--r-- 1 root root 0 2月 22 12:51 memory.usage_in_bytes-rw-r--r-- 1 root root 0 2月 22 12:51 memory.use_hierarchy-rw-r--r-- 1 root root 0 2月 22 12:51 notify_on_release-rw-r--r-- 1 root root 0 2月 22 12:51 tasks
这些文件的具体含义可以查看相关资料cgroup memory。
这里主要介绍几个与docker监控相关的。
[root@localhost 53a11f13c08099dd6d21030dd2ddade54d5cdd7ae7e9e68f5ba055ad28498b6f]$ cat memory.usage_in_bytes 135021858816[root@localhost 53a11f13c08099dd6d21030dd2ddade54d5cdd7ae7e9e68f5ba055ad28498b6f]$ cat memory.memsw.usage_in_bytes 135679291392[root@localhost 53a11f13c08099dd6d21030dd2ddade54d5cdd7ae7e9e68f5ba055ad28498b6f]$ cat memory.stat cache 134325506048rss 695980032mapped_file 16155119616pgpgin 21654116032pgpgout 21705492352swap 655171584inactive_anon 4218880active_anon 74202603520inactive_file 8365199360active_file 52449439744unevictable 0hierarchical_memory_limit 137438953472hierarchical_memsw_limit 274877906944total_cache 134325506048total_rss 695980032total_mapped_file 16155119616total_pgpgin 21654116032total_pgpgout 21705492352total_swap 655171584total_inactive_anon 4218880total_active_anon 74202603520total_inactive_file 8365199360total_active_file 52449439744total_unevictable 0
memory.stat包含有最丰富的
active_anon + inactive_anon = anonymous memory + file cache for tmpfs + swap cache
active_file + inactive_file = cache - size of tmpfs
docker原生内存监控
再来说到docker原生的docker stats。其具体实现在libcontainer中可以看到。其将容器的内存监控分为cache,usage,swap usage,kernel usage,kernel tcp usage。
其中cache是从memory.stat中的cache中获取。
usage是使用memory.usage_in_bytes和memory.limit_in_bytes进行相除来计算使用率。这一方式有一个弊端,就是不够细化,没有区分出cache部分,不能真正反映内存使用率。因为一般来说cache是可以复用的内存部分,因此一般将其计入到可使用的部分。
可以考虑的改进计算方式
改进方式在统计内存使用量时将cache计算排除出去。类似于linux中计算real_used时将buffer和cache排除一样。
cache并不能直接应用memory.stat中的cache,因为其中包括了tmpfs,而tmpfs算是实际使用的内存部分。
tmpfs即share memory,共享内存
因为在memory.stat中存在有
active_file + inactive_file = cache - size of tmpfs
因此可以计算实际使用的内存量为
real_used = memory.usage_in_bytes - (rss + active_file + inactive_file)
到此,相信大家对“Docker容器内存监控怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!