-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
kiwi 线程模型,以及改进方案 #87
Comments
我建议先把这种模型的设计依据先提供出来,项目现在一个很大的问题就是团队内部对各自的工作都不是很了解(这点在我去请教的时候有非常深刻的体会),然后再思考着改进。 个人对于 Kiwi 的主要矛盾与次要矛盾的分析是:主要矛盾在于 Kiwi 与 BRaft 的结合(这是它实现分布式的方法),次要矛盾在于 Kiwi 对于 Redis 指令的兼容方法,其它都是次要(网络库等我认为不是很重要的事情)。 |
就我的理解来说,目前CmdTableManager是张预创建了每个cmd类指针的大表,为什么不把命令对象的创建放在命令执行的时候,需要执行什么样的命令就创建什么样的命令对象,命令执行完毕后销毁 |
频繁的创建和销毁对象是一个相对耗时的操作,还有对于服务这种长时间运行来说,频繁new delete会产生内存碎片。使用jemalloc这样的库能缓解,但不是最优解。 |
“频繁的创建和销毁对象是一个相对耗时的操作” 这个理论上当然重要,但是建议不要当做主要任务,避免“过早优化”。 |
worker thread为啥分为快和慢两种,以什么为标准呢?某一个快命令,长尾值可能又比较慢呢? |
较早的一些关于 kiwi 的线程池 doc PikiwiDB 网络层优化 OpenAtomFoundation/pikiwidb#223 |
线程模型
这是目前的线程模型,分为IO线程和worker线程,其中
IO线程可以分为 读线程 和 写线程
worker线程分为 快 慢 命令线程
如果没有开启读写分离,那么IO线程就只有读线程,此时读线程也会处理server向client写数据的功能
当前的命令处理逻辑
当一个client 使用 tcp连接的server时,这个client会被操作系统内核分配到一个IO线程(fd会分别放到对应的IO读和IO写线程)
当client向server发送数据的时候,会在IO读线程处理,然后解析resp协议,把得到的参数包装成一个 task 然后发到 worker线程池中
现在没有区分快慢命令,所有的命令(除了pipeline的命令)都会放到快线程中,pipeline的一组命令会放到 慢线程中
然后在对应的worker线程中,或者对应的命令对象,然后处理命令(操作rocksdb)
命令处理完成后,把数据放到 IO写线程中,然后发回client中
现在每个worker线程中到会有一份 命令对象,也就是
CmdTable
这个结构。问题
改进设想
在IO线程就能获取命令对象,并把命令对象放到 task 中以前传到线程池中
面临问题
new
delete
还请集思广益,想一个好的实现方案
The text was updated successfully, but these errors were encountered: