python - 如何通过python获取ceph的磁盘使用情况
问题描述
我想获取我在 ceph 上的卷的磁盘使用情况。
rbd -p volumes list
volume-3968ca3d-d55f-47ac-9174-ff2614b0bde1
volume-493eee5c-3cdb-4c1c-b8d0-a24efba0c884
现在我可以通过其 ID 获取使用情况
rbd disk-usage volumes/volume-3968ca3d-d55f-47ac-9174-ff2614b0bde1
NAME PROVISIONED USED
volume-3968ca3d-d55f-47ac-9174-ff2614b0bde1@yasin1 1024M 532M
一切正常。我想通过 API 执行此命令。我阅读了https://docs.ceph.com/docs/mimic/rados/api/python/ 数百次,找不到任何解决方案来获得 python 的使用。
我该怎么做才能让pyhton使用?
解决方案
您的代码将类似于以下代码段。它将连接到集群。它将获取其 IO 上下文,创建一个 RBD 实例,该实例反过来可以检索 image_names,并且 image_name 用于访问最终具有 size() 方法的图像实例。这将为我们提供图像的最大尺寸。为了计算磁盘使用量,该diff_iterate
方法用于扫描整个图像以查找图像的现有/不存在对象。对于每个对象,都会调用计数器实例的 cb_offset 方法。如果对象存在,则计数会增加对象的长度。对于没有快速差异图的图像,这需要一段时间。相同的技术用于区分快照。在这种情况下,第三个参数diff_iterate
指向快照。在我们的例子中,我们喜欢区分时间的开始(一个空图像),所以它是无。
import rados
import rbd
class DiffCounter:
def __init__(self):
self.count = 0
def cb_offset(self, offset, length, exists):
if exists:
self.count+=length
def disk_usage():
cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
cluster.connect()
try:
ioctx = cluster.open_ioctx('rbd')
try:
rbd_inst = rbd.RBD()
try:
for image_name in rbd_inst.list(ioctx):
image = rbd.Image(ioctx, image_name)
max_size = image.size()
counter = DiffCounter()
image.diff_iterate(0,max_size,None,counter.cb_offset)
current_size = counter.count
print(image_name,max_size,current_size)
finally:
image.close()
finally:
ioctx.close()
finally:
cluster.shutdown()
if __name__ == '__main__':
disk_usage()
推荐阅读
- java - 如何使用 jar 运行黄瓜?
- reactjs - 如何从另一个类 React-native 调用函数
- laravel - 数据表ajax渲染中的按钮单击在Vue中不起作用
- javascript - 如何在网格中实现垂直列?ExtJS 6
- c# - 如何自动增加参加特定课程的学生人数?
- c# - 控制器查询参数(未生效)
- cordova - 为什么 ionic 应用程序在没有 webview 插件的情况下使用跨域工作
- reactjs - 如何在 Leaflet 地图中添加绘图工具栏(React 应用程序)
- python - selenium 中是否有任何功能可以关闭互联网连接并在特定时间后恢复?
- javascript - 根据第一个下拉列表中的选定选项,使特定选项在第二个下拉列表中消失