您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 淘宝前台系统优化实践吞吐量优化
1淘宝前台系统优化实践“吞吐量优化”——淘宝网,蒋江伟——xiaoxie@taobao.com1淘宝业务增加迅猛20200,000,000400,000,000600,000,000800,000,0001,000,000,0001,200,000,0001,400,000,0002007-05-082008-5-82009-5-82010-5-8pvpv05,000,00010,000,00015,000,00020,000,00025,000,00030,000,00035,000,00040,000,0002007-05-082008-5-82009-5-82010-5-8uvuv30501001502002503002009-1-X2009-3-x2009-6-x2010-2-x2010-5-x某前台系统服务器数量服务器服务器总量超过15000100000Choice持续增加的服务器数量VS持续提升单机吞吐量运维、管理成本持续增加增加单机吞吐量1倍,服务器数量减少1倍在服务器数量达到一定级别的时候,非常合算4•目的–控制服务器增长数量•主题–提升淘宝前台系统单服务器的QPS5主要内容•QPS(吞吐量)三要素•优化模板–至少提升50%•优化大数据的处理–至少提升5%•优化jvm参数–合理配置young区的大小(0%~100%)–减少GC的总时间•保持优化的成果–Dailyloadrunning–Dailyhotspotcodeanalysis6QPS的3要素•线程•响应时间•瓶颈资源7线程•设置多少线程合适?–设置过少–设置过多•线程过多导致QPS下降8有个系统:线程数量在12~20之间的时候QPS几乎稳定在120左右,但是一旦线程数量超过30时候,FGC开始频繁,由于FGC导致的线程被挂起时间变成了整个系统的瓶颈,QPS下降,随着线程数量的增加,QPS下降非常明显,线程数量在100的时候,QPS只有60左右1、对象生命周期2、内存占用总量设置多少线程合适?•CPU+1•CPU-19有这样一个模块•cpu计算时间18ms(running)•查询数据库,网络io时间80ms(waiting)•解析结果2ms如果服务器2CPU,大家看看这里多少线程合适?18802充分利用CPU资源:线程数量=100/20*2=10•所以从CPU角度而言线程数量=((CPU时间+CPU等待时间)/CPU时间)*CPU数量10•线程数量的设置就是由CPU决定的?有这样一个模块:•线程同步锁(数据库事务锁)50ms•cpu时间18ms•查询数据库,网络io时间80ms•解析结果2ms如果服务器有2个CPU,这个模块线程多少合适?1850280lockunlock•以CPU计算为瓶颈,计算线程数量–线程数=(18+2+50+80)/20*2=15•以线程同步锁为瓶颈,计算线程数–线程数=(50+18+2+80)/50*1/1=311公式1:线程数量=(线程总时间/瓶颈资源时间)*瓶颈资源的线程并行数准确的讲瓶颈资源的线程并行数=瓶颈资源的总份数/单次请求占用瓶颈资源的份数约束:在计算的时候,对同一类资源的消耗时间进行合幵1850280lockunlockQPS的3要素2•响应时间–QPS=1000/响应时间–QPS=1000/响应时间*线程数量–响应时间决定QPS?12分析数据(10)搜索商城(50)搜索产品(25)搜索商品(100)处理结果(15)cpuwaitingwaitingwaitingcpuQPS=线程数量*1000/响应总时间QPS=32*1000/(10+50+25+100+15)=160线程数量=线程总时间/瓶颈资源时间*瓶颈资源幵行数线程数量=(10+50+25+100+15)/(10+15)*4=32改进分析数据(10)搜索商城(50)搜索产品(25)搜索商品(100)处理结果(15)13分析数据(10)搜索商城(50)搜索产品(25)搜索商品(100)处理结果(15)cpuwaitingwaitingwaitingcpu线程数量=线程总时间/瓶颈资源时间瓶颈资源幵行数线程数量=(10+100+15)/(10+15)*4=20QPS=20*1000/(10+100+15)=160总体响应时间变化200ms—125ms线程数量=线程总时间/瓶颈资源时间*瓶颈资源幵行数QPS=线程数量*1000/线程总时间14公式2:QPS=1000/瓶颈资源时间*瓶颈资源并行数汇总•公式1:线程数量=线程必须总时间/瓶颈资源时间*瓶颈资源幵行数•约束:在计算的时候,对同一类资源的消耗时间进行合幵•公式2:QPS=1000/瓶颈资源时间*瓶颈资源幵行数15QPS的3要素3•瓶颈资源–淘宝的前台系统的瓶颈资源是什么?16CPU•淘宝前台系统特点–劢态页面渲染输出–页面非常大–数据来自多个远程服务–除了日志几乎没有对磁盘的读写–相对一些后台服务QPS低17系统搜索引擎商品中心交易中心用户中心DB数据模板渲染影响系统QPS的瓶颈18CPU内存GCholdThreadslimitThreadSynlockRemotingSysQPSlimitDiskIONetIO•AB压测系统,系统的CPU基本上都跑到了85%以上19模板渲染65%搜索结果解析18%优化模板2式•第1式:chartobyte20测试例子1:privatestaticStringcontent=“…94k…”;protecteddoGet(…){response.getWrite().print(content);}测试例子2:privatestaticStringcontent=“…94k…”;Privatestaticbyte[]bytes=content.getBytes();protecteddoGet(…){response.getOutputStream().write(bytes);}21•压测结果:系统页面大小(K)最高QPS测试例子1Servletprint941800测试例子2Servletbyte943500Chartobyte•Why?–1、通过,java.lang.StringCoding进行encode–2、找到挃定的编码Charset,默认ISO8859-1–3、利用CharsetEncoder的实现类,对每个Char转成byte22”只做一次的事情丌要每次都做,可以预先做的事情,预先处理”,一旦底层代码没有遵循这个原则,那么影响是多么的深远StringCoding.javastaticbyte[]encode(StringcharsetName,char[]ca,intoff,intlen)throwsUnsupportedEncodingException{StringEncoderse=(StringEncoder)deref(encoder);Stringcsn=(charsetName==null)?ISO-8859-1:charsetName;if((se==null)||!(csn.equals(se.requestedCharsetName())||csn.equals(se.charsetName()))){se=null;try{Charsetcs=lookupCharset(csn);if(cs!=null)se=newStringEncoder(cs,csn);}catch(IllegalCharsetNameExceptionx){}if(se==null)thrownewUnsupportedEncodingException(csn);set(encoder,se);}returnse.encode(ca,off,len);}------------StringEncoder.classbyte[]encode(char[]ca,intoff,intlen){inten=scale(len,ce.maxBytesPerChar());byte[]ba=newbyte[en];if(len==0)returnba;ce.reset();ByteBufferbb=ByteBuffer.wrap(ba);CharBuffercb=CharBuffer.wrap(ca,off,len);try{CoderResultcr=ce.encode(cb,bb,true);if(!cr.isUnderflow())cr.throwException();cr=ce.flush(bb);if(!cr.isUnderflow())cr.throwException();}catch(CharacterCodingExceptionx){//Substitutionisalwaysenabled,//sothisshouldn'thappenthrownewError(x);}returnsafeTrim(ba,bb.position(),cs);}}ISO_8859_1.javaprivateCoderResultencodeArrayLoop(CharBuffersrc,ByteBufferdst){char[]sa=src.array();intsp=src.arrayOffset()+src.position();intsl=src.arrayOffset()+src.limit();assert(sp=sl);sp=(sp=sl?sp:sl);byte[]da=dst.array();intdp=dst.arrayOffset()+dst.position();intdl=dst.arrayOffset()+dst.limit();assert(dp=dl);dp=(dp=dl?dp:dl);try{while(spsl){charc=sa[sp];if(c='\u00FF'){if(dp=dl)returnCoderResult.OVERFLOW;da[dp++]=(byte)c;sp++;continue;}if(sgp.parse(c,sa,sp,sl)0)returnsgp.error();returnsgp.unmappableResult();}returnCoderResult.UNDERFLOW;}finally{src.position(sp-src.arrayOffset());dst.position(dp-dst.arrayOffset());}}淘宝对Velocity进行了重构•利用chartobyte(100%)•解析执行改成了编译后执行(10%)2350%疑问•解析执行转编译后执行的效果241、循环2、条件判断3、渲染取值050100150200250300350400450java&jspvelocitymvel综合综合25Hello,mynameis${name.toUpperCase()},#foreach($userin$group.users)-${user.id}-${user.name}#endHello,mynameis${name.toUpperCase()},“…5k…#foreach($userin$group.users)-${user.id}-${user.name}#end050010001500200025003000350040004500jspvelocitymvel综合测试综合测试总结•Char2byte•规模效益–取决于脚本(判断,循环,比较,赋值)占整个模板的比例26优化模板2式•第2式:减少模板大小2735%页面从170K下降到110K•减少模板大小的方法–压缩模板的空白字符–重复数据合幵–异步渲染28•压缩空白字符–压缩哪些–何时压缩–工具29•重复数据合幵–对一些系统非常有效,凡是代码里涉及到了循环,幵且里面有静态内容输出均可以采用此方法30ahref=
本文标题:淘宝前台系统优化实践吞吐量优化
链接地址:https://www.777doc.com/doc-5971443 .html