Rootwrap 守护进程模式

https://blueprints.launchpad.net/cinder/+spec/rootwrap-daemon-mode

Cinder 是需要 root 权限的项目之一。目前,这是通过 oslo.rootwrap 实现的,它必须使用 sudo 运行。sudo 和 rootwrap 都会产生显著的性能开销。本蓝图是缓解 rootwrap 部分开销的一系列蓝图之一,使用 rootwrap 的一种新模式——守护进程模式。这些蓝图将在多个项目创建,从 oslo.rootwrap 开始 [1]

问题描述

[2] 中所示,rootwrap 对 Neutron 造成了很大的性能开销。对 Cinder 的影响没有那么显著,但仍然存在。开销的详细信息在 [1] 中介绍。

用例

这将消除大量并发执行操作时的瓶颈。

提议的变更

本蓝图建议实现允许运行 oslo.rootwrap 守护进程的更改。守护进程的工作方式与常规 rootwrap 相同,但它接受通过经过身份验证的 UNIX 域套接字运行的命令,而不是命令行,并在后台持续运行。

请注意,这不是通过某些消息队列的常规 RPC。它使用 UNIX 套接字,因此没有可用的远程连接。它还使用通过 stdout(管道)与父进程共享的密钥进行摘要身份验证,因此没有其他进程可以访问守护进程。rootwrap 守护进程的更多详细信息在 [1] 中介绍。

use_rootwrap_daemon 配置选项应被添加,这将使 utils.execute 使用守护进程而不是常规 rootwrap。

备选方案

替代方法在 [5] 中进行了讨论。

数据模型影响

REST API 影响

安全影响

此更改需要一个额外的端点才能以 root 身份运行——cinder-rootwrap-daemon

使用客户端+守护进程代替普通 rootwrap 的所有安全问题在 [1] 中介绍。

通知影响

其他最终用户影响

性能影响

此更改为需要以 root 权限运行的磁盘操作引入了性能提升。Neutron 中 rootwrap 守护进程的当前状态显示,与常规 sudo rootwrap 调用相比,速度提高了 10 倍以上。Cinder 的总加速效果也令人印象深刻 [4]:测试场景 CinderVolumes.create_and_delete_volume 当前性能

操作

最小时间 (秒)

平均时间 (秒)

最大时间 (秒)

数量

cinder.create_volume cinder.delete_volume 总计

2.779 13.535 16.314

5.76 24.958 30.718

14.375 32.959 35.96

8 8 8

加载持续时间:131.423681974 总持续时间:135.794852018

启用 use_rootwrap_daemon 后

操作

最小时间 (秒)

平均时间 (秒)

最大时间 (秒)

数量

cinder.create_volume cinder.delete_volume 总计

2.49 2.183 4.673

2.619 2.226 4.845

3.086 2.353 5.3

8 8 8

加载持续时间:19.7548749447 总持续时间:22.2729279995

其他部署者影响

此更改引入了一个新的配置变量 use_rootwrap_daemon,它切换新的行为。请注意,默认情况下 use_rootwrap_daemon 将被关闭,因此要获得加速效果,必须将其打开。启用后,cinder-rootwrap-daemon 用于运行需要 root 权限的命令。

此更改还引入了一个新的二进制文件 cinder-rootwrap-daemon,它应与 cinder-rootwrap 一起部署。

开发人员影响

实现

负责人

主要负责人

Anton Arefiev(aarefiev)

工作项

这里唯一的工作项是实现新的配置变量,并使用它以守护进程模式运行 rootwrap。

依赖项

  • oslo.rootwrap 中的 rootwrap-daemon-mode 蓝图 [1]

测试

Rootwrap 对 rootwrap 客户端/守护进程部分有自己的功能测试 [3],Cinder 部分将由单元测试覆盖。

Cinder 有一种不寻常的用例,其中数十/数百 MB 的数据通过 stdin/out 传递(sheepdog 备份)——该测试用例应在功能测试中覆盖。

我们还可以添加一个新的 Tempest 作业,并启用 use rootwrap daemon 标志。

文档影响

在 cinder.conf 中设置 use_rootwrap_daemon=True 配置选项,以使 utils.execute 使用守护进程而不是常规 rootwrap。

参考资料