线程池参数调优_rtt线程池

线程池参数调优_rtt线程池在TiKV中,线程池主要由gRPC、Scheduler、UnifyReadPool、Raftstore、StoreWriter、Apply、RocksDB以及其它一些占用CPU不多的定时任务与检测组件组成,这里主要介绍几个占用CPU比较多且会对用户读写请求的性能产生影响的线程池。gRPC线程池负责处理所有网络请求,它会把不同任务类型的请求转发给不同的线程池。Scheduler线程池配置项的值为0,Raftstore线程将日志写入到磁盘;如果该值不为0RocksDB。…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文主要介绍 TiKV 线程池性能调优的主要手段,以及 TiKV 内部线程池的主要用途。

线程池介绍

在 TiKV 中,线程池主要由 gRPC、Scheduler、UnifyReadPool、Raftstore、StoreWriter、Apply、RocksDB 以及其它一些占用 CPU 不多的定时任务与检测组件组成,这里主要介绍几个占用 CPU 比较多且会对用户读写请求的性能产生影响的线程池。

  • gRPC 线程池:负责处理所有网络请求,它会把不同任务类型的请求转发给不同的线程池。
  • Scheduler 线程池:负责检测写事务冲突,把事务的两阶段提交、悲观锁上锁、事务回滚等请求转化为 key-value 对数组,然后交给 Raftstore 线程进行 Raft 日志复制。
  • Raftstore 线程池:
    • 处理所有的 Raft 消息以及添加新日志的提议 (Propose)。
    • 处理 Raft 日志。如果 store-io-pool-size 配置项的值为 0,Raftstore 线程将日志写入到磁盘;如果该值不为 0,Raftstore 线程将日志发送给 StoreWriter 线程处理。
    • 当日志在多数副本中达成一致后,Raftstore 线程把该日志发送给 Apply 线程处理。
  • StoreWriter 线程池:负责将所有 Raft 日志写入到磁盘,再把结果返回到 Raftstore 线程。
  • Apply 线程池:当收到从 Raftstore 线程池发来的已提交日志后,负责将其解析为 key-value 请求,然后写入 RocksDB 并且调用回调函数通知 gRPC 线程池中的写请求完成,返回结果给客户端。
  • RocksDB 线程池:RocksDB 进行 Compact 和 Flush 任务的线程池,关于 RocksDB 的架构与 Compact 操作请参考 RocksDB: A Persistent Key-Value Store for Flash and RAM Storage
  • UnifyReadPool 线程池:由 Coprocessor 线程池与 Storage Read Pool 合并而来,所有的读取请求包括 kv get、kv batch get、raw kv get、coprocessor 等都会在这个线程池中执行。

TiKV 的只读请求

TiKV 的读取请求分为两类:

  • 一类是指定查询某一行或者某几行的简单查询,这类查询会运行在 Storage Read Pool 中。
  • 另一类是复杂的聚合计算、范围查询,这类请求会运行在 Coprocessor Read Pool 中。

从 TiKV 5.0 版本起,默认所有的读取请求都通过统一的线程池进行查询。如果是从 TiKV 4.0 升级上来的 TiKV 集群且升级前未打开 readpool.storage 的 use-unified-pool 配置,则升级后所有的读取请求仍然继续使用独立的线程池进行查询,可以将 readpool.storage.use-unified-pool 设置为 true 使所有的读取请求通过统一的线程池进行查询。

TiKV 线程池调优

  • gRPC 线程池的大小默认配置 (server.grpc-concurrency) 是 5。由于 gRPC 线程池几乎不会有多少计算开销,它主要负责网络 IO、反序列化请求,因此该配置通常不需要调整。

    • 如果部署的机器 CPU 核数特别少(小于等于 8),可以考虑将该配置 (server.grpc-concurrency) 设置为 2。
    • 如果机器配置很高,并且 TiKV 承担了非常大量的读写请求,观察到 Grafana 上的监控 Thread CPU 的 gRPC poll CPU 的数值超过了 server.grpc-concurrency 大小的 80%,那么可以考虑适当调大 server.grpc-concurrency 以控制该线程池使用率在 80% 以下(即 Grafana 上的指标低于 80% * server.grpc-concurrency 的值)。
  • Scheduler 线程池的大小配置 (storage.scheduler-worker-pool-size) 在 TiKV 检测到机器 CPU 核数大于等于 16 时默认为 8,小于 16 时默认为 4。它主要用于将复杂的事务请求转化为简单的 key-value 读写。但是 scheduler 线程池本身不进行任何写操作

    • 如果检测到有事务冲突,那么它会提前返回冲突结果给客户端。

    • 如果未检测到事务冲突,那么它会把需要写入的 key-value 合并成一条 Raft 日志交给 Raftstore 线程进行 Raft 日志复制。

      通常来说为了避免过多的线程切换,最好确保 scheduler 线程池的利用率保持在 50%~75% 之间。(如果线程池大小为 8 的话,那么 Grafana 上的 TiKV-Details.Thread CPU.scheduler worker CPU 应当在 400%~600% 之间较为合理)

  • Raftstore 线程池是 TiKV 中最复杂的一个线程池,默认大小 (由 raftstore.store-pool-size 控制) 为 2。StoreWriter 线程池的默认大小 (由 raftstore.store-io-pool-size 控制) 为 0。

    • 当 StoreWriter 线程池大小为 0 时,所有的写请求都会由 Raftstore 线程以 fsync 的方式写入 RocksDB。此时建议采取如下调优操作:

      • 将 Raftstore 线程的整体 CPU 使用率控制在 60% 以下。当把 Raftstore 线程数设为默认值 2 时,将 Grafana 监控上 TiKV-DetailsThread CPURaft store CPU 面版上的数值控制在 120% 以内。由于存在 I/O 请求,理论上 Raftstore 线程的 CPU 使用率总是低于 100%。
      • 不建议为了提升写性能而盲目增大 Raftstore 线程池大小,这样可能会适得其反,增加磁盘负担,导致性能变差。
    • 当 StoreWriter 线程池大小不为 0 时,所有写请求都由 StoreWriter 线程以 fsync 的方式写入 RocksDB。此时建议采取如下调优操作:

      • 仅在整体 CPU 资源比较充裕的情况下启用 StoreWriter 线程池,并将 StoreWriter 线程和 Raftstore 线程的 CPU 使用率控制在 80% 以下。

        与写请求在 Raftstore 线程完成的情况相比,理论上 StoreWriter 线程处理写请求能够显著地降低写延迟和读的尾延迟。然而,写入速度变得更快意味着 Raft 日志也变得更多,从而导致 Raftstore 线程、Apply 线程和 gRPC 线程的 CPU 开销增多。在这种情况下,CPU 资源不足可能会抵消优化效果,反而还可能比原来的写速度更慢,因此若是 CPU 资源不充裕则不建议开启 StoreWriter 线程。由于 Raftstore 线程把绝大部分的 I/O 请求交给 StoreWriter,因此 Raftstore 线程的 CPU 使用率控制在 80% 以下即可。

      • 大多数情况下将 StoreWriter 线程池的大小设为 1 或 2 即可。这是因为 StoreWriter 线程池的大小会影响 Raft 日志数量,所以该值不宜过大。如果 CPU 使用率高于 80%,可以考虑再增加其大小。

      • 注意 Raft 日志增多对其他线程池 CPU 开销的影响,必要的时候需要相应地增加 Raftstore 线程、Apply 线程和 gRPC 线程的数量。

  • UnifyReadPool 负责处理所有的读取请求。默认配置 (readpool.unified.max-thread-count) 大小为机器 CPU 数的 80% (如机器为 16 核,则默认线程池大小为 12)。

    通常建议根据业务负载特性调整其 CPU 使用率在线程池大小的 60%~90% 之间(如果用户 Grafana 上 TiKV-Details.Thread CPU.Unified read pool CPU 的峰值不超过 800%,那么建议用户将 readpool.unified.max-thread-count 设置为 10,过多的线程数会造成更频繁的线程切换,并且抢占其他线程池的资源)。

  • RocksDB 线程池是 RocksDB 进行 Compact 和 Flush 任务的线程池,通常不需要配置。

    • 如果机器 CPU 核数较少,可将 rocksdb.max-background-jobs 与 raftdb.max-background-jobs 同时设置为 4。

    • 如果遇到了 Write Stall,可查看 Grafana 监控上 RocksDB-kv 中的 Write Stall Reason 有哪些指标不为 0。

      • 如果是由 pending compaction bytes 相关原因引起的,可将 rocksdb.max-sub-compactions 设置为 2 或者 3(该配置表示单次 compaction job 允许使用的子线程数量,TiKV 4.0 版本默认值为 3,3.0 版本默认值为 1)。

      • 如果原因是 memtable count 相关,建议调大所有列的 max-write-buffer-number(默认为 5)。

      • 如果原因是 level0 file limit 相关,建议调大如下参数为 64 或者更高:

        rocksdb.defaultcf.level0-slowdown-writes-trigger rocksdb.writecf.level0-slowdown-writes-trigger rocksdb.lockcf.level0-slowdown-writes-trigger rocksdb.defaultcf.level0-stop-writes-trigger rocksdb.writecf.level0-stop-writes-trigger rocksdb.lockcf.level0-stop-writes-trigger

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190399.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • weka中文论坛

    weka中文论坛

    2021年8月15日
    91
  • HibernateTemplate使用方法

    HibernateTemplate使用方法HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。1、常用方法:   1)voiddelete(Objectentity):删除指定持久化实例   2)dele

    2022年6月16日
    24
  • Android应用开发揭秘9

    Android应用开发揭秘9Android应用开发揭秘9

    2022年5月9日
    27
  • 微信小程序+PHP实现登录注册(手把手教程)[通俗易懂]

    微信小程序+PHP实现登录注册(手把手教程)[通俗易懂]1.环境说明环境版本PHP版本号:PHP7(!!!!注意本文基于PHP7环境开发,PHP5与PHP7有很多语法不兼容,如果您的本地环境为PHP5,则需修改PHP代码中不兼容语法部分)MySQL版本号:5.7.26开发工具PhPstudy8.1.0.5微信开发者工具Navicat122.创建user表首先创建用户表,这里以Navicat工具为例2.1新建数据库如果是第一次使用Navicat,需要新建连接点击左上角的连接->选择MySQL…设置

    2022年9月16日
    0
  • python表白代码大全-python表白代码

    python表白代码大全-python表白代码广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。作者|马超编辑|jane来源|csdn博客【导语】转眼又到了咱们中国传统的情人节七夕了,今天笔者就带大家来领略一下用python表白的方式。让程序员的恋人们感受一下it人的浪漫。一、词云制作首先咱们可以用之前介绍过的wordcould包制作词云。…

    2022年5月27日
    36
  • Google收购Moto:天使还是魔鬼?

    Google收购Moto:天使还是魔鬼?前几天还在和Moto的朋友说,其实Google最应当收购的是Moto,没想到今天成了现实,说Google应当收购Moto基于几个原因: 1、可以一次性解决专利难题,作为模拟手机时代的霸主,GSM手机时代的千年老二,智能手机时代的佼佼者,Moto的专利储备至少足够应付Apple;

    2025年7月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号