设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

高性能高并发系统的稳定性保障

发布时间:2021-01-07 06:30 所属栏目:53 来源:网络整理
导读:《高性能高并发系统的稳定性保障》要点: 本文介绍了高性能高并发系统的稳定性保障,希望对您有用。如果有疑问,可以联系我们。 作者:肖飞,于2011年8月份加入京东,曾亲身参与到京东的应用性能监控、统一日志、流式计算、内存缓存、四层防攻击等一些基础技术

《高性能高并发系统的稳定性保障》要点:
本文介绍了高性能高并发系统的稳定性保障,希望对您有用。如果有疑问,可以联系我们。

作者:肖飞,于2011年8月份加入京东,曾亲身参与到京东的应用性能监控、统一日志、流式计算、内存缓存、四层防攻击等一些基础技术平台的研发和搭建工作,经历了京东的技术系统从简单粗放向复杂精细化的演变过程.目前主要工作为多中心交易项目中的数据复制中间件JingoBUS的研发.平时也会开发一些公共的平台和工具,关注分布式系统的实现、程序设计、性能优化、开发语言等.

本文是2015年肖飞在内部分享的《高性能高并发系统的稳定性保障》PPT内容.

性能、并发、稳定性三者关系

  • 高性能:高吞吐量、低延时
  • 公式:吞吐量(并发)=单位时间/平均延时
  • N-th% Latency:TP99,TP999
  • 稳定性:低延时的稳定性标准为TP99/TP999是隐含的必要条件;系统的稳定性标准:高+可用;用户标准

吞吐量:QPS,TPS,OPS等等,并发.并不是越高越好,需要考虑TP99.用户角度:系统是个黑盒,复杂系统中的任何一环到会导致稳定性问题.SLA:在某种吞吐量下能提供TP99为n毫秒的服务能力.降低延时,会提高吞吐量,但是延时的考核是TP99这样的稳定的延时.

如何改善延时

你应该知道如下表格

原文:http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html

JeffDean

Disk random read IOPS:

IOPS = 1000 / (4 + 60000/7200/2)? = 122

IOPS = 1000 / (4 + 60000/10000/2) = 142

IOPS = 1000 / (4 + 60000/15000/2) = 166

SSD random read IOPS:

IOPS = 1000000/16=62500

 

数字的启示

  • 高速缓存的威力;
  • 线程切换代价cache miss
  • 顺序写优于随机写
  • 局域网络快于本地HDD
  • 大块读优于小块读
  • SSD解决随机读写
  • 跨地域IDC网络是最大的延时

策略

  • 关键路径:“28原则”(20%的代码影响了80%的性能问题,抓重点)、“过早优化是万恶之源”.不同解读;
  • 优化代码:空间换时间:各级缓存;时间换空间:比如传输压缩,解决网络传输的瓶颈;多核并行:减少锁竞争;lesscode;各类语言、框架、库的trick;算法+数据结构,保持代码的清晰、可读、可维护和扩展;
  • 通过性能测试和监控找出瓶颈

metric

原文:http://www.vpsee.com/2014/09/linux-performance-tools/

通过性能测试和监控:

  • 单系统operf/jprofiler etc;
  • Java的一系列工具:jstat,jstack,jmap,jvisualvm,HeapAnalyzer,mat
  • 分布式跟踪系统:Dapper,鹰眼等

benchmark

原文:http://www.vpsee.com/2014/09/linux-performance-tools/

微观

  • 内存分配

吞吐量和利用率的权衡

显式分配器:jemalloc/tcmalloc代替默认的ptmalloc

隐式分配器:JVM GC的各种调优

是否使用hugepagen预分配和重用:Netty的Pooled ByteBuf

减少拷贝:new ArrayList(int),new StringBuilder(int)

内存分配器利用率:减少内部或外部碎片;Page Table(页表),TLB(页表寄存器缓冲),减少TLB miss,pin cache.增加COW的开销,与内存分配器的实现冲突.JVM的GC调优是很多Java应用的关注重点.

  • 减少系统调用

批处理: buffer io,pipeline

使用用户态的等价函数: gettimeofday ->clock_gettime

减少锁竞争

RWMutex

CAS

Thread local

最小化锁范围

最小化状态,不变类

批处理增加了内存拷贝的开销,但是减少了系统调用开销,减少了上下文切换的影响.bufferio的例子:日志、网络读写.pipeline的例子:redis.

  • 减少上下文切换

触发:中断、系统调用、时间片耗尽、IO阻塞等

危害:L1/L2 Cache Missing,上下文保存/恢复

单线程:基于状态机redis和Master/Worker的nginx

CPU亲和性绑定

ThreadPool的配置,不同任务类型不同的ThreadPool

几个例子:1、docker中线程池大小的核数自动设定;2、CPU节能模式;3、CENTOS-7.1内核BUG.

  • 网络

内核TCP Tuning参数和SocketOption:net.ipv4.tcp_*

TCP Socket连接池

网络I/O模型

传输压缩

编解码效率

超时、心跳和重试机制

网卡:多队列中断CPU绑定;增加带宽:万兆、Bonding;Offload特性:ethtool -k eth0;UIO Driver: DPDK

连接池:减少握手、减少服务端session创建消耗.网络I/O模型:BIO、Non-Blocking IO、AIO;select/poll、epoll/kqueue、aio;netty使用nativetransport.Offload特性:ethtool-k eth0.?? 将数据包分组、重组、chksum等从内核层放到硬件层做.

如何提高吞吐量

改善和降低单机的延时,一般就能提高我们的吞吐量.从集群化上讲,因素就比较多.

宏观

  • 提升系统扩展能力
  • 应用的无状态架构
  • 缓存/存储的集群架构:冗余复制(负载均衡、异构解除系统依赖);分布式(数据sharding,副本,路由,数据一致性);切换
  • 微服务/SOA
  • 扩容
  • 异步化
  • 缓存

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读