Ceph BackoffThrottle分析

【ceph相关】ceph常见问题处理 本文主要总结ceph使用过程中,常见的问题及处理措施 阅读详情


本文讨论下Ceph在Jewel中引入的 dynamic throttle:BackoffThrottle;分析后优化Ceph filestore,journal相关的throttle配置;

BackoffThrottle

Jewel引入了dynamic的throttle,就是代码中BackoffThrottle,现在filestore和Journal都是使用它来做throttle的;
class  FileStore
{
     BackoffThrottle throttle_ops, throttle_bytes;
}
 
class  JournalThrottle {
     BackoffThrottle throttle;
…
}
BackoffThrottle定义和相关参数如下:
/**
  * BackoffThrottle
  *
  * Creates a throttle which gradually induces delays when get() is called
  * based on params low_threshhold, high_threshhold, expected_throughput,
  * high_multiple, and max_multiple.
  *
  * In [0, low_threshhold), we want no delay.
  *
  * In [low_threshhold, high_threshhold), delays should be injected based
  * on a line from 0 at low_threshhold to
  * high_multiple * (1/expected_throughput) at high_threshhold.
  *
  * In [high_threshhold, 1), we want delays injected based on a line from
  * (high_multiple * (1/expected_throughput)) at high_threshhold to
  * (high_multiple * (1/expected_throughput)) +
  * (max_multiple * (1/expected_throughput)) at 1.
  *
  * Let the current throttle ratio (current/max) be r, low_threshhold be l,
  * high_threshhold be h, high_delay (high_multiple / expected_throughput) be e,
  * and max_delay (max_muliple / expected_throughput) be m.
  *
  * delay = 0, r \in [0, l)
  * delay = (r - l) * (e / (h - l)), r \in [l, h)
  * delay = h + (r - h)((m - e)/(1 - h))
  */
class  BackoffThrottle {
…
     /// see above, values are in [0, 1].
     double  low_threshhold =  0 ;
     double  high_threshhold =  1 ;
 
     /// see above, values are in seconds
     double  high_delay_per_count =  0 ;
     double  max_delay_per_count =  0 ;
 
     /// Filled in in set_params
     double  s0 =  0 ;  ///< e / (h - l), l != h, 0 otherwise
     double  s1 =  0 ;  ///< (m - e)/(1 - h), 1 != h, 0 otherwise
 
     /// max
     uint64_t max =  0 ;
     uint64_t current =  0 ;
…
}

filestore throttle举例分析

下面以使用BackoffThrottle的filestore throttle举例分析下其参数配置

filestore throttle的相关配置项

 
OPTION(filestore_expected_throughput_bytes, OPT_DOUBLE,  200  <<  20 )
OPTION(filestore_expected_throughput_ops, OPT_DOUBLE,  200 )
  
OPTION(filestore_queue_max_bytes, OPT_U64,  100  <<  20 )
OPTION(filestore_queue_max_ops, OPT_U64,  50 )
  
OPTION(filestore_queue_max_delay_multiple, OPT_DOUBLE,  0 )
OPTION(filestore_queue_high_delay_multiple, OPT_DOUBLE,  0 )
  
OPTION(filestore_queue_low_threshhold, OPT_DOUBLE,  0.3 )
OPTION(filestore_queue_high_threshhold, OPT_DOUBLE,  0.9 )
 

根据配置项初始化BackoffThrottle

bool BackoffThrottle::set_params(
     double  _low_threshhold,
     double  _high_threshhold,
     double  _expected_throughput,
     double  _high_multiple,
     double  _max_multiple,
     uint64_t _throttle_max,
     ostream *errstream)
{
     low_threshhold = _low_threshhold;
     high_threshhold = _high_threshhold;
     high_delay_per_count = _high_multiple / _expected_throughput;
     max_delay_per_count = _max_multiple / _expected_throughput;
     max = _throttle_max;
 
     if  (high_threshhold - low_threshhold >  0 ) {
         s0 = high_delay_per_count / (high_threshhold - low_threshhold);
     }  else  {
         low_threshhold = high_threshhold;
         s0 =  0 ;
     }
 
     if  ( 1  - high_threshhold >  0 ) {
         s1 = (max_delay_per_count - high_delay_per_count)
              / ( 1  - high_threshhold);
     }  else  {
         high_threshhold =  1 ;
         s1 =  0 ;
     }
}
 
int  FileStore::set_throttle_params()
{
     stringstream ss;
     bool valid = throttle_bytes.set_params(
                      g_conf->filestore_queue_low_threshhold,
                      g_conf->filestore_queue_high_threshhold,
                      g_conf->filestore_expected_throughput_bytes,
                      g_conf->filestore_queue_high_delay_multiple,
                      g_conf->filestore_queue_max_delay_multiple,
                      g_conf->filestore_queue_max_bytes,
                      &ss);
 
     valid &= throttle_ops.set_params(
                  g_conf->filestore_queue_low_threshhold,
                  g_conf->filestore_queue_high_threshhold,
                  g_conf->filestore_expected_throughput_ops,
                  g_conf->filestore_queue_high_delay_multiple,
                  g_conf->filestore_queue_max_delay_multiple,
                  g_conf->filestore_queue_max_ops,
                  &ss);
…
}

获取delay值

std::chrono::duration< double > BackoffThrottle::_get_delay(uint64_t c)  const
{
     if  (max ==  0 )
         return  std::chrono::duration< double >( 0 );
     double  r = (( double )current) / (( double )max);
     if  (r < low_threshhold) {
         return  std::chrono::duration< double >( 0 );
     }  else  if  (r < high_threshhold) {
         return  c * std::chrono::duration< double >(
                    (r - low_threshhold) * s0);
     }  else  {
         return  c * std::chrono::duration< double >(
                    high_delay_per_count + ((r - high_threshhold) * s1));
     }
}

如上述函数描述,分四种情况计算delay值:

  1. max = 0时:永远返回 0
  2. current/max < low_threshhold时:返回 0
  3. low_threshhold <= current/max < high_threshhold时:计算一值
  4. high_threshhold <= current/max时:计算一值

如图所示,在第一个区间的时候,也就是压力不大的情况下,delay值为0,是不需要wait的。当压力增大,x落入第二个区间后,delay值开始起作用,并且逐步增大, 当压力过大的时候,会落入第三个区间,这时候delay值增加明显加快,wait值明显增大,尽量减慢io速度,减缓压力,故而得名dynamic throttle。

默认情况下filestore throttle分析

filestore有bytes和ops两个throttle,这里以bytes为例分析:
默认情况下:filestore_queue_high_delay_multiple = 0, filestore_queue_max_delay_multiple = 0;
相当于BackoffThrottle中的值如下:
 
low_threshhold =  0.3
high_threshhold =  0.9
high_delay_per_count =  0
max_delay_per_count =  0
s0 =  0
s1 =  0
max =  100  <<  20
 
所以默认配置下,是关闭dynamic delay的;

开启dynamic throttle

参考最早的代码,配置:
filestore_queue_high_delay_multiple =  2
filestore_queue_max_delay_multiple =  10

其他使用默认值是,BackoffThrottle中的值如下:

low_threshhold =  0.3
high_threshhold =  0.9
high_delay_per_count =  2 /( 200  <<  20 )
max_delay_per_count =  10 /( 200  <<  20 )
s0 = ( 2 /( 200  <<  20 ))/ 0.6
s1 = ( 8 /( 200  <<  20 ))/ 0.1
max =  100  <<  20

则此时的delay分为如下几种:

c:             op->bytes,即一次请求的数据量

current:   当前filestore queue的数据量,初始化为 0,每次调用:throttle_bytes.get(o->bytes);{ current + = c;}

  1. current/max < low_threshhold时:此时 current < (30 << 20);delay = 0
  2. low_threshhold <= current/max < high_threshhold时:
    此时 (30 << 20) <= current < (90 << 20)
    delay = c * ((current/max - 0.3) * s0)
    a)current = 30 << 20时:delay = 0
    b)current = 90 << 20时:delay = c / (100 << 20)
  3. high_threshhold <= current/max时:
    此时 (90 << 20) < current
    delay = c * (2/(200 << 20) + (current/max - 0.9) * s1)
    a)current = 90 << 20时:delay = c / (100 << 20)
    b)current = 100 << 20时:delay = 5 * c / (100 << 20)

优化配置下的dynamic throttle

配置如下:

filestore_expected_throughput_bytes =   536870912     // 512M
filestore_queue_max_bytes=  1048576000                // 1000M
filestore_queue_low_threshhold =  0.6
filestore_queue_high_threshhold =  0.9    // 默认值
filestore_queue_high_delay_multiple =  2
filestore_queue_max_delay_multiple =  10

BackoffThrottle中的值如下:

low_threshhold =  0.6
high_threshhold =  0.9
high_delay_per_count =  2 /( 512  <<  20 )
max_delay_per_count =  10 /( 512  <<  20 )
s0 = ( 2 /( 512  <<  20 ))/ 0.3
s1 = ( 8 /( 512  <<  20 ))/ 0.1
max =  1000  <<  20

则此时的delay分为如下几种:

  1. current/max < low_threshhold时:此时 current < (600 << 20);delay = 0
  2. low_threshhold <= current/max < high_threshhold时:
    此时 (600 << 20) <= current < (900 << 20)
    delay = c * ((current/max - 0.6) * s0)
    a)current = 600 << 20时:delay = 0
    b)current = 900 << 20时:delay = c / (256 << 20)
  3. high_threshhold <= current/max时:
    此时 (900 << 20) < current
    delay = c * (2/(512 << 20) + (current/max - 0.9) * s1)
    a)current = 900 << 20时:delay = c / (256 << 20)
    b)current = 1000 << 20时:delay = 5 * c / (256 << 20)
结论:这里的参数配置不是很合理;600M之前的delay都是0;后续随着current的增大,delay的值小于默认时候的值,可能会加大filestore的压力;
Ceph 学习——OSD读写流程与源码分析(一) 消息从客户端发送而来,之前几节介绍了 客户端下 对象存储、块存储库的实现以及他们在客户端下API请求的发送过程(Ceph学习——Librados与Osdc实现源码解析 、 Ceph学习——客户端读写操作分析 、 Ceph学习——Librbd块存储库与RBD读写流程源码分析)。当请求被封装后,通过消息发送模块(Ceph学习——Ceph网络通信机制与源码分析)将请求及其相关信息发送到服务端实现真正的 阅读详情

相关推荐

Ceph性能优化 之 配置参数调优

该文同时发表在盛大游戏G云微信公众号,粘贴于此,方便各位查阅Ceph,相信很多IT朋友都听过。因为搭上了Openstack的顺风车,Ceph火了,而且越来越火。然而要用好Ceph却也不是件易事,在QQ群里就经常听到有初学者抱怨Ceph性能太烂,不好用。事实果真如此吗!如果你采用Ceph的默认配置来运行你的Ceph集群,性能自然不能如人意。俗话说,玉不琢,不成器;Ceph也有它的脾性,经过良好配置优化

梦幻之巅 3万+

《Ceph源码分析》——第2章,第5节Throttle

本节书摘来自华章出版社《Ceph源码分析》一书中的第2章,第2.5节Throttle,作者常涛,更多章节内容可以访问云栖社区“华章计算机”公众号查看 2.5 Throttle类Throttle用来限制消费的资源数量(也常称为槽位“slot”),当请求的slot数量达到max值时,请求就会被阻塞,直到有新的槽位释放出来,代码如下:`class Thrott...

weixin_34390996的博客 175

ceph的 cache tier实现分析

1 基本介绍 1.1 设计思想 数据的存储可划分为active和inactive两大类,active数据是小部分,会频繁访问,使用更高性能的底层存储介质进行存储;inactive的数据是全集,使用廉价的存储介质存储。这种分冷热的思想与CPU的多级缓存、操作系统的cache、各类软件系统的软件缓存是相通的,但ceph通过软件层面的配合,充分利用不同的硬件介质和软件存储模式,为上层用户提供透明统一...

Oshyn —— 乐而学,学而乐 3961

Ceph故障处理(一)-health_warn:clock skew detected on mon

造成集群状态health_warn:clock skew detected on mon节点的原因有两个,一个是mon节点上ntp服务器未启动,另一个是ceph设置的mon的时间偏差阈值比较小。 排查时也应遵循先第一个原因,后第二个原因的方式。 1、确认ntp服务是否正常工作 $ systemctl status ntpd 如果没有安装ntpd,可以参照以下文章进行安装,传送门:Centos7 搭建NTP服务器及客户端同步时间 2、修改ceph配置中的时间偏差阈值 在deploy节点修改配置文

小楼一夜听春雨,深巷明朝卖杏花 2724

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

EDSR-PyTorch实战:从模型下载到超分辨率图像生成

本文详细介绍了如何使用PyTorch实现EDSR模型进行超分辨率图像生成,包括环境配置、模型下载、参数调优及常见问题解决方案。EDSR作为超分辨率重建的利器,通过深度残差网络显著提升图像质量,特别适合老照片修复等场景。文章还提供了视频处理和自定义训练的进阶技巧,帮助开发者快速掌握这一技术。

weixin_29046035的博客 457

Ceph优化系列(二):Ceph主要配置参数详解

转载:Ceph配置参数详解 概述 Ceph的配置参数很多,从网上也能搜索到一大批的调优参数,但这些参数为什么这么设置?设置为这样是否合理?解释的并不多 本文从当前我们的ceph.conf文件入手,解释其中的每一项配置,做为以后参数调优和新人学习的依据; 参数详解 1,一些固定配置参数 1 2 3 fsid = 6d529c3d-5745-4fa5-be...

Yannick Jiang 的专栏 6994

手把手教你用Qt和QScada框架,从零搭建一个简易的工业组态监控界面

本文详细介绍了如何使用Qt和QScada框架从零搭建工业组态监控界面,涵盖环境配置、界面设计、动态数据绑定及高级功能实现。通过实战案例演示,帮助开发者快速掌握SCADA系统开发技巧,提升工业自动化项目的开发效率。

weixin_32932149的博客 340

Ceph 参数性能调优

Ceph 参数性能调优 Ceph调优参数 网络的各种Ceph参数的优化比较多,有些有效果,有些在某些场景下不但达不到预期的效果,反而有相反的效果。很多参数如果不了解其意义,面对不同的应用场景就显得无所适从,所以有必要简单的了解一下相关的原理。 Ceph的基本原理 Ceph数据写流程 [Image: file:///C:/-/blob/OQTAAAFdkNu/zXnOzzbyZdE5oKS

changtao381的专栏 1万+

打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1 minimal

编译打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1

qq_42013533的博客 2616

ISO 21434汽车网络安全标准深度解读系列(十):标准实施总结与展望

ISO21434标准深度解读系列总结篇系统回顾了汽车网络安全标准的核心内容与实施要点。文章梳理了10篇系列文章的结构体系,提炼出标准的三大核心价值:系统性方法(全生命周期覆盖、多层次管理)、风险导向理念(威胁驱动、动态管理)和供应链协同机制。总结了实施经验中的关键要素,包括高层承诺、专业团队建设,并提出了分阶段实施路径建议。同时分析了当前面临的技术挑战(系统复杂性、新兴技术)和管理挑战(文化转变、资源投入)。最后展望了AI应用、零信任架构等技术发展趋势,以及标准未来的演进方向,为企业实施提供战略与执行层面的

VehSwHwDeveloper的博客 557

Ceph优化系列(二):Ceph主要配置参数详解_ceph参数,精选软件测试面试真题集锦

*

2401_84247101的博客 1248

抓包网络调试工具 reqable抓包教程

如果CA根证书未安装成功,网络图标是黄色,点击盾牌图标可以进入CA根证书安装界面,详细步骤请阅读。在API调试中,获取流量是第一步也是最基本的操作,这里讲解下如何使用Reqable获取流量,通俗地讲就是抓包。我们可以选择一个图片请求,双击打开详情面板,能够看到该请求的详细信息。如果系统代理未设置,网络图标是黄色,点击网络图标可以自动设置系统代理。此域名的结构树,可以查看该域名下所有请求的目录结构,点击选择可以查看该请求的详情。首先,需要启用Reqable的调试功能,点击最右上角的。打开浏览器,输入地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2556

ceph Dynamic backoff throttle

为什么80%的码农都做不了架构师?>>> ...

weixin_34239169的博客 284

全志V3S嵌入式驱动开发(编译器升级到7.5)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 看过我们文章的朋友都知道,前面为了做v3s的驱动,对linux kernel进行了两次升级。第一次升级时从4.10.y升级到4.14.y,另外一次升级是从4.14.y升级到5.2.y。这中间最主要的原因,就是为了驱动适配的需要,更新的内核可以对硬件驱动有更好的支持,架构也更合理。 如果说内核升级尚且可以理解,那为什么要对编译器升级呢?这里面,最重要的一点就是语言的升

嵌入式-老费,一个分享专业嵌入式知识的blog 1166

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解 1. 背景介绍 1.1 什么是贝叶斯网络? 贝叶斯网络(Bayesian Networks)是一种基于概率论的图形模型,用于表示随机

AI天才研究院 1332

Ceph优化系列(二):Ceph主要配置参数详解_ceph参数,2024年最新offer拿到手软

filestore_commit_timeout = 3000 默认值 600 s FileStore::sync_entry() 里 new SyncEntryTimeout(m_filestore_commit_timeout)这样能很好的减少PG scrub时候占用PG lock的时间,避免过多影响PG正常的IO;filestore的fd cache是加速访问filestore里的file的,在非一次性写入的应用场景,增大配置可以很明显的提升filestore的性能;

2401_84301874的博客 1522

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ceph之throttle(io限流)

线程vdas

weixin_34417814的博客 468

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ceph中的Throttle类

throttle类用来限制资源数量,主要提供两个成员get/put函数用于操作资源。其源码实现在src/common/throttle.cc中 首先看看其构造函数 Throttle::Throttle(CephContext *cct, const std::string&amp; n, int64_t m, bool _use_perf) : cct(cct), name(n), ...

jason的笔记 1296

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

打造高性能高可靠块存储系统

块存储系统 分布式存储有出色的性能,可以扛很多故障,能够轻松扩展,所以我们使用Ceph构建了高性能、高可靠的块存储系统,并使用它支撑公有云和托管云的云主机、云硬盘服务。 由于使用分布式块存储系统,避免了复制镜像的过程,所以云主机的创建时间可以缩短到10秒以内,而且云主机还能快速热迁移,方便了运维人员对物理服务器上硬件和软件的维护。 用户对于块存储系统最直观的感受来源于云硬盘服务,现

笔尖的痕的专栏 1595

Ceph配置参数分析

Ceph参数配置详解

for_tech的博客 1万+

ceph——三副本读写——2

处理线程 void OSD::ShardedOpWQ::_process(uint32_t thread_index, heartbeat_handle_d *hb) |---auto&amp; sdata = osd-&gt;shards[shard_index]; //vector&lt;OSDShard*&gt; shards; |---if (sdata-&gt;pqueue-&gt...

w007d的专栏 2165

ceph常用命令及其使用、ceph集群定位常用命令说明【如ceph osd set norebalance】、ceph官方文档查询地址

文章目录ceph集群的监控检查集群的健康情况监控集群的时间查看集群的空间利用率查看集群的实时状态获取秘钥列表检查ceph mon查看mon状态的方法mon法定人数状态监控ceph osd查看osd树视图获取ceph集群和osd的详细信息查看添加到黑名单的客户端检查crush map信息检查集群的crush map信息查看crush map 工作集查看一个crush 规则集的详细信息搜索osd和它在...

崔崇鑫的博客,你linux/云运维工作中的百科全书。 2万+
上一篇: Ceph RGW远程同步(multisite)机制研究
下一篇: Ceph配置参数分析
for_tech
博客等级 码龄11年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值