说明:以下所有的指标都是在线服务,对于离线服务本人不熟悉.
吞吐量优化通常是在耗时能够满足业务需求的情况下进行优化,不能说单机可以处理1wqps,结果请求rt或者99线达到10s,这样肯定不行.
吞吐量的瓶颈有可能是服务本身容易达到瓶颈,下游服务容易达到瓶颈.
1.下游服务达到瓶颈
下游服务可能是db,mq,业务服务等等等架构上支持水平扩容,那么这就变成了钱的问题,加机器就完事了.
不支持水平扩容:数据库连接数已经快满了,这样就不能单纯的扩容了,此时可以进行业务的垂直拆分,把一部分业务拆分到独立的集群中.同时进行DB的拆分,这样可以降低DB的负载.
读写分离:让对数据的实时性不敏感的读请求 访问slave,避免所有的请求落到主库压力过大.或者通过CQRS架构,将query请求直接通过es检索.
业务垂直切分:把一个服务分为多个服务,服务功能保证聚合,这样是向微服务的方向发展。
2.服务本身达到瓶颈
服务本身达到瓶颈的原因比较多,可能是cpu,磁盘或者网卡达到瓶颈,这些依赖于服务的类型.或者由于代码有些问题,导致程序不能充分利用资源.一下说明单纯从技术角度分析,不涉及业务流程,每个业务的业务流程都不一样,能够优化业务流程比单纯的优化代码通常效果更好.cpu先达到瓶, 针对cpu的优化很多,对于web后端来说,上下文切换和各种伪共享是其中的一个比较主要的优化点工具:perf,火焰图,top等
引起上下文切换的原因:IO等待,锁等待等,可以优化IO模型(通常被底层框架封装,比较难以优化),优化锁等待通常会减少锁的力度,分片锁,无锁结构
磁盘瓶颈:对于hdd来说,因为有寻址等开销,通常会通过顺序写入数据来提升吞吐量,比如kafka和mysql. 对于ssd来说,本人不清楚,不多费口舌
网卡瓶颈: 可以尝试开启网卡多队列,提升网卡的性能. 如果业务上能进行网络数据的压缩,减少网卡的压力,也能够提升吞吐量.
业务优化下面说的都比较笼统:
1.空间换时间:
手段:用kafka堆积数据,进行消峰
2.时间换空间:
3.批量处理:批量更新,批量删除等等
4.减少业务请求:具体业务具体分析
5.资源池预加载:对象池,线程池
6.配置优化:java gc优化,php代码解析缓存优化等等
7.缓存优化