性能分析之OS资源利用率和资源饱和度
性能分析之OS资源利用率和资源饱和度
在进行系统性能分析时,判断资源是否充足是一个核心问题。本文将详细介绍如何通过Prometheus和Grafana这两个常用的监控工具,来衡量操作系统(OS)的资源利用率和饱和度。文章将从CPU、内存、磁盘和网络四个方面展开讨论,帮助读者深入理解资源饱和度的计算方法和实际应用场景。
CPU资源
让我们先来看一个图表:
上图展示了CPU使用率和CPU饱和度两个指标。那么,CPU饱和度是如何计算的呢?我们来看一下Prometheus的查询语句:
node:node_cpu_saturation_load1:{cluster="$cluster"} / scalar(sum(min(kube_pod_info{cluster="$cluster"}) by (node)))
这个查询语句使用了node_cpu_saturation_load1
指标,其基础数据来源于:
sum by (node) (
node_load1{job="node-exporter"}
* on (namespace, pod) group_left(node)
node_namespace_pod:kube_pod_info:
) /
node:node_num_cpu:sum
record: 'node:node_cpu_saturation_load1:'
这里使用了node_load1
指标,该指标通过Node Exporter获取,对应于Linux系统中的1分钟负载平均值(load average)。需要注意的是,load average虽然常用于判断系统负载,但其局限性也需要了解。
因此,在判断CPU是否足够使用时,不仅要关注CPU使用率,还要结合CPU饱和度进行综合分析。
内存资源
接下来我们看内存资源的饱和度:
这里的内存饱和度后面加了一个Swap IO。实际上,Swap这个词在配置Kubernetes时通常会被关闭,但这里的Swap并不是指交换分区,而是指页交换(page in/out)。我们来看一下其查询语句:
node:node_memory_swap_io_bytes:sum_rate{cluster="$cluster"}
这个指标的计算方式如下:
- expr: |
1e3 * sum(
(rate(node_vmstat_pgpgin{job="node-exporter"}[1m])
+ rate(node_vmstat_pgpgout{job="node-exporter"}[1m]))
)
record: :node_memory_swap_io_bytes:sum_rate
这里取了vmstat的page in/out数据。需要注意的是,即使没有交换分区,页交换操作仍然会发生。判断内存是否足够使用,不仅要关注内存使用率,还要关注page in/out的情况。
磁盘资源
磁盘IO饱和度的判断相对直观。我们来看一下其查询语句:
node:node_disk_saturation:avg_irate{cluster="$cluster"} / scalar(:kube_pod_info_node_count:{cluster="$cluster"})
这个指标的来源是:
- expr: |
avg by (node) (
irate(node_disk_io_time_weighted_seconds_total{job="node-exporter",device=~"nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+"}[1m])
* on (namespace, pod) group_left(node)
node_namespace_pod:kube_pod_info:
)
record: node:node_disk_saturation:avg_irate
这里使用了node_disk_io_time_weighted_seconds_total
指标,其值来源于iostat中的avgqu-sz,即IO队列长度。
网络资源
在网络资源的判断上,这里使用了一个非常直接的指标——dropped(丢包)。来看一下其查询语句:
node:node_net_saturation:sum_irate{cluster="$cluster"}
这个指标的来源是:
- expr: |
sum by (node) (
(irate(node_network_receive_drop_total{job="node-exporter",device!~"veth.+"}[1m]) +
irate(node_network_transmit_drop_total{job="node-exporter",device!~"veth.+"}[1m]))
* on (namespace, pod) group_left(node)
node_namespace_pod:kube_pod_info:
)
record: node:node_net_saturation:sum_irate
这个指标反映了网络接收和发送的丢包情况。需要注意的是,仅仅关注丢包情况是不够的,还需要关注网络队列长度等其他指标。
总结
在进行性能分析时,理解每个指标的含义和来源至关重要。仅仅依赖监控平台或APM工具来定位瓶颈点是不够的,打好基础,深入理解系统资源的使用情况,才是解决问题的关键。