1️⃣ 如何提升服务器的性能 QPS

造成性能缺失的模块?

  • 日志模块
  • 锁竞争
  • 内存分配

日志模块

目前存在的问题:

  • 每个请求 INFO 一次,都会导致每次日志都直接 落盘
  • 多线程会频繁抢一个 logger 锁;
  • 日志里频繁拼接大字符串、格式化时间;

优化思路:

  • worker 线程启动时先将 日志器 注册到 异步日志线程 中;
  • worker 再将日志写入自己的 环形缓冲区 队列中;
  • 异步日志线程将缓冲区的内容进行 批量刷盘

锁竞争

目前存在的问题:

  • 使用的是 全局队列,每个线程都会去 抢任务,导致 锁竞争
    • schedule 一个任务,要抢锁;
    • 全局队列 取一个任务,要抢锁;
    • 多线程一起调度,更抢锁;

优化思路:

  • 执行思路:
    • 每个工作线程优先执行自己的本地 ready queue
    • 本地队列 空了,再去 全局队列 拿;
    • 全局队列 也空了,再去偷别的线程的任务;
  • 调度思路:
    • 当前线程产生且没有强制绑定的任务,优先放到当前线程 local queue
    • 强制指定对应线程执行的任务,放到对应线程的 local queue
    • 没有归属或外部线程丢任务,放到 全局队列中

2️⃣ 协程的生命周期

  • 创建(INIT/READY):

    • 创建协程对象,分配栈、绑定入口函数。
    • 此时协程还没跑,只是可调度。
  • 就绪(READY

    • 被调度器放入 就绪队列,等待被调度执行。
  • 运行(RUNNING

    • 调度器切换到协程栈,开始执行协程函数。
  • 挂起(SUSPEND/HOLD

    • 协程执行到 yield,或因 IO/定时器 让出执行权,回到调度器。
  • 结束(TERM

    • 协程函数返回或异常退出,资源回收,栈释放或回到栈池。