GDB多线程调试:Redis的IO多线程

Redis采用的网络模型是单线程的Reactor网络模型,异步处理,因为性能很高。
在这里插入图片描述

Reactor先从客户端获取请求,然后dispatch给具体的执行的线程。处理的流程即为read->decode->compute->encode->send。

而Redis的IO多线程的处理时,会构造一个消息队列,上述处理的流程中,只有compute为单线程串行执行,其余过程分发到不同的线程中执行。这意味着命令解析、执行、响应生成等仍然是在主线程中处理的,但是将客户端请求的读取和响应的写入操作可以在多个 I/O 线程中进行。

启用方式:
  • 在 Redis 配置中设置 io-threads-do-readsyes 并指定 I/O 线程的数量(通过 io-threads 选项)

  • 修改分发策略,int item_id = 0; 改为 int item_id = 1; 线程分发时先分发给IO线程而不是主线程中处理。

GDB调试步骤:

  • 确保可执行程序携带调试信息 -g -ggdb

  • 启动调试器: gdb可执行程序 gdb src/redis-server

  • 设置断点 break

    • 收集读任务:break networking.c : 2534

    在这里插入图片描述

    • 分发读任务:break networking.c : 4233

    在这里插入图片描述

    • 处理读任务:break processCommand
    • 收集写任务:break clientInstallWriteHandler
    • 处理写任务:break writeToClient
  • 运行程序:run redis.conf

    • 每一步中列出所有线程:info threads
    • 其中redis-server是主线程
    • io_thd1-3是io线程
  • 控制执行或者打印变量值或者查看调用堆栈

    • next n
    • step s
    • continue c
    • print
    • backtrace bt

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值