【从零实现JsonRpc框架#3】线程模型与性能优化

打印 上一主题 下一主题

主题 1875|帖子 1875|积分 5625

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.Muduo 的线程模型

Muduo 基于 Reactor 模式 ,采用 单线程 Reactor 多线程 Reactor 相结合的方式,通过事件驱动和线程池实现高并发。
1. 单线程模型



  • 焦颔首脑 :所有 I/O 操作(accept、read、write)和业务逻辑均在一个线程中完成。
  • 适用场景 :低并发、低耽误的简单场景(如代理服务器)。
  • 优点

    • 无锁,避免线程间同步开销。
    • 逻辑简单,调试方便。

  • 缺点

    • 无法充分利用多核 CPU。
    • 单个长耗时任务会阻塞整个事件循环。

2. 多线程模型(主从 Reactor)

Muduo 默认利用 主从 Reactor 模型 ,分为 Acceptor 线程 I/O 线程池


  • 主 Reactor(Acceptor 线程)

    • 负责监听端口(accept 新连接)。
    • 将新连接分发给子 Reactor(I/O 线程池)。

  • 子 Reactor(I/O 线程池)

    • 每个子 Reactor 对应一个 EventLoop 线程。
    • 负责处理已连接套接字的 I/O 事件(读写)。
    • 业务逻辑(如消息处理)默认在子 Reactor 线程中执行。

示例代码
  1. muduo::net::EventLoop loop;
  2. muduo::net::TcpServer server(&loop, listenAddr, "EchoServer");
  3. server.setThreadNum(4); // 设置 4 个 I/O 线程
  4. server.start();
  5. loop.loop();
复制代码
3. 线程池与任务分发



  • 线程池范例

    • I/O 线程池 :处理网络 I/O 事件(默认由 TcpServer 管理)。
    • 计算线程池 :将耗时业务逻辑提交到独立线程池,避免阻塞 I/O 线程。

  • 关键接口

    • EventLoop::runInLoop():将任务提交到当前线程的事件循环。
    • EventLoop::queueInLoop():将任务异步提交到事件循环队列。

2.性能优化策略

1. 淘汰线程上下文切换



  • 优化方法

    • 避免频繁创建/销毁线程,复用线程池。
    • 合理设置线程池大小(通常与 CPU 焦点数匹配)。
    • 将非 I/O 任务(如计算、日志)提交到独立线程池。

示例:
  1. // 将计算任务提交到计算线程池
  2. loop->runInLoop(std::bind(&computeTask));
复制代码
2. 零拷贝与高效缓冲区



  • Muduo 的 Buffer 类

    • 基于动态数组实现,主动扩容。
    • 利用 prependable 和 readable 区域淘汰内存拷贝。
    • 优化本领

      • 避免频繁调用 retrieve(),只管批量处理数据。
      • 直接操作 Buffer 的内存地点(如 peek())。


3. 淘汰系统调用开销



  • TCP_NODELAY :关闭 Nagle 算法,降低耽误。
  1. TcpConnection::setTcpNoDelay(true);
复制代码


  • SO_REUSEPORT :允很多个进程/线程绑定同一端口(需 Linux 3.9+)。
  • 缓冲区大小 :根据场景调整 Buffer 初始容量,淘汰扩容次数。
4. 负载平衡



  • 连接分发策略

    • 轮询(Round Robin) :将新连接匀称分配到所有 I/O 线程(默认策略)。
    • 一致性哈希 :根据连接特性(如 IP)固定分配到某个线程。

  • 优化效果 :避免单线程过载,提升吞吐量。
5. 内存管理优化



  • 对象池 :复用 TcpConnection、Buffer 等对象,淘汰内存碎片。
  • 内存对齐 :确保数据结构对齐,提升 CPU 缓存命中率。
6. 业务逻辑优化



  • 异步日志 :避免在 I/O 线程中同步写日志。
  • 批量处理 :将多个小消息合并为批量操作(如数据库写入)。
  • 协议计划 :利用二进制协议(如 Protocol Buffers)取代文本协议。
3、性能调优工具


  • 压测工具

    • ab(Apache Bench)、wrk、tcpcopy。

  • 性能分析

    • perf(Linux 性能分析工具)。
    • gprof、Valgrind(内存泄漏检测)。

  • 监控指标

    • QPS(每秒查询数)、RTT(往返耽误)、吞吐量、错误率。

4、总结


  • 线程模型 :主从 Reactor 模型是 Muduo 高性能的焦点,合理设置线程池大小可最大化 CPU 利用率。
  • 优化方向 :淘汰系统调用、内存拷贝、锁竞争,结合异步非阻塞计划。
  • 实践建议 :通过压测和性能分析工具定位瓶颈,渐渐优化。
通过上述方法,Muduo 可以轻松支持 10 万+ 并发连接 ,适用于高并发、低耽误的网络服务场景(如游戏服务器、实时通信)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表