当前位置:
微信扫一扫分享到朋友圈
Linux的容器依赖于控制组, 控制组不仅追踪进程,而且提供有关CPU,内存指标和I / O块使用的信息。 您可以访问这些指标,并获得网络使用指标也是如此。 这些指的是“纯”LXC容器,docker容器其实也一样。 控制组 控制组通过一个伪文件系统暴露。 在最近的发行版,你应该在/sys/fs/cgroup下找到这个文件系统 。 根据该目录,你会看到多个子目录,所谓的设备,冷柜,blkio等; 每个子目录实际上对应于一个不同的cgroup层次结构。 在旧系统中,控制组可能被***在/cgroup ,没有明显的层次结构。 看不到各种子目录,你会看到一堆文件,在该目录中,有些目录可能相当于现在的容器。 找出你的控制组的挂载位置,你可以运行: $ grep cgroup /proc/mounts枚举的cgroup 你可以看看/proc/cgroups来观察系统已知的不同的控制组子系统,看看他们所属的层级,他们有多少个组。 你也可以看看/proc/&pid&/cgroup ,看看进程属于哪个控制组。 对照组将显示为相对于挂载点的根的相对路径; 例如, /表示“这个过程还没有被分配到一个特定的基团”,而/lxc/pumpkin意味着该过程很可能是一个命名为pumpkin的容器的成员 。 寻找CGROUP对于给定的容器 对于每个容器,人们会在每个层级中创建一个cgroup。 在旧系统与旧版本的用户态LXC工具,该cgroup的名称将是容器的名称。 对于LXC工具的最新版本,该cgroup将为lxc/&container_name&. 对于使用cgroup的docker容器,容器名称将为全面ID或容器的长ID。 如果容器显示为ae836c95b4c3在docker ps ,其长ID可能是这样的ae836c95b4c3c9e15512da89fdec91612f63cebae57df9a5444c79 。 你可以使用docker inspect或docker ps --no-trunc 查看。 把一切融合在一起,看一个docker容器内存指标,看一看/sys/fs/cgroup/memory/lxc/&longid&/ 。 内存,CPU,IO块:cgroup的指标 对于每一个子系统(内存,CPU和I / O块),你会发现一个或多个含统计信息详细的伪文件。 内存指标: memory.stat 内存指标被发现在“memory”的cgroup。 需要注意的是内存对照组增加了一个小的开销,因为它对你的主机上的内存使用情况非常细粒度的核算。 因此,许多发行版选择了默认不启用它。 一般情况下,启用它,你需要做的就是添加一些内核命令行参数: cgroup_enable=memory swapaccount=1 。 该指标是伪文件memory.stat 。 下面是它的样子: cache rss mapped_file pgpgin pgpgout swap 0pgfault pgmajfault 1724inactive_anon active_anon inactive_file active_file unevictable 32768hierarchical_memory_limit 4775807hierarchical_memsw_limit 4775807total_cache total_rss total_mapped_file total_pgpgin total_pgpgout total_swap 0total_pgfault total_pgmajfault 1724total_inactive_anon total_active_anon total_inactive_file total_active_file total_unevictable 32768所述第一半(无total_前缀)包含cgroup中有关于进程的统计信息,不包括子cgroup。 所述第二半(有total_前缀)还包括子cgroup。 有些指标是“仪表”,即,值可以增加或减少(例如,交换,交换空间使用的cgroup中的成员数量)。 有些是“计数器”,即值只能增加,因为它们代表特定事件发生的次数(例如,pgfault,这表明cgroup创立以来页面错误发生的数量,这个数量不能减少)。
控制组所使用的缓存量,可以精确地与在块设备上的块相关联。 当你读取和写入磁盘上的文件,这一数额将增加。 这将是这种情况,无论您使用“传统”的I / O( open , read , write系统调用),还是映射文件( mmap )。 甚至tmpfs挂载所使用的内存也是一样,虽然原因尚不清楚。 RSS:
不对应于任何磁盘上存储器的内存的量:栈,堆,和匿名内存映射。 mapped_file:
表示控制组的进程所映射的内存的量。 它不会告诉你用了多少内存; 它告诉你内存被用在了哪里。 pgfault和pgmajfault:
表明该cgroup的进程引发了“页错误”和“严重故障”,分别的次数。 当一个进程访问不存在的或受保护的虚拟内存空间的一部分, 页面错误发生。 前者可能发生,如果一个进程bug很多,并试图访问无效的地址(然后它收到一个SIGSEGV信号,通常这个信号杀死它并留下Segmentation fault消息)。 后者可能发生在, 当一个进程试图读取已经被换出的内存, 或者是一个映射到mapped file的内存:在这种情况下,内核会从磁盘装入该页面,然后让CPU完成内存存取。 它也可以发生在一个进程写入到一个写入时复制的内存区:同样的,内核将抢占进程,复制内存页,并恢复对页面的process`自己的副本的写操作。
“主要”故障发生时,内核实际上已经从磁盘读取数据。 当它只是复制现有的页面,或者分配一个空白页面,这是一个正常的(或“小”)故障。 swap:
目前使用的在本cgroup中的swap的量。 active_anon和inactive_anon:
内核认定的活跃和不活跃的匿名内存的量 。 匿名内存是不与磁盘页面相对应的内存。 换句话说,这就和上述的RSS计数器等效。 事实上,RSS计数器的定义就是active_anon + inactive_anon - tmpfs的 (控制组所挂载的tmpfs文件系统使用的内存的量)。 现在,什么是“活跃”和“不活跃”的区别? 页面最初是“活跃”; 并在固定的间隔,内核交换内存,并标记一些页面为“不活跃”。 每当它们被再次访问,它们被立即重新标记“活跃”。 当内核几乎是用尽了内存的时候, 就到了将内存写磁盘的时候了,内核会换掉那些不活跃的页。 active_file和inactive_file:
高速缓存,活跃还是不活跃类似于上面的匿名缓存。 确切的计算公式为=缓存+ active_file + inactive_file + tmpfs 。 内核用来移动活跃和非活跃集合之间内存页面的确切规则是和用于匿名内存的那些不同,但总的原则是相同的。 需要注意的是,当内核需要回收内存,回收干净的(=不修改)页面代价更低,因为它可以被立即回收(而匿名页面和脏/修改的页面必须首先写到硬盘上) 。 unevictable:
不能被回收的内存的量; 一般情况下,内存使用mlock来锁定, 就会被认定不可回收 。 它经常被加密框架使用,以确保密钥和其他敏感材料永远不会被交换到磁盘。 内存和MEMSW限制:
这些都不是真的度量,只是提醒应用cgroup中的限制。 第一个表示,可用于该控制组进程的物理内存的最大量; 第二个表示RAM +交换的最大量。计算内存中的页面缓存是非常复杂的。 如果在不同的对照组两个过程都读取相同的文件(最终依靠磁盘上的相同的块),相应的内存限制将在控制组之间进行分割。 这是很好的,但它也意味着,当一个cgroup中终止时,它可以增加另一个cgroup中的内存使用,因为它们不再为那些内存页面分摊成本。
CPU指标: cpuacct.stat 现在,我们已经覆盖了内存指标,相比起来其他的看起来很简单。
CPU指标在cpuacct控制器中。 对于每个容器,你会发现一个伪文件cpuacct.stat ,内容是容器的进程积累的CPU使用, 以及user和system的详细时间。 如果你不熟悉user和system的区别, user的时间,指的是进程直接控制CPU(即在执行过程中的代码)的时间,而system是CPU在执行代表进程的系统命令的时间。 这些时间是以1/100秒计数的。 其实,他们是用“用户的jiffies”计数的。 每秒有USER_HZ个“jiffies”,并在x86系统上, USER_HZ是100。这用来精确地映射到每秒“jiffies”数量; 但具有更高的频率调度的出现,以及无jiffies内核的出现 ,每秒jiffies的数目已经没有那么重要了。 它之所以存在,主要由于历史和兼容性的原因。 块I / O指标 块I / O由blkio控制器管理。 不同的指标分散在不同的文件。 虽然你可以在内核文档文件中找到深入blkio控制器的细节,这里是最相关的一些的一个简短列表:
blkio.sectors:
包含512字节扇区, 由cgroup的进程组写入和读取, 按设备顺序。 读取和写入的数量合并在一个计数器里。 blkio.io_service_bytes:
表示该cgroup读取和写入的字节数。 每个设备有4个计数器,因为每个设备,它区分同步和异步I / O,读取与写入。 blkio.io_serviced:
I / O操作的数量,无论大小。 每个装置也有4个计数器。 blkio.io_queued:
表示该cgroup中目前排队等候的I / O操作的数目。 换句话说,如果该cgroup没有做任何I / O,这将是零。 需要注意的是相反的是不正确的。 换句话说,如果没有I / O队列,这并不意味着该cgroup闲置(I / O-wise)。 它可以做纯粹的同步读取闲置设备,因此设备能够立即处理它们,无需排队。 此外,它还有助于找出哪个cgroup在给I / O子系统压力,记住,这是一个相对量。 即使一个进程组不执行更多的I / O,它的队列大小可以增加,只是因为由于其它设备的设备负荷增大。网络指标 网络指标没有被控制组直接暴露。 这是一个很好的解释为: 网络接口存在于网络命名空间范围内。 内核可能会积累一组进程发送和接收的包字节数的一些指标,但这些指标不会是非常有用的。 你想要芽每个接口的指标(因为发生在本地的lo接口的传输没有很大意义)。 但是,由于在一个cgroup中进程可以属于多个网络的命名空间,这些指标将更难解释:多个网络命名空间意味着多个lo接口,多个潜在eth0接口等; 所以这就是为什么没有简单的方法来用控制组收集网络指标。 然而,我们可以通过其他来源来收集网络指标: IPtables IPtables(或者更确切地说,netfilter的框架,iptables只是一个接口),可以做一些认真的核算。 例如,你可以设置一个规则来解释Web服务器上的出站HTTP流量: $ iptables -I OUTPUT -p tcp --sport 80没有-j或-g标志,因此该规则将仅计算匹配的数据包,然后转到下面的规则。 之后,你可以检查计数器的值: $ iptables -nxvL OUTPUT从技术上讲, -n不是必需的,但是它会阻止iptables做DNS反向查询,这些查询可能是在这种情况下无用。 计数器包括数据包和字节。 如果你想设置度量这样的容器运输,你可以执行for循环再添加两个iptables的规则, 为每个容器的IP地址(每个方向),在FORWARD链。 这将只计流量经过NAT层; 你还必须加流量经过用户级代理。 然后,你需要定期检查这些计数器。 如果你碰巧使用collectd ,有一个很好的插件,自动搜集iptables的计数器。 接口级计数器 由于每个容器都有一个虚拟以太网接口,你可能想直接检查该接口的TX和RX计数器。 你会发现,每个容器在您的主机关联到一个虚拟以太网接口,具有类似名称vethKk8Zqi 。 搞清楚哪个接口对应于容器,不幸的是,很难。 但就目前而言,最好的办法就是从容器中检查指标。 要做到这一点,你可以使用IP netns魔法, 在主机环境中的容器的网络空间内, 执行可执行文件。 该ip-netns exec命令可以让你执行任何程序(存在于宿主系统), 在当前进程可见的任何网络空间内。 这意味着,您的主机将能够进入你的容器的网络空间,但你的容器将无法访问主机,和他们的兄弟姐妹的容器。 容器将能够“看到”并影响其子容器,虽然。 该命令的具体格式是: $ ip netns exec &nsname& &command...&例如: $ ip netns exec mycontainer netstat -i ip netns使用命名空间的伪文件找到“my container”容器。 每个进程属于一个网络命名空间,一个PID命名空间,一个mnt命名空间,等等,这些命名空间放置在/proc/&pid&/ns/下 。 例如,PID 42的网络名称空间实体化为伪文件/proc/42/ns/net 。 当您运行ip netns exec mycontainer ... ,它预计/var/run/netns/mycontainer是那些伪文件之一。
(链接也可以。) 换言之,在容器的网络名称空间内执行的命令,我们需要: 找出我们要调查的容器内的任何进程的PID;创建一个符号链接/var/run/netns/&somename&到/proc/&thepid&/ns/net执行ip netns exec &somename& ....请查看枚举cgroup中, 学会如何在其中找到你要测量网络使用的容器中运行的进程的cgroup。 从那里,可以检查名为tasks的伪文件 ,其中包含有控制组中的PID(即,在容器中)。 选择其中的任何一个。 把一切融合在一起,如果一个容器的“短ID”设置在环境变量$CID中 ,那么你可以这样做: $ TASKS=/sys/fs/cgroup/devices/$CID*/tasks$ PID=$(head -n 1 $TASKS)$ mkdir -p /var/run/netns$ ln -sf /proc/$PID/ns/net /var/run/netns/$CID$ ip netns exec $CID netstat -i高性能指标收集的建议 需要注意的是要更新指标,每次运行一个新的进程是(相对)昂贵的。 如果你想收集高分辨率的指标,或搜集大量的容器(1000个容器在一台主机上)的,你不希望每次都fork一个新的进程。 下面是如何从一个单一的进程收集指标。 你将不得不用C来写你的指标收集器(或让你做低层次的系统调用的任何语言)。 你需要使用一个特殊的系统调用, setns()它可以让当前的进程输入任意命名空间。 但是, 它要求,命名空间伪文件的一个开放的文件描述符(记住:这是/proc/&pid&/ns/net 中的伪文件)。 然而,有一个问题:你不能保持这个文件描述符打开。 如果你这样做,当控制组的最后一个进程退出,命名空间不会被破坏,它的网络资源(如容器的虚拟接口)将永远都在(或直到您关闭文件描述符)。 正确的做法是记录每个容器的第一个PID,每一次重新打开空间伪文件。 当容器退出收集指标 有时候,你不关心实时度量收集,但是当一个容器退出,你想知道多少CPU,内存等已经使用。 docker使这很困难,因为它依赖于lxc-start ,之后它本身仔细清理,但它仍然是可能的。 它通常是比较容易收集定期指标(如,每分钟,使用collectd LXC插件),并且依赖于此。 不过,如果你仍想容器停止时收集统计,这里是如何: 对于每个容器,开始采集进程,并将其移动到要监视的控制组中, 通过写入其PID到cgroup中的任务文件。 收集过程中应定期重新读取任务文件来检查它是否是控制组的最后一道工序。
(如果你也想收集网络统计数据,上一节中所解释的,你也应该移动进程到适当的网络空间。) 当容器退出, lxc-start会尝试删除控制组。 它会失败,因为控制组仍在使用; 但是这很好。 你的程序应该检测到它是唯一一个留在组中。 现在是合适的时间来收集你需要的所有指标! 最后,你的过程应该将自己回到根对照组,并删除容器控制组。 要删除一个控制组,只是rmdir其目录。 rmdir目录有些反直觉,因为它仍包含文件; 但请记住,这是一个伪文件系统,所以通常的规则并不适用。 清理完成后,收集进程可以安全地退出。
分享给好友
分享到微信朋友圈:
第一步 打开微信底部扫一扫
第二步 扫下面的文章二维码
第三步 右上角点击转发
相关文章Relevant
■ 点击上面蓝字一键关注 ▲QIBU生活微刊建议在WIFI下观看,土豪请随意~~1、每一次接吻 会消耗体内至少12个卡路里科学家指出:...
我是主播 贝妮~(微信号:Voaoao)每天提供最热门、最火爆、最精彩的视频!口味有点儿重喔~笑死!笑死!笑死!如果觉得这些还...
【最费脑力的14部电影】《盗梦空间》、《记忆裂痕》、《生死停留》、《死亡幻觉》、《禁闭岛》、《穆赫兰道》、《蝴蝶效应》、...
现如今,飞机以舒适、方便与节省时间等原因成为出行首选的交通方式之一.可你是否知道,为何不能喝飞机上的冲泡茶饮,又为何在...
感知CG,感触创意,感受艺术,感悟心灵 在CG世界的一期中我们展示了 Vince Low的一部分作品,今天再次翻看CG网站时发现他的...
因女儿未出世便患肿瘤,柴静离职后首发雾霾调查.雾霾是什么?它从哪儿来?我们怎么办?看完这些,才知道雾霾的真相.震撼!震...当前位置:&&
大闹天宫OL神器进阶 神器1到9阶全数据介绍
作者:大坑 来源: 时间:14-05-30
大闹天宫OL神器进阶 神器1到9阶全数据介绍大家关系比较多的就是进阶数据,今天小编给大家带来就是神器1-9阶的进阶数据,在这里给各位玩家一个参考。1阶进2阶: 50个低级凝神丹左右2阶进3阶: 72个低级凝神丹左右3阶进4阶:106个中级凝神丹左右4阶进5阶:182个中级凝神丹左右5阶进6阶:414个高级凝神丹左右6阶进7阶:849个高级凝神丹左右7阶进8阶:1800个顶级凝神丹左右8阶进9阶:3388个顶级凝神丹左右进阶的同时达到了一些目标是可以领取一些资源的,给大家节约了不少成本,神器进阶的越高那么战斗力也就越高了,其实每进阶到下一个阶段中间是获取很多资源的~!
查看更多 精华内容 , 请
也可以 哦!
【责任编辑:大坑】
00000000雷囧强赞软文悲剧愤怒搞笑无聊期待
265G推荐游戏