k8s pod 分析
容器内使用内存
promethues 指标 container_memory_usage_bytes cat /sys/fs/cgroup/memory/memory.usage_in_bytes
promethues 指标 container_cpu_usage_seconds_total
cat /sys/fs/cgroup/cpu/cpuacct.usage
在Kubernetes (k8s)中,/sys/fs/cgroup/cpu/cpuacct.usage文件是用来统计CPU使用时间的。该文件记录了容器内所有进程在CPU上运行的累计时间。
具体计算方式如下:
- 每个CPU核心都有一个独立的计数器,用来记录CPU时间片的使用情况。
- 当一个进程在一个CPU核心上运行时,该核心的计数器会增加相应的值。
/sys/fs/cgroup/cpu/cpuacct.usage文件中的值是以纳秒为单位的累计时间,表示所有进程在CPU上的使用时间总和。
例如,如果/sys/fs/cgroup/cpu/cpuacct.usage的值为1000000000纳秒(1秒),则表示所有进程在CPU上的使用时间总和为1秒
要将/sys/fs/cgroup/cpu/cpuacct.usage的值转换为CPU使用率,需要结合时间间隔进行计算。以下是计算CPU使用率的一种常用方法:
- 获取两个时间点的
/sys/fs/cgroup/cpu/cpuacct.usage值(称为usage1和usage2)。 - 获取两个时间点之间的时间间隔(称为interval)。
- 计算CPU使用时间的差值:
usage_diff = usage2 - usage1。 - 将
usage_diff除以时间间隔,得到平均CPU使用时间:avg_cpu_usage = usage_diff / interval。 - 将
avg_cpu_usage除以CPU核心数,得到平均每个核心的CPU使用时间:avg_cpu_usage_per_core = avg_cpu_usage / num_cores。 - 将
avg_cpu_usage_per_core乘以100,得到CPU使用率:cpu_usage_percentage = avg_cpu_usage_per_core * 100。
请注意,num_cores表示CPU核心数,可以通过/proc/cpuinfo或其他相关工具来获取。此外,还需要注意时间间隔的单位与/sys/fs/cgroup/cpu/cpuacct.usage的单位一致(通常是纳秒)。
需要注意的是,CPU使用率是一个瞬时值,它表示在给定的时间段内CPU的工作量。因此,计算CPU使用率时需要多次采样,计算多个时间段的平均值,以获得更准确的结果。
https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
/sys/fs/cgroup
blkio cpu cpu,cpuacct cpuacct cpuset devices freezer hugetlb memory net_cls net_cls,net_prio net_prio perf_event pids rdma systemd
这些文件和目录是Linux系统中用于控制和管理进程资源的cgroup(Control Group)功能的一部分。cgroup允许用户将一组进程绑定到一个或多个资源控制器上,以限制或分配系统资源。
- blkio:用于控制和监视块设备的输入输出操作。
- cpu:用于控制和监视CPU资源分配。
- cpu,cpuacct:合并了cpu和cpuacct两个控制器,用于控制和监视CPU资源分配和统计。
- cpuacct:用于统计CPU资源的使用情况。
- cpuset:用于将进程绑定到特定的CPU和内存节点上。
- devices:用于控制和限制进程对设备的访问。
- freezer:用于冻结或解冻进程的状态。
- hugetlb:用于控制和分配大页面内存。
- memory:用于控制和监视内存资源分配。
- net_cls:用于将进程绑定到特定的网络类别。
- net_cls,net_prio:合并了net_cls和net_prio两个控制器,用于将进程绑定到特定的网络类别和优先级。
- net_prio:用于将进程绑定到特定的网络优先级。
- perf_event:用于监视进程的性能事件。
- pids:用于限制进程数量。
- rdma:用于控制和分配RDMA(远程直接内存访问)资源。
- systemd:用于与systemd集成的资源控制器。
/sys/fs/cgroup/memory
group.clone_children cgroup.event_control cgroup.procs memory.allow_duptext memory.direct_compact_latency memory.direct_reclaim_global_latency memory.direct_reclaim_memcg_latency memory.direct_swapin_latency memory.direct_swapout_global_latency memory.direct_swapout_memcg_latency memory.exstat memory.failcnt memory.fast_copy_mm memory.force_empty memory.high memory.idle_page_stats memory.idle_page_stats.local memory.kmem.failcnt memory.kmem.limit_in_bytes memory.kmem.max_usage_in_bytes memory.kmem.slabinfo memory.kmem.tcp.failcnt memory.kmem.tcp.limit_in_bytes memory.kmem.tcp.max_usage_in_bytes memory.kmem.tcp.usage_in_bytes memory.kmem.usage_in_bytes memory.limit_in_bytes memory.low memory.max_usage_in_bytes memory.memsw.failcnt memory.memsw.limit_in_bytes memory.memsw.max_usage_in_bytes memory.memsw.usage_in_bytes memory.min memory.move_charge_at_immigrate memory.numa_stat memory.oom.group memory.oom_control memory.pressure_level memory.priority memory.reap_background memory.soft_limit_in_bytes memory.stat memory.swap.events memory.swap.high memory.swappiness memory.usage_in_bytes memory.use_hierarchy memory.use_priority_oom memory.use_priority_swap memory.wmark_high memory.wmark_low memory.wmark_min_adj memory.wmark_ratio memory.wmark_scale_factor notify_on_release pool_size
在 /sys/fs/cgroup/memory 目录下的文件代表内存资源控制相关的信息,具体含义如下:
cgroup.event_control:用于控制内存资源控制的事件通知。cgroup.procs:列出属于该 cgroup 的进程 ID。cgroup.controllers:列出应用于该 cgroup 的控制器类型。cgroup.max.depth:指定了 cgroup 层次结构的最大深度。cgroup.stat:列出了 cgroup 的统计信息,例如内存使用量和限制。cgroup.subtree_control:用于控制子 cgroup 是否继承父 cgroup 的资源限制。memory.failcnt:记录在尝试分配内存失败的次数。memory.force_empty:用于强制清空 cgroup 的内存。memory.kmem.failcnt:记录在尝试分配内核内存失败的次数。memory.kmem.limit_in_bytes:限制内核内存的使用量。memory.kmem.max_usage_in_bytes:内核内存的最大使用量。memory.kmem.slabinfo:显示内核内存分配器的统计信息。memory.kmem.tcp.failcnt:记录在尝试分配 TCP 缓存的内核内存失败的次数。memory.kmem.tcp.limit_in_bytes:限制 TCP 缓存的内核内存使用量。memory.kmem.tcp.max_usage_in_bytes:TCP 缓存的内核内存的最大使用量。memory.kmem.tcp.usage_in_bytes:TCP 缓存的内核内存的使用量。memory.kmem.usage_in_bytes:内核内存的使用量。memory.limit_in_bytes:限制内存的使用量。memory.max_usage_in_bytes:内存的最大使用量。memory.move_charge_at_immigrate:控制在进程迁移时是否保留已使用的内存计数。memory.numa_balancing:控制 NUMA 平衡的开启和关闭。memory.oom_control:控制 OOM(Out of Memory)事件的处理方式。memory.pressure_level:显示内存压力级别。memory.soft_limit_in_bytes:设置软限制,超过软限制时会发生警告。memory.stat:列出了内存的统计信息,如分配数、释放数等。memory.swappiness:控制内存交换的程度。memory.usage_in_bytes:内存的使用量。memory.use_hierarchy:控制是否启用层次结构。memory.use_hierarchy:控制是否启用内存使用层次结构。
请注意,这只是其中一些常见的文件,实际文件可能会因系统配置和使用的 cgroup 控制器类型而有所不同。
https://zorrozou.github.io/docs/%E8%AF%A6%E8%A7%A3Cgroup%20V2.html http://arthurchiao.art/blog/cgroupv2-zh/ https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/using-cgroups-v2-to-control-distribution-of-cpu-time-for-applications_managing-monitoring-and-updating-the-kernel https://cloud.tencent.com/developer/article/2180278 https://jimmysong.io/kubernetes-handbook/practice/monitor.html https://www.infoq.cn/article/zccmnbvuzaizyzpucet0 https://zhuanlan.zhihu.com/p/179240571 https://kubernetes.feisky.xyz/setup/addon-list/metrics