devops icon indicating copy to clipboard operation
devops copied to clipboard

k8s pod 分析

Open heidsoft opened this issue 2 years ago • 0 comments

容器内使用内存

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上运行的累计时间。

具体计算方式如下:

  1. 每个CPU核心都有一个独立的计数器,用来记录CPU时间片的使用情况。
  2. 当一个进程在一个CPU核心上运行时,该核心的计数器会增加相应的值。
  3. /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使用率的一种常用方法:

  1. 获取两个时间点的/sys/fs/cgroup/cpu/cpuacct.usage值(称为usage1和usage2)。
  2. 获取两个时间点之间的时间间隔(称为interval)。
  3. 计算CPU使用时间的差值:usage_diff = usage2 - usage1
  4. usage_diff除以时间间隔,得到平均CPU使用时间:avg_cpu_usage = usage_diff / interval
  5. avg_cpu_usage除以CPU核心数,得到平均每个核心的CPU使用时间:avg_cpu_usage_per_core = avg_cpu_usage / num_cores
  6. 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

heidsoft avatar Sep 27 '23 09:09 heidsoft