rbd基于存储池设置qos和基于image设置qos的区别和原理

设置方式

设置pool qos

rbd config pool set rbddata rbd_qos_read_bps_limit 10

相关参数还有rbd_qos_read_iops_limit,rbd_qos_write_bps_limit,rbd_qos_write_iops_limit

  • 设置效果

    [root@k8s-node1 ~]# rados listomapvals -p rbddata rbd_info
    metadata_conf_rbd_qos_read_bps_limit
    value (2 bytes) :
    00000000  31 30                                             |10|
    00000002
    

    可以看到是设置在了rbd_info这个omap属性中。

设置image qos

rbd config image set rbddata/lun1 rbd_qos_read_bps_limit 1

相关参数还有rbd_qos_read_iops_limit,rbd_qos_write_bps_limit,rbd_qos_write_iops_limit

  • 设置效果

    [root@k8s-node1 ~]# rados listomapvals -p rbddata rbd_header.64cc674090ca
    metadata_conf_rbd_qos_read_bps_limit
    value (1 bytes) :
    00000000  31                                                |1|
    00000001
    

    可以看到是在rbd的header对象的omap中设置的。

原理

  • 先看日志
2023-09-04 16:28:44.430 7f70557fa700 10 []librbd::image::OpenRequest: 0x563ee1faf140 send_refresh
2023-09-04 16:28:44.432 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_mutable_metadata
2023-09-04 16:28:44.433 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_mutable_metadata: r=0
2023-09-04 16:28:44.433 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_parent: legacy=0
2023-09-04 16:28:44.434 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_parent: r=0
2023-09-04 16:28:44.434 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_metadata: start_key=
2023-09-04 16:28:44.435 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_metadata: r=0
2023-09-04 16:28:44.435 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_metadata: start_key=conf_rbd_qos_read_bps_limit
2023-09-04 16:28:44.436 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_metadata: r=0
2023-09-04 16:28:44.436 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_pool_metadata: start_key=
2023-09-04 16:28:44.436 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_pool_metadata: r=0
2023-09-04 16:28:44.436 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 send_v2_get_pool_metadata: start_key=conf_rbd_qos_read_bps_limit
2023-09-04 16:28:44.437 7f70557fa700 10 []librbd::image::RefreshRequest: 0x7f70440065c0 handle_v2_get_pool_metadata: r=0
2023-09-04 16:28:44.437 7f70557fa700 20 []librbd::ImageCtx: apply_metadata
2023-09-04 16:28:44.437 7f70557fa700 20 []librbd::ImageCtx: apply_metadata: rbd_qos_read_bps_limit=1

从日志中可以看出最终rbd_qos_read_bps_limit设置成为了rbd_qos_read_bps_limit=1,说明以image为准。

  • 代码

    在open image的时候,会去refresh image,调用栈如下:

    |--RefreshRequest<I>::send_v2_get_metadata()
       |--RefreshRequest<I>::handle_v2_get_metadata
          |--RefreshRequest<I>::send_v2_get_pool_metadata()
             |--RefreshRequest<I>::handle_v2_get_pool_metadata
                |--ImageCtx::apply_metadata
    

    看似是调用获取pool的元数据在后,应该后面覆盖前,其实不然:

      if (!metadata.empty()) {
        m_metadata.insert(metadata.begin(), metadata.end());
        m_last_metadata_key = metadata.rbegin()->first;
        if (boost::starts_with(m_last_metadata_key,
                               ImageCtx::METADATA_CONF_PREFIX)) {
          send_v2_get_pool_metadata();
          return nullptr;
        }
      }
    

    在RefreshRequest::handle_v2_get_pool_metadata中m_metadata.insert行,m_metadata是一个map,如果kv存在,那么再往里插入,也不会成功。

    结论

    pool设置Qospool未设置Qos
    image设置了Qosimage 为准Image 为准
    image没有设置QosPool 为准无Qos

    但是对于image创建,如果配置文件中设置了qos,而pool中设置了qos,那么就以pool中为准,这个值会设置到image中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要查看实际的Ceph存储目录路径和镜像文件路径,可以使用以下命令和工具: 1. 使用 `rbd` 命令行工具:`rbd` 是 Ceph 提供的命令行工具,可以用于管理和操作 RBD 存储和镜像。使用以下命令可以列出所有存储和镜像的信息: ``` rbd pool ls rbd info --pool <pool-name> <image-name> ``` 将 `<pool-name>` 替换为实际的存储名称, `<image-name>` 替换为实际的镜像名称。 2. 使用 `ceph` 命令行工具:`ceph` 是 Ceph 的命令行管理工具,可以用于查看集群的状态和配置信息。使用以下命令可以获取存储和镜像的详细信息: ``` ceph osd pool ls rbd list --pool <pool-name> rbd info --pool <pool-name> --image <image-name> ``` 将 `<pool-name>` 替换为实际的存储名称, `<image-name>` 替换为实际的镜像名称。 3. 在 libvirt 的配置文件中查找:libvirt 的配置文件通常位于 `/etc/libvirt/storage/` 目录下,命名为 `<pool-name>.xml`。您可以查找相关存储的配置文件,其中会包含存储目录路径的信息。打开配置文件可以查看 `<path>` 元素的值以获取实际的存储目录路径。 ``` sudo cat /etc/libvirt/storage/<pool-name>.xml ``` 将 `<pool-name>` 替换为实际的存储名称。 请注意,具体的命令和路径可能会因系统和配置而有所不同。根据您的实际情况进行调整。如果您仍然遇到问题,请提供更多详细信息以便进一步帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值