2023-01-16 mysql列存储引擎-多线程聚合-pack异步释放-需求分析
摘要:
目前在聚合多线程扫表的时, 遇到在线程切换时, 当LOCK_ONE策略导致其他线程的pack被释放引发crash的问题。并且当LOCK_ONE时, 每读取一个新的pack就会释放持有的旧的pack, 这样性能也不好.
考虑将pack的释放设计为异步的策略, 由独立的线程来完成对pack的释放.
多线程聚合在扫表时由于LOCK_ONE策略将发生在线程切换时候pack地址丢失.
除去已经新增的LOCK_ALL和LOCK_LRU策略, 考虑线程pack标识来作为控制。
遇到的问题:
- 独立的清理线程, 是新写一个独立的线程, 还是用现有的thread_pool?
- 用来标识pack是否正在使用的标识的数据结构如何设计?
- 如果对工作线程和清理线程的临界区设置线程同步策略?
- 要不要使用锁?
- 使用锁的坏处是什么, 会造成多大的坏处
- 锁的使用规则是什么? 为什么要加锁?
- 还是使用CAS?
- CAS的原子变量和标识的数据结构如何配合?
- 要不要使用锁?
- 工作线程设置和清理pack标识的接口
- LockPack
- 读取一个新pack时
- 设置读取的pack标识, 并清理保存的上一个pack的标识
- pack的标识为临界区, 与清理线程存在线程间同步
- 当能从缓存的pack池内查到, 并且标识位被清除导致pack被清理时, 重置该pack的标志位, 不清理该pack,继续使用缓存到的pack
- UnlockAll
- 释放时也仅仅是对pack标识的处理
- 不阻塞工作线程
- LockPack
- 清理线程的休眠和唤醒规则
- 是否要用条件