为什么cinder-volume在删除volume时无反应

Cinder-volume的Volume Type介绍 一 Volume TypeCinder可以支持多个或多种存储后端(Multiple-Storage Backend)并存,每个存储后端都有自己的名字,但是这个名字并不要求是唯一的,可以被共用,此时cinder-scheduler会根据Filter来选择在哪个存储后端创建volume。二 volume type的相关操作Cinder中的卷类型,是卷的一种标识,各个OpenStack的发行者可根据自身... 阅读详情
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.youkuaiyun.com/quqi99/article/details/82220564

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (作者:张华 发表于:2018-08-30)

问题

cinder-volumes在删除volume时很慢, 并且此时create volume的其他操作也无反应, 也无日志.

理论

green thread的概念就是之间不共享数据, 每个green thread有自己的私有的数据对象, 并且非阻塞, 一个green thread的I/O没准备就下其他的green thread跟上. 从而实现在一个进程上高效地跑大量非阻塞的greenthread.
所以greenthread的哲学就是不共享数据对象的, 但greenthread也可以通过tpool.Proxy来共享数据对象, 例如: 使用eventlet.pools.Pool机制还构建httplib2.Http实例池在不同greenthread之间作一定程度共享 (见我五年前的一篇博客 - https://blog.youkuaiyun.com/quqi99/article/details/9114577 ). 但是这种共享有一个问题, 当pool里的native thread抛错了但不显示返回的话似乎会造成native thread无法yield从而导致所有green thread也被阻塞. 下面测试程序也可以说明这一点:

import thread
import eventlet
import time
orig = time
from eventlet import tpool

eventlet.monkey_patch()

class MyException(Exception):
    pass

class FOO(object):
    def foo(self, char, starting_ident):
        id=thread.get_ident()
        print "native {} exec foo({})".format(char, id)
        try:
            raise MyException()
        finally:
            # REPLACE with pass to reproduce failure
#             return
            pass

def stuff(char):
    print "entering green thread"
    while True:
        print "green exec foo({})".format(char)
        f = tpool.Proxy(FOO())
        f.foo(char, thread.get_ident())
        print "green finished foo({})".format(char)
        time.sleep(1)

if __name__ == "__main__":
    g = eventlet.greenthread.spawn(stuff, 'A')
    g = eventlet.greenthread.spawn(stuff, 'B')
    print "done"
    while True:
        time.sleep(1)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

rados.Rados实例来自python-rbd, 它本身又会spawn native thread去连接rados.
每个green thread都实例化一个rados.Rados进而启动一个native thread的话. 这些native thread之间是通过python解释器进程来同步数据的, native thread也不是非阻塞的. 所以当一个native thread在运行长任务不yield的话, 其他的green threads都没有机会运行, 所以此时无法对image做任何操作. 所以有这个patch (https://review.openstack.org/#/c/175555/ ) 引入了tpool.Proxy.
但是这个patch (https://review.openstack.org/#/c/197710/)又将它revert了, 理由是spawn出来的non-block native thread都去导入python module会造成死锁(According to Python documentation, code can
lead to a deadlock if the spawned thread directly or indirectly attempts
to import a module. ). 所以在_connect_to_rados这块又回到之前每个green thread都会实例化一个rados.Rados进而启动一个native thread的老方式, 但可以通过配置rados_connect_timeout缓解之前的问题( 一个green thread在超时时间内还连不就yield让其他green thread运行).
但是只是将_connect_to_rados这块改回老方式了, 还有其他使用tppool的方式, 如_get_usage_info就是通过tpool的方式:

    def RBDProxy(self):
        return tpool.Proxy(self.rbd.RBD())

    def _get_usage_info(self):
        total_provisioned = 0
        with RADOSClient(self) as client:
            for t in self.RBDProxy().list(client.ioctx):
                with RBDVolumeProxy(self, t, read_only=True) as v:
                ...
class RBDVolumeProxy(object):
    def __init__(self, driver, name, pool=None, snapshot=None,
                 read_only=False, remote=None, timeout=None):
        client, ioctx = driver._connect_to_rados(pool, remote, timeout)
        if snapshot is not None:
            snapshot = utils.convert_str(snapshot)

        try:
            self.volume = driver.rbd.Image(ioctx,
                                           utils.convert_str(name),
                                           snapshot=snapshot,
                                           read_only=read_only)
            self.volume = tpool.Proxy(self.volume)
        except driver.rbd.Error:
            LOG.exception("error opening rbd image %s", name)
            driver._disconnect_from_rados(client, ioctx)
            raise
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

如上代码:
- RBDProxy会通过tpool.Proxy采用非阻塞的native thread方式spawn rbd.RBD.
- RBDVolumeProxy也会通过tpool.Proxy采用非阻塞的native thread方式spawn rbd.RBD.
- _get_usage_info会周期性运行, 此时如果删除一个volume, 那么RBDVolumeProxy可能就会找不着image, 从而报下面的错: Image volume-1f3aa3d5-5639-4a68-be07-14f3214320c6 is not found. _get_usage_info /usr/lib/python2.7/dist-packages/cinder/volume/drivers/rbd.py
- 要知道 RBDVolumeProxy是一个native thread, 里面出了ImageNotFound异常又没有显示返回就会造成我们上面说的greenthread的问题. 这个green thread阻塞, 其他的green thread还能正常yield, 但其他green thread接着也会遇到这个ImageNotFound异常, 这样被阻塞的green thread越来越多 (如何验证了, 可以在上述测试代码里再加一个greenthread里跑一个死循环, 你会发现其他green thread死了不影响这个死循环的green thread)
- 解决方法就是最好设置rbd_exclusive_cinder_pool=True避免调用上面的_get_usage_info
- 我提了一个bug - https://bugs.launchpad.net/cinder/+bug/1789828
具体日志如下:

2018-08-29 06:57:41.604 1586622 DEBUG cinder.volume.drivers.rbd [req-f885ea4a-3e98-4aad-bb3f-102240aebca1 10cbcda6a7854fa79cfc37dc1945cb6d 5d5d0f0ab738467f8ca813dd41432afa - a51502c6e125414fbba0cc95decd86c5 a51502c6e125414fbba0cc95decd86c5] deleting rbd volume volume-2d5951be-25bf-4313-a706-593664f6cd2e delete_volume /usr/lib/python2.7/dist-packages/cinder/volume/drivers/rbd.py:977
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd [req-f885ea4a-3e98-4aad-bb3f-102240aebca1 10cbcda6a7854fa79cfc37dc1945cb6d 5d5d0f0ab738467f8ca813dd41432afa - a51502c6e125414fbba0cc95decd86c5 a51502c6e125414fbba0cc95decd86c5] error opening rbd image volume-005a04e7-a113-4ebb-bd77-1d9d3221d8f2: ImageNotFound: [errno 2] error opening image volume-005a04e7-a113-4ebb-bd77-1d9d3221d8f2 at snapshot None
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd Traceback (most recent call last):
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd   File "/usr/lib/python2.7/dist-packages/cinder/volume/drivers/rbd.py", line 147, in __init__
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd     read_only=read_only)
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd   File "rbd.pyx", line 1392, in rbd.Image.__init__ (/build/ceph-B2ToPL/ceph-12.2.4/obj-x86_64-linux-gnu/src/pybind/rbd/pyrex/rbd.c:13545)
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd ImageNotFound: [errno 2] error opening image volume-005a04e7-a113-4ebb-bd77-1d9d3221d8f2 at snapshot None
2018-08-29 06:57:41.610 1586622 ERROR cinder.volume.drivers.rbd
2018-08-29 06:57:41.612 1586622 DEBUG cinder.volume.drivers.rbd [req-f885ea4a-3e98-4aad-bb3f-102240aebca1 10cbcda6a7854fa79cfc37dc1945cb6d 5d5d0f0ab738467f8ca813dd41432afa - a51502c6e125414fbba0cc95decd86c5 a51502c6e125414fbba0cc95decd86c5] Image volume-005a04e7-a113-4ebb-bd77-1d9d3221d8f2 is not found. _get_usage_info /usr/lib/python2.7/dist-packages/cinder/volume/drivers/rbd.py:409

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试

1, 创建100个volume的脚本

#!/bin/bash -eu
. ~/stsstack-bundles/novarcv3_project
openstack project list| grep " admin "| awk '{print $2}'| xargs -l openstack quota set --volumes 200

TOKEN="`openstack token issue| grep ' id '| awk '{print $4}'`"
c_ep="`curl -s -XGET -H "X-Auth-Token: $TOKEN" "$OS_AUTH_URL/auth/catalog"| jq --raw-output '.catalog[] | select(.name | contains("cinderv3")).endpoints[] | select(.interface | contains("admin")).url'`"
echo "Cinder endpoint is $c_ep"

for i in {0..100}; do
(payload="`cat << EOF | python | sed 's/"/\\"/g'
import json
vol = {"volume": { "size": 1, "name": "vol"}}
print json.dumps(vol)
EOF`"
curl -s -X POST -H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" -d "$payload" ${c_ep}/volumes) &
done
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2, 删除这100个volume

openstack volume list| egrep -v "^\+-+|ID"| awk '{print $2}'| xargs openstack volume delete
 
  • 1

3, ceph-mon节点上观察volume的个数

watch -n 1 'rbd -p cinder-ceph ls| wc -l'
 
  • 1

4, cinder-volume节点上观察cinder-volume进程下创建的线程数

watch -n 1 'ps -eLf| egrep "[c]inder-volume"| wc -l'
 
  • 1
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" rel="stylesheet">
                </div>
OpenStack平台的cinder-volume卷服务状态down的解决方法 cinder-volume服务的状态如果是down,有可能的问题就是两个节点时间不一致导致的(可以分别查看一下两个节点的时间是否一致,不一致的话就按如下操作同步时间),两个节点分别同步一下时间即可。[此方法适合解决两个节点时间不一致所导致的cinder-volume服务状态down的问题] 在controller节点查看一下服务 #source /etc/keystone/admin-openrc.sh //运行环境变量 #cinder service-list //查看cinder服务 阅读详情

相关推荐

关于cinder servic-list只能看到cinder-scheduler

cinder-volume 启动失败 错误日志如下 [root@block ~]# tail /var/log/cinder/volume.log 2020-04-25 18:28:43.517 34731 ERROR cinder.cmd.volume from cinder.volume.flows.manager import create_volume 2020-04-25 18...

bbbzi的博客 789

为什么cinder-volume在删除volume时无反应 (by quqi99)

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (作者:张华 发表于:2018-08-30) 问题 cinder-volumes在删除volume时很慢, 并且此时create volume的其他操作也无反应, 也无日志. 理论 green thread的概念就是之间不共享数据, 每个green thread有自己的私有的数据对象, 并且非阻塞, 一...

技术并艺术着 1934

【OpenStack】Cinder(G版)中的volume type

声明: 本博客欢迎转发,但请保留原作者信息! 新浪微博:@孔令贤HW; 博客地址:http://blog.csdn.net/lynn_kong 内容系本人学习、研究和总结,如有雷同,实属荣幸! 一、volume type的相关操作 Cinder中的卷类型,是卷的一种标识,各个OpenStack的发行者可根据自身对系统的约束来定义卷类型的使用。G版的Cinder中与卷类型相关的两

代码改变世界 8810

七 Openstack Cinder存储

(本文所有提及OSP=OpenStack Platform) 1 云架构存储 1)Red Hat OpenStack Platform 中的存储: 虽然默认存储使用简单后端(LVM),但OpenStack Platform也支持企业级后端。包括最常用的SAN 基础架构,以及NAS 设备的支持,这允许将现有的存储基础架构作为OpenStack 的后端服务器连接本地存储,通常同时使用外...

My 1796

OpenStack之存储cinder

因为有了消息队列,子服务之间实现了解耦,这种松散的结构也是分布式系统的重要特征。用户向cinder-api发送请求,cinder-api接收API请求后将消息放入消息队列,通过cinder-scheduler处理消息队列 里请求,选择合适节点创建volume,由cinder-volume管理volume,volume provider为volume提供存储空间。3)文件系统无法共享:不同的操作系统使用不同的文件系统,格式化后,不同文件系统间的数据是无法共享的,虽然其他主机可以挂载,但是数据不能识别。

weixin_42795092的博客 1457

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

Cinder服务的基本使用

OpenStack早期版本是使用nova-volume为云平台提供持久性块存储服务。从Folsom版本后,就把作为Nova组成部分的nova-volume分离出来,形成了独立的Cinder组件。Cinder本身并不直接提供块存储设备实际的管理和服务,而是在虚拟机和具体的存储设备之间引入一个抽象的“逻辑存储卷”。

XiaoXinYAYAYA的博客 1400

Wio-LR1121多频段LoRa模块技术解析与应用实践

LoRa技术作为低功耗广域物联网(LPWAN)的核心通信方案,通过独特的扩频调制技术实现远距离传输与强抗干扰能力。其工作原理基于CSS(Chirp Spread Spectrum)调制,支持动态调整扩频因子(SF)和带宽(BW)来平衡传输距离与数据速率。Wio-LR1121模块作为Semtech LR1121芯片的载体,创新性地整合了sub-GHz、S-Band和2.4GHz多频段支持,配合仅1.35μA的睡眠电流,为跨境物联网部署提供了硬件基础。在智慧农业、工业监测等场景中,开发者可通过SPI接口快速集成

weixin_33742618的博客 416

加快Cinder中Volume的删除速度

问题 以前一篇博文OpenStack中删除Volume缓慢的问题 提到采用LVM作为后端存储时在删除Volume的时候为了安全有一个将整个Volume的数据清除的dd操作,如果Volume容量较大的话这个操作非常耗时, 并且如果同时删除一个存储服务器上的多个Volume的话会使服务器负载非常重,因此有必要来修改这个dd操作来加快Volume的删除。 解决方法 解决方法就是如前篇文章据说的只d

ugyn109的专栏 3562

(NOI)打表骗分过样例,暴力枚举出奇迹1.8.22题解

                                                                                                                                                           48818 B题解 #include &lt;iostream&gt; u...

Owen20071026的博客 3127

基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战(附完整源码与项目文档)

本文详细介绍了基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战,涵盖机器视觉技术、硬件选型、图像处理算法及C#上位机开发。通过实战案例展示如何实现高效、准确的PCB焊接缺陷检测,提升生产效率与质量,并附完整源码与项目文档。

mango的博客 218

Cinder详解

理解cinder 操作系统得到存储空间一般有两种方式: 块存储:挂接裸硬盘,分区,格式化,创建文件系统;或者直接使用裸硬盘存储数据 文件系统存储:通过nfs等方式挂载远程的文件系统 在块存储中,裸硬盘通常被称为volume(卷)。 理解了块存储,就能很容易的理解cinder。cinder是OpenStack平台中负责提供块存储服务的组件,它的任务就是管理volume从创建到删除的整个生命周期。...

freedom00001的博客 9592

matlab 异常值检测与处理——Robust Z-score法【2024最新版】

博客长期更新,本文最近一次更新时间为:2024年12月9日。

点云侠的博客 1516

第 6 章 Cinder - 055 - Detach Volume 操作

Detach Volume 操作 下图是 Detach 操作的流程图 1、向 cinder-api 发送 detach 请求 2、cinder-api 发送消息 3、nova-compute detach volume 4、cinder-volume 删除 target 详细分析: 1、向 cinder-api 发送 detach 请求 客户(可以是 OpenSta...

weixin_34238642的博客 380

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色。

字节流动 3万+

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1033

OpenStack — Cinder

文章目录CinderCinder组件cinder-apicinder-volumecinder-schedulercinder-backupVolume Provider Cinder Cinder(Block Storage service)提供对volume从创建到删除整个生命周期的管理,从instance的角度看,挂载的每一个volume都是一块硬盘。 在openstack最小化安装中,可以选择不安装Cinder服务,此时所有的虚拟机的磁盘数据都会写入到启动这个虚拟机的计算节点上的本地磁盘。因此会面临

李少侠 2273

在VINS-FUSION上处理KITTI数据集(双目+GPS)

VINS-Fusion 是一个开源的实时多传感器状态估计库,主要由香港科技大学的沈邵劼教授领导的研究团队开发。它是 VINS-Mono(单目视觉惯性系统)的扩展,支持多种传感器组合,如双目、立体相机和IMU。

如果想成为中心,那么就到中心去吧。 1205

删除多余的cinder-volume 服务

#删除多余的cinder-volume 服务[root@controller11 ~]# cinder service-list +------------------+-------------------+------+----------+-------+----------------------------+-----------------+ | Binary | ...

zuopiezia的博客 6035

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Openstack Cinder源码分析-删除Volume(一)

删除API入口:cinder/api/v2/volumes.py def delete(self, req, id): """Delete a volume.""" context = req.environ['cinder.context'] cascade = utils.get_bool_param('cascade', req.params) L...

iov_aaron的专栏 627

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

openstack cinder-volume 的高可用(HA)

为了保证云平台的稳定性,需要做很多部分的高可用。比如控制节点高可用、计算节点高可用、网络节点高可用、存储的高可用等;控制节点的高可用与网络节点的高可用都有官方的文档,有详细的安装步骤,实现起来相对来说比较简单。存储的高可用在openstack这一块也不用考虑很多,比如ceph、glusterfs自带高可靠性。当做了这些高可用后,我发现cinder-volume是一个瓶颈,如果它挂了的话,现有已经挂...

塔尖草的博客 4082

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

第 6 章 Cinder - 058 - Snapshot Volume 操作

Snapshot Volume 操作 Snapshot 可以为 volume 创建快照,快照中保存了 volume 当前的状态,以后可以通过 snapshot 回溯。 snapshot 操作实现比较简单,流程图如下: 1、向 cinder-api 发送 snapshot 请求 2、cinder-api 发送消息 3、cinder-volume 执行 snapshot 操作...

weixin_34319999的博客 373

删除无用的cinder-volume服务

删除无用的cinder-volume服务

bpb_cx的博客 755

第 6 章 Cinder - 057 - Delete Volume 操作

Delete Volume 操作 状态为 Available 的 volume 才能够被 delete。 如果 volume 当前已经 attach 到 instance,需要先 detach 后才能 delete。 Delete操作实现比较简单,流程图如下: 1、向 cinder-api 发送 delete 请求 2、cinder-api 发送消息 3、cinder-...

weixin_34391854的博客 385

OpenStack中删除Volume缓慢的问题

在OpenStack中不管是使用nova-volume还是Cinder,发现在删除创建的Volume时特别的慢,我这里Volume服务是采用iSCSI实现的,后端的存储采用的是LVM。 按理说这个删除应当是挺快的,修改下数据库,删除创建的iSCSI及对应的LV即可。所以一直很疑惑这个慢的原因,今天在QQ群有人提到这事,内容如下: 成都-崔昊之(61755280) 14:58:53 删除卷的时候

ugyn109的专栏 3424
上一篇: OpenStack 的 metadata 服务机制
下一篇: python的staticmethod,classmethod和装饰器以及闭包
鲁班七十七号
博客等级 码龄10年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值