当前位置: 首页 > 科技观察

如何正确计算Kubernetes容器的CPU使用率

时间:2023-03-17 18:10:25 科技观察

参数说明在kubernetes环境下使用Prometheus配置Container的CPU使用率时,经常会遇到CPU使用率超过100%的情况。这里解释一下:1.container_spec_cpu_period受限时,CFS调度的时间窗口,也就是容器CPU的时钟周期,通常为10万微秒2.container_spec_cpu_quota是指容器使用的CPU时间周期总量。如果设置quota为700,000,则表示容器可用CPU时间为7*100,000微秒,通常对应kubernetes的resource.cpu.limits的值。3.container_spec_cpu_share是指容器使用的宿主机CPU的相对值。比如share设置为500m,表示window在启动时会向host节点申请0.5个CPU,即50000微秒,通常对应于kubernetes的resource.cpu.requests的值所消耗的CPUcontainerkernelstateinonesecond6.container_cpu_user_seconds_totalstatistics容器用户态一秒消耗的CPU参考官方地址https://docs.signalfx.com/en/latest/integrations/agent/monitors/cadvisor。htmlhttps://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md具体公式1.默认情况下,如果直接使用container_cpu_usage_seconds_total,sum(irate(container_cpu_usage_seconds_total{container="$Container",instance="$Node",pod="$Pod"}[5m])*100)by(pod)默认统计数据为容器内所有CORE的平均使用率2.如果要准确计算CPU每个容器的利用率,以%的形式表示,如下:sum(irate(container_cpu_usage_seconds_total{container="$Container",instance="$Node",pod="$Pod"}[5m])*100)by(pod)/sum(container_spec_cpu_quota{container="$Container",instance="$Node",pod="$Pod"}/container_spec_cpu_period{container="$Container",instance="$Node",pod="$Pod"})b??y(pod)其中container_spec_cpu_quota/container_spec_cpu_period代表容器有多少个CORE2。参考git官方的issuehttps://github.com/google/cadvisor/issues/2026#issuecomment-415819667dockerstats如何计算dockerstats输出的索引列,如下:首先dockerstats通过获取直播数据流DockerAPI/containers/(id)/stats接口,然后通过dockerstats集成。在Linux中使用dockerstats输出的内存使用情况(MEMUSAGE)。Computation这一列其实就是没有Cache的内存。版本≤docker19.03的API接口输出中缓存使用情况对应字段为memory_stats.total_inactive_file,版本>docker19.03对应字段为memory_stats.cache。dockerstats输出的PIDS列表示容器创建的进程数或线程数。threads是Linux内核中的一个术语,也被称为轻量级进程&内核任务。1.如何通过DockerAPI查看容器资源使用率,如下$curl-s--unix-socket/var/run/docker.sock"http://localhost/v1.40/containers/10f2db238edc/stats"|jq-r{"read":"2022-01-05T06:14:47.705943252Z","preread":"0001-01-01T00:00:00Z","pids_stats":{"current":240},"blkio_stats":{"io_service_bytes_recursive":[{"major":253,"minor":0,"op":"Read","value":0},{"major":253,"minor":0,“op”:“写入”,“值”:917504},{“主要”:253,“次要”:0,“op”:“同步”,“值”:0},{“主要”:253,“次要”:0,“操作”:“异步”,“价值”:917504},{“主要”:253,“次要”:0,“操作”:“丢弃”,“价值”:0},{"major":253,"minor":0,"op":"Total","value":917504}],"io_serviced_recursive":[{"major":253,"minor":0,"op":"Read","value":0},{"major":253,"minor":0,"op":"Write","value":32},{“主要”:253,“次要”:0,“操作”:“同步”,“值”:0},{“主要”:253,“次要”:0,“操作”:“异步”,“值":32},{"major":253,"minor":0,"op":"丢弃","value":0},{"major":253,"minor":0,"op":“总计”,“价值”:32}],“io_queue_recursive”:[],“io_service_time_recursive”:[],“io_wait_time_recursive”:[],“io_merged_recursive”:[],“io_time_recursive”:[],“sectors_recursive”:[]},"num_procs":0,"storage_stats":{},"cpu_stats":{"cpu_usage":{"total_usage":251563853433744,"percpu_usage":[22988555937059,6049382848016,224114290,75,46725004835766513,6165050456944,27740046633494,6245013152748,29404953317631,5960151933082,29169053441816,5894880727311,25772990860310,5398581194412,22856145246881,5140195759848],"usage_in_kernelmode":30692640000000,"usage_in_usermode":213996900000000},"system_cpu_usage":22058735930000000,"online_cpus":16,“throttling_data”:{“periods”:10673334,“throttled_periods”:1437,“throttled_time”:109134709435}},“precpu_stats”:{“cpu_usage”:{“total_usage”:0,“usage_in_kernelmode”:0,“usage_in_usermode”:0},"throttling_data":{"periods":0,"throttled_periods":0,"throttled_time":0}},"memory_stats":{"usage":8589447168,"max_usage":8589926400,"stats":{“active_anon”:0,“active_file”:260198400,“缓存”:1561460736,“脏”:3514368,“hierarchical_memory_limit”:8589934592,“hierarchical_memsw_limit”:8589934592,“inactive_anon”:6947250176,“inactive_file”:1300377600,“mapped_file”:0,“pgfault”:3,“pgginfmault”,19153:184508478,“pgpgot”:184052901,“rss”:6947373056,“rss_huge”:6090129408,“total_active_anon”:total_active_anon“:0,“total_active_file”:total_tactive_file“:260198400,总计_总计”:,“total_inactive_file”:1300377600,“total_mapped_file”:0,“total_pgfault”:3519153,“total_pgmajfault”:0,“total_pgpgin”:total_pgpgin':total_pgpgin':184508478,“total_unevictable":0,"total_writeback":0,"unevictable":0,"writeback":0},"limit":8589934592},"name":"/k8s_prod-xc-fund_prod-xc-fund-646dfc657b-g4px4_prod_523dcf9d-6137-4abf-b4ad-bd3999abcf25_0","id":"10f2db238edc13f538716952764d6c9751e5519224bcce83b72ea7c876cc0475"2.如何计算官方地址https://docs.docker.com/engine/api/v1.40/#operation/ContainerStatsThe???precpu_stats是上次读取的CPU统计信息,用于计算CPU使用百分比。它不是cpu_stats字段的精确副本。如果precpu_stats.online_cpus或cpu_stats.online_cpus为nil然后为了与旧守护程序兼容,应使用相应cpu_usage.percpu_usage数组的长度。计算dockercli的stats命令显示的值工具可以使用以下公式:used_memory=memory_stats.usage-memory_stats.stats.cacheavailable_memory=memory_stats.limit内存使用率%=(used_memory/available_memory)*100.0cpu_delta=cpu_stats.cpu_usage.total_usage-precpu_stats.cpu_usage.total_usagesystem_cpu_delta=cpu_stats.system_cpu_usage-precpu_stats.system_cpu_usagenumber_cpus=lenght(cpu_stats.cpu_usage.percpu_usage)orcpu_stats.online_cpusCPU使用率%=(cpu_delta/system_cpu_delta)*number_cpus*100.0