服务器性能提升
1️⃣ 如何提升服务器的性能 QPS
造成性能缺失的模块?
- 日志模块
- 锁竞争
- 内存分配
日志模块
目前存在的问题:
- 每个请求
INFO一次,都会导致每次日志都直接 落盘; - 多线程会频繁抢一个
logger锁; - 日志里频繁拼接大字符串、格式化时间;
优化思路:
worker线程启动时先将 日志器 注册到 异步日志线程 中;worker再将日志写入自己的 环形缓冲区 队列中;- 异步日志线程将缓冲区的内容进行 批量刷盘;
锁竞争
目前存在的问题:
- 使用的是 全局队列,每个线程都会去 抢任务,导致 锁竞争;
schedule一个任务,要抢锁;- 全局队列 取一个任务,要抢锁;
- 多线程一起调度,更抢锁;
优化思路:
- 执行思路:
- 每个工作线程优先执行自己的本地
ready queue; - 本地队列 空了,再去 全局队列 拿;
- 全局队列 也空了,再去偷别的线程的任务;
- 每个工作线程优先执行自己的本地
- 调度思路:
- 当前线程产生且没有强制绑定的任务,优先放到当前线程
local queue; - 强制指定对应线程执行的任务,放到对应线程的
local queue; - 没有归属或外部线程丢任务,放到 全局队列中;
- 当前线程产生且没有强制绑定的任务,优先放到当前线程
2️⃣ 协程的生命周期
创建(
INIT/READY):- 创建协程对象,分配栈、绑定入口函数。
- 此时协程还没跑,只是可调度。
就绪(
READY)- 被调度器放入 就绪队列,等待被调度执行。
运行(
RUNNING)- 调度器切换到协程栈,开始执行协程函数。
挂起(
SUSPEND/HOLD)- 协程执行到
yield,或因IO/定时器 让出执行权,回到调度器。
- 协程执行到
结束(
TERM)- 协程函数返回或异常退出,资源回收,栈释放或回到栈池。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 GYu的妙妙屋!
