注意

本文档适用于 Ceph 的开发版本。

监控概述

本文档解释了 Ceph 监控堆栈和一些重要的 Ceph 指标。

Ceph 管理员可以探索 Ceph 部署的丰富可观测性堆栈,并可以利用 Prometheus、Alertmanager、Grafana 和脚本来创建定制的监控工具。

Ceph 监控堆栈

Ceph 部署了一个集成的监控堆栈,如 cephadm 文档的 监控服务 部分所述。使用这些或其它工具的具有外部全集群监控和可观测性系统的部署可以选择禁用 Ceph 默认部署的堆栈。

Ceph 指标

许多 Ceph 指标是从每个 Ceph 守护程序公开的性能计数器中收集的。这些 性能计数器 是原生的 Ceph 指标。

性能计数器由 ceph_exporter 守护程序渲染成标准的 Prometheus 指标。该守护程序在每个 Ceph 集群主机上运行,并公开一个端点,在该端点上,在主机上运行的 Ceph 守护程序公开的性能计数器以 Prometheus 指标的形式呈现。

除了 ceph_exporter 之外,Ceph Manager prometheus 模块还公开与整个 Ceph 集群相关的指标。

Ceph 提供了一个 Prometheus 端点,管理员、Grafana 和 Alertmanager 可以从该端点获取可用指标的完整列表或执行查询。

Prometheus(及相关系统)接受 PromQL 表达式格式的数据查询。PromQL 的详细文档可以在 [此处](https://prometheus.ac.cn/docs/prometheus/latest/querying/basics/) 查看,并且可以在常见的数字和印刷书籍来源找到几本优秀的书籍。

我们将在下面探讨一些 PromQL 查询。使用以下命令获取集群的 Prometheus 端点

示例

# ceph orch ps --service_name prometheus
NAME                         HOST                          PORTS   STATUS          REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
prometheus.cephtest-node-00  cephtest-node-00.cephlab.com  *:9095  running (103m)    50s ago   5w     142M        -  2.33.4   514e6a882f6e  efe3cbc2e521

有了这些信息,您可以连接到 http://cephtest-node-00.cephlab.com:9095 以访问 Prometheus 服务器界面,其中包括目标列表、表达式浏览器以及与 Prometheus 服务本身相关的指标。

完整的指标列表(带有描述)可在以下形式的 URL 获得:

http://cephtest-node-00.cephlab.com:9095/api/v1/targets/metadata

Ceph Dashboard 提供了一组丰富的图表和面板,用于显示最重要的集群和服务指标。本文档中的许多示例都取自 Dashboard 图形或从 Ceph Dashboard 公开的指标推断而来。

Ceph 守护程序健康指标

ceph_exporter 提供了一个名为 ceph_daemon_socket_up 的指标,该指标根据 Ceph 守护程序通过管理套接字响应的能力来指示其健康状态,其中值 1 表示健康,0 表示不健康。尽管 Ceph 守护程序在报告 ceph_daemon_socket_up=0 时可能仍然“存活”,但此状态表明其功能存在重大问题。因此,此指标是检测任何主要 Ceph 守护程序中问题的绝佳手段。

ceph_daemon_socket_up Prometheus 指标还具有如下所述的标签: * ceph_daemon:在主机上公开管理套接字的 Ceph 守护程序标识符。 * hostname:运行 Ceph 守护程序的主机名称。

示例

ceph_daemon_socket_up{ceph_daemon="mds.a",hostname="testhost"} 1
ceph_daemon_socket_up{ceph_daemon="osd.1",hostname="testhost"} 0

要识别在过去 12 小时内任何时间点无响应的任何 Ceph 守护程序,您可以使用以下 PromQL 表达式

ceph_daemon_socket_up == 0 or min_over_time(ceph_daemon_socket_up[12h]) == 0

性能指标

下面我们将探讨一些指示 Ceph 集群性能的指标。

所有这些指标都具有以下标签: * ceph_daemon:从中收集指标的 Ceph 守护程序标识符 * instance:公开指标的 exporter 实例的 IP 地址。 * job:Prometheus scrape 作业名称

下面是显示这些标签的 Prometheus 查询结果示例

ceph_osd_op_r{ceph_daemon="osd.0", instance="192.168.122.7:9283", job="ceph"} = 73981

集群吞吐量: 查询 ceph_osd_op_r_out_bytesceph_osd_op_w_in_bytes 以获取集群客户端吞吐量

示例

# Writes (B/s):
sum(irate(ceph_osd_op_w_in_bytes[1m]))

# Reads (B/s):
sum(irate(ceph_osd_op_r_out_bytes[1m]))

集群 I/O(操作): 查询 ceph_osd_op_rceph_osd_op_w 以获取客户端操作速率 (IOPS)

示例

# Writes (ops/s):
sum(irate(ceph_osd_op_w[1m]))

# Reads (ops/s):
sum(irate(ceph_osd_op_r[1m]))

延迟: 查询 ceph_osd_op_latency_sum 以衡量 OSD 在响应客户端请求开始传输数据之前的延迟

示例

sum(irate(ceph_osd_op_latency_sum[1m]))

OSD 性能

上述集群性能指标是从 OSD 指标中收集的。通过指定适当的标签值或正则表达式,我们可以检索集群中一个或子集 OSD 的性能指标

示例

# OSD 0 read latency
irate(ceph_osd_op_r_latency_sum{ceph_daemon=~"osd.0"}[1m]) / on (ceph_daemon) irate(ceph_osd_op_r_latency_count[1m])

# OSD 0 write IOPS
irate(ceph_osd_op_w{ceph_daemon=~"osd.0"}[1m])

# OSD 0 write thughtput (bytes)
irate(ceph_osd_op_w_in_bytes{ceph_daemon=~"osd.0"}[1m])

# OSD.0 total raw capacity available
ceph_osd_stat_bytes{ceph_daemon="osd.0", instance="cephtest-node-00.cephlab.com:9283", job="ceph"} = 536451481

物理存储驱动器性能:

通过将 Prometheus node_exporter 指标与 Ceph 集群指标结合起来,我们可以得出支持 Ceph OSD 的物理存储介质的性能信息。

示例

# Read latency of device used by osd.0
label_replace(irate(node_disk_read_time_seconds_total[1m]) / irate(node_disk_reads_completed_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# Write latency of device used by osd.0
label_replace(irate(node_disk_write_time_seconds_total[1m]) / irate(node_disk_writes_completed_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# IOPS of device used by osd.0
# reads:
label_replace(irate(node_disk_reads_completed_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# writes:
label_replace(irate(node_disk_writes_completed_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# Throughput for device used by osd.0
# reads:
label_replace(irate(node_disk_read_bytes_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# writes:
label_replace(irate(node_disk_written_bytes_total[1m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

# Physical drive utilization (%) for osd.0 in the last 5 minutes. Note that this value has limited mean for SSDs
label_replace(irate(node_disk_io_time_seconds_total[5m]), "instance", "$1", "instance", "([^:.]*).*") and on (instance, device) label_replace(label_replace(ceph_disk_occupation_human{ceph_daemon=~"osd.0"}, "device", "$1", "device", "/dev/(.*)"), "instance", "$1", "instance", "([^:.]*).*")

池指标

Ceph 池指标具有以下标签

  • instance:提供指标的 exporter 的 IP 地址

  • pool_id:Ceph 池的数字标识符

  • job:Prometheus scrape 作业名称

特定于池的指标包括

  • ceph_pool_metadata:有关池的信息,可与其他指标一起使用,以在查询结果和图表中提供更多信息。除了上述三个常见标签之外,此指标还提供以下内容

  • compression_mode:为池启用的压缩类型。值包括 lz4snappyzlibzstdnone。示例:compression_mode="none"

  • description:池数据保护策略的简短描述,包括副本数或 EC 配置文件。示例:description="replica:3"

  • name:池名称。示例:name=".mgr"

  • type:数据保护策略,replicated(副本)或 EC(纠删码)。示例:type="replicated"

  • ceph_pool_bytes_used:用户数据和元数据消耗的总原始容量(复制或 EC 之后)

  • ceph_pool_stored:存储在池中的总客户端数据(数据保护之前)

  • ceph_pool_compress_under_bytes:池中符合压缩条件的数据

  • ceph_pool_compress_bytes_used:池中已压缩的数据

  • ceph_pool_rd:每个池的客户端读取操作(每秒读取次数)

  • ceph_pool_rd_bytes:每个池的客户端读取操作字节数

  • ceph_pool_wr:每个池的客户端写入操作(每秒写入次数)

  • ceph_pool_wr_bytes:每个池的客户端写入操作字节数

有用的查询:

# Total raw capacity available in the cluster:
sum(ceph_osd_stat_bytes)

# Total raw capacity consumed in the cluster (including metadata + redundancy):
sum(ceph_pool_bytes_used)

# Total client data stored in the cluster:
sum(ceph_pool_stored)

# Compression savings:
sum(ceph_pool_compress_under_bytes - ceph_pool_compress_bytes_used)

# Client IOPS for a specific pool
reads: irate(ceph_pool_rd[1m]) * on(pool_id) group_left(instance,name) ceph_pool_metadata{name=~"testrbdpool"}
writes: irate(ceph_pool_wr[1m]) * on(pool_id) group_left(instance,name) ceph_pool_metadata{name=~"testrbdpool"}

# Client throughput for a specific pool
reads: irate(ceph_pool_rd_bytes[1m]) * on(pool_id) group_left(instance,name) ceph_pool_metadata{name=~"testrbdpool"}
writes: irate(ceph_pool_wr_bytes[1m]) * on(pool_id) group_left(instance,name) ceph_pool_metadata{name=~"testrbdpool"}

RGW 指标

这些指标具有以下标签

  • instance:提供指标的 exporter 的 IP 地址

  • instance_id:RGW 守护程序实例的标识符

  • job:Prometheus scrape 作业名称

示例

ceph_rgw_req{instance="192.168.122.7:9283", instance_id="154247", job="ceph"} = 12345

通用指标

  • ceph_rgw_metadata:提供有关 RGW 守护程序的通用信息。它可以与其他指标一起使用,以在查询和图表中提供上下文信息。除了三个常见标签外,此指标还提供以下内容

    • ceph_daemon:RGW 守护程序实例的名称。示例:ceph_daemon="rgw.rgwtest.cephtest-node-00.sxizyq"

    • ceph_version:RGW 守护程序版本。示例:ceph version 17.2.6 (d7ff0d10654d2280e08f1ab989c7cdf3064446a5) quincy (stable)"

    • hostname:运行守护程序的主机名称。示例:hostname:"cephtest-node-00.cephlab.com"

    • ceph_rgw_req:守护程序处理的请求数(GET``+``PUT``+``DELETE)。可用于检测瓶颈和优化负载分布。

    • ceph_rgw_qlen:守护程序的操作队列长度。可用于检测瓶颈和优化负载分布。

    • ceph_rgw_failed_req:中止的请求。可用于检测守护程序错误。

GET 操作指标

  • ceph_rgw_op_global_get_obj_lat_countGET 请求数

  • ceph_rgw_op_global_get_obj_lat_sumGET 请求的总延迟

  • ceph_rgw_op_global_get_obj_opsGET 请求总数

  • ceph_rgw_op_global_get_obj_bytesGET 请求传输的总字节数

PUT 操作指标

  • ceph_rgw_op_global_put_obj_lat_count:获取操作数

  • ceph_rgw_op_global_put_obj_lat_sumPUT 操作的总延迟时间

  • ceph_rgw_op_global_put_obj_opsPUT 操作总数

  • ceph_rgw_op_global_get_obj_bytesPUT 操作中传输的总字节数

其他有用的查询

# Average GET latency
rate(ceph_rgw_op_global_get_obj_lat_sum[30s]) / rate(ceph_rgw_op_global_get_obj_lat_count[30s]) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# Average PUT latency
rate(ceph_rgw_op_global_put_obj_lat_sum[30s]) / rate(ceph_rgw_op_global_put_obj_lat_count[30s]) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# Requests per second
rate(ceph_rgw_req[30s]) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# Total number of "other" operations (``LIST``, ``DELETE``, etc)
rate(ceph_rgw_req[30s]) -  (rate(ceph_rgw_op_global_get_obj_ops[30s]) + rate(ceph_rgw_op_global_put_obj_ops[30s]))

# GET latency per RGW instance
rate(ceph_rgw_op_global_get_obj_lat_sum[30s]) /  rate(ceph_rgw_op_global_get_obj_lat_count[30s]) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# PUT latency per RGW instance
rate(ceph_rgw_op_global_put_obj_lat_sum[30s]) /  rate(ceph_rgw_op_global_put_obj_lat_count[30s]) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# Bandwidth consumed by GET operations
sum(rate(ceph_rgw_op_global_get_obj_bytes[30s]))

# Bandwidth consumed by PUT operations
sum(rate(ceph_rgw_op_global_put_obj_bytes[30s]))

# Bandwidth consumed by RGW instance (PUTs + GETs)
sum by (instance_id) (rate(ceph_rgw_op_global_get_obj_bytes[30s]) + rate(ceph_rgw_op_global_put_obj_bytes[30s])) * on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata

# HTTP errors and other request failures
rate(ceph_rgw_failed_req[30s])

CephFS 指标

这些指标具有以下标签

  • ceph_daemon:MDS 守护程序的名称

  • instance:公开指标的 exporter 的 IP 地址和端口

  • job:Prometheus scrape 作业名称

示例

ceph_mds_request{ceph_daemon="mds.test.cephtest-node-00.hmhsoh", instance="192.168.122.7:9283", job="ceph"} = 1452

重要指标

  • ceph_mds_metadata:提供有关 MDS 守护程序的常规信息。它可以与其他指标一起使用,以在查询和图表中提供上下文信息。填充以下额外标签

    • ceph_version:MDS 守护程序版本

    • fs_id:CephFS 文件系统 ID

    • hostname:运行 MDS 守护程序的主机名称

    • public_addr:运行 MDS 守护程序的主机的公共地址

    • rank:MDS 守护程序的 rank

示例

ceph_mds_metadata{ceph_daemon="mds.test.cephtest-node-00.hmhsoh", ceph_version="ceph version 17.2.6 (d7ff0d10654d2280e08f1ab989c7cdf3064446a5) quincy (stable)", fs_id="-1", hostname="cephtest-node-00.cephlab.com", instance="cephtest-node-00.cephlab.com:9283", job="ceph", public_addr="192.168.122.145:6801/118896446", rank="-1"}
  • ceph_mds_request:MDS 的请求总数

  • ceph_mds_reply_latency_sum:回复延迟总计

  • ceph_mds_reply_latency_count:回复延迟计数

  • ceph_mds_server_handle_client_request:客户端请求数

  • ceph_mds_sessions_session_count:会话计数

  • ceph_mds_sessions_total_load:总负载

  • ceph_mds_sessions_sessions_open:当前打开的会话

  • ceph_mds_sessions_sessions_stale:当前过时的会话

  • ceph_objecter_op_r:读取操作数

  • ceph_objecter_op_w:写入操作数

  • ceph_mds_root_rbytes:守护程序管理的字节总数

  • ceph_mds_root_rfiles:守护程序管理的文件总数

有用的查询:

# Total MDS read workload:
sum(rate(ceph_objecter_op_r[1m]))

# Total MDS daemons workload:
sum(rate(ceph_objecter_op_w[1m]))

# Read workload for a specific MDS
sum(rate(ceph_objecter_op_r{ceph_daemon=~"mdstest"}[1m]))

# Write workload for a specific MDS
sum(rate(ceph_objecter_op_r{ceph_daemon=~"mdstest"}[1m]))

# Average reply latency
rate(ceph_mds_reply_latency_sum[30s]) / rate(ceph_mds_reply_latency_count[30s])

# Total requests per second
rate(ceph_mds_request[30s]) * on (instance) group_right (ceph_daemon) ceph_mds_metadata

块指标

默认情况下,不会收集图像的 RBD 指标,因为它们的基数可能很高。这有助于确保 Manager 的 prometheus 模块的性能。

要生成 RBD 图像的指标,请配置 Manager 选项 mgr/prometheus/rbd_stats_pools。有关更多信息,请参阅 Ceph 健康检查

这些指标具有以下标签

  • image:图像(卷)的名称

  • instance:exporter 运行的节点

  • job:Prometheus scrape 作业的名称

  • pool:RBD 池名称

示例

ceph_rbd_read_bytes{image="test2", instance="cephtest-node-00.cephlab.com:9283", job="ceph", pool="testrbdpool"}

重要指标

  • ceph_rbd_read_bytes:RBD 读取字节数

  • ceph_rbd_write_bytes:RBD 图像写入字节数

  • ceph_rbd_read_latency_count:RBD 读取操作延迟计数

  • ceph_rbd_read_latency_sum:RBD 读取操作延迟总时间

  • ceph_rbd_read_ops:RBD 读取操作计数

  • ceph_rbd_write_ops:RBD 写入操作计数

  • ceph_rbd_write_latency_count:RBD 写入操作延迟计数

  • ceph_rbd_write_latency_sum:RBD 写入操作延迟总计

有用的查询

# Average read latency
rate(ceph_rbd_read_latency_sum[30s]) / rate(ceph_rbd_read_latency_count[30s]) * on (instance) group_left (ceph_daemon) ceph_rgw_metadata

硬件监控

请参阅 硬件监控

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入