高性能网络通讯_第1页
高性能网络通讯_第2页
高性能网络通讯_第3页
高性能网络通讯_第4页
高性能网络通讯_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高性能网络通讯协议、传输、线程1阿里巴巴-B2B-平台技术部-应用框架Dubbo提纲 Simple RPC & Problem Data Protocol Header & Codec Serialization IO Model & NIO Java NIO TCP & Linux Kernel Threading2简单远程调用(1)客户端HelloService helloService = getProxy(HelloService.class, , 2580);System.out.println(helloService.sayHel

2、lo(world);public T getProxy(Class interfaceClass, String host, int port)return (T) Proxy.newProxyInstance( interfaceClass.getClassLoader(), new Class interfaceClass, new InvocationHandler() public Object invoke(Object proxy, Method method, Object arguments) throws Throwable Socket socket = new Socke

3、t(host, port); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream(); output.writeUTF(method.getName(); output.writeObject(method.getParameterTypes(); output.writeObject(arguments); ObjectInputStream input = new ObjectInputStream(socket.getInputStream(); return input.readObject

4、(); );3简单远程调用(2)服务端public String sysHello(String input) return Hello + input;HelloService serviceImpl = new HelloService();public void static main(String args) ServerSocket server = new ServerSocket(port); for(;) final Socket socket = server.accept(); new Thread(new Runnable() ObjectInputStream inpu

5、t = new ObjectInputStream(socket.getInputStream(); String methodName = input.readUTF(); Class parameterTypes = (Class)input.readObject(); Object arguments = (Object)input.readObject(); Method method = serviceImpl.getClass().getMethod(methodName, parameterTypes); Object result = method.invoke(service

6、Impl, arguments); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream(); output.writeObject(result); ).start(); 4简单远程调用(3)问题在哪里 网络传输方式:BIO 序列化方式:Java 线程模型:每连接每线程 JDK代理5三个主题 协议 用什么数据格式进行传输,双方的约定 传输 用什么样的通道将数据发送给对方 线程 当接收到数据时,如何分发数据进行处理6Data Protocol数据协议线程模型IO模型7Data Flow8HelloSe

7、rviceDubboInvokersayHello(“hi”)Invoke(Invocation)RequestorSend(Request)FutureMapWaitSocketWrite to channelChannelHelloServiceImplDubboExportergetProxy and invokeInvoke(Invocation)ResponderReceive(Request)SocketRead From channelSend(Response)Write to channelRead From channelReceiverNotifyAppend Data

8、HeaderDubbo Data Header此图来自网络Data Header10Bit offset0 - 34 - 7 8 910111213141516 - 2324 - 310Source portDestination port32Sequence number64Acknowledgment number (if ACK set)96Data offsetReservedCWRECEURGACKPSHRSTSYNFINWindow Size128ChecksumUrgent pointer (if URG set)160Options (if Data Offset 5)padd

9、ingBit offset0 - 34 - 78 - 1314 - 1516 - 1819 - 310VersionHeader LengthDifferentiated Services Code PointExplicit Congestion NotificationTotal Length32IdentificationFlagsFragment Offset64Time to LiveProtocolHeader Checksum96Source IP Address128Destination IP Address160Options ( if Header Length 5 )I

10、PTCPDubboSerialized DataIPTCPDubboNetworkTransportSessionPresentationBit offset0 - 78-1516-2021222324-310Magic HighMagic LowSerialization ideventTwowayReq/resstatus32 - 95Id (long)96-127data length Data Header Port Unification - Magic Code 多协议支持 Telnet 兼容 Long Id VS Id 轮转 同步转异步 过期策略 + id轮转 扩展header

11、Response Header中增加服务器状态11Data Header 同步转异步 并行发起多个请求,但只使用一个线程 xxxService.findXxx(); Future xxxFuture = RpcContext.getFuture();UserThreadRpcContextFutureIOThread2.requestServer6.response5.get/wait4.getFuture3.setFuture7.set/notify1.findXxxasyncsyncBody Serialization 几个关键因素 数据大小(传输速度) 序列化&反序列化速度(CP

12、U资源) 兼容性&易用性13Serialization Performance14Tool:https:/ Performance15压缩35%Body Serialization 远程服务调用时间主要消耗 网络开销 - 数据包大小 生产环境某应用容量测试: 9台服务器压力转到1台后(Cpu 3% 网络 90%) Dubbo序列化主要优化目标 减少数据包大小(主要) 提高序列化反序列化性能16Serialization Optimization Special basic type Multiplex flag Ordered vs. Named Contract vs. Self-d

13、escription Poison vs. Exception17Serialization18Header1688Name:AlibabaID:HeaderAlibabaID:1688Name:IntegerStringStringInteger Named Self-description Ordered ContractHeader1688AlibabaSerialization 如何选择 易用性: Java/ compactedjava hessian2 dubbopb 性能: pb dubbo hessian2 compactedjava java19IO模型数据协议线程模型20IO

14、模型 IO Model NIO TCP选项 IRQ21IO模型IO请求划分两个阶段:等待数据就绪从内核缓冲区拷贝到进程缓冲区按照请求是否阻塞同步IO异步IOUnix的5种IO模型Blocking I/ONon-Blocking I/OI/O MultiplexingSignal-Driven I/OAsynchronous I/O22同步IO异步IOIO模型之间的区别23NIO带来了什么事件驱动模型避免多线程单线程处理多任务非阻塞IO,IO读写不再阻塞,而是返回0基于block的传输,通常比基于流的传输更高效更高级的IO函数,zero-copyIO多路复用大大提高了java网络应用的可伸缩性和

15、实用性24NIO - Reactor模式 NIO网络框架的典型模式 核心组件 Synchronous Event Demultiplexer Event loop + 事件分离 Dispatcher 事件派发,可以多线程 Request Handle 事件处理,业务代码 Mina Netty 都是此模式的实现25Reactor示意图26线程模型中详细讲解NIO优化 - TCP选项 合理设置TCP/IP在某些时候可以起到显著的效果27SO_RCVBUF和SO_SNDBUF Socket缓冲区大小至少应该是连接的MSS的四倍,MSS=MTU - 40,一般以太网卡的MTU=1500字节字节。MSS

16、:最大分段大小MTU:最大传输单元 在以太网上,4k通常是不够的,增加到16K,吞估量增加了40%。 对于一次性发送大量数据的应用,增加发送缓冲区到48K、64K可能是唯一的最有效地提高性能的方式。为了最大化性能,发送缓冲区可能至少要跟BDP(带宽延迟乘积)一样大小。 对于大量接收数据的应用,提高接收缓冲区,能减少发送端的阻塞。 如果应用既发送大量数据,也接收大量数据,recv buffer和send buffer应该同时增加28Nagle算法:SO_TCPNODELAY NAGLE算法通过将缓冲区内的小封包自动相连,组成较大的封包,阻止大量小封包的发送阻塞网络,从而提高网络应用效率 Sock

17、et. setTcpNoDelay(true);实时性要求较高的应用(telnet 、服务调用),需要关闭该算法,否则响应时间会受影响。29SO_KEEPALIVESocket.setKeepAlive(boolean)这是TCP层,而非HTTP协议的keep-alive概念默认一般为false,用于TCP连接保活,默认间隔2个小时TCP心跳间隔是全局设置,建议在应用层做心跳30中断31软中断32 软中断此时都是运行在在硬件中断相应的cpu上。 如果始终是cpu0相应网卡的硬件中断,那么始终都是cpu0在处理软中断,而此时cpu1就被浪费了,因为无法并行的执行多个软中断Linux内核优化- R

18、PS 网卡数据包处理优化 Linux 内核开启 RPS, 小包处理提升15+% RPS 这项技术将流入的数据包分布给所有可用的 CPU 去处理。 使用Linux Kernel 2.6.35开启该功能Dubbo的TPS提高3倍 RPS (Receive Packet Steering) 基本原理 根据数据包的源地址,目的地址以及目的和源端口,计算出一个hash值,然后根据这个hash值来选择软中断运行的cpu, 从上层来看,也就是说将每个连接和cpu绑定,并通过这个hash值,来均衡软中断在多个cpu上33线程模型数据协议线程模型IO模型34线程模型内容 Reactor线程模型 序列化线程 业务

19、线程派发策略35Reactor单线程模型36Reactor多线程模型37Reactor多线程模型38IO线程处理序列化39CodecHandlerIoThreadExecutorHandlerBizHandlerBizHandlerclear bufferreturnCodec & deserialize buffer datado next in thread poolbuffermessagemessagemessage 在IO线程处理反序列化问题是? 可以直接在业务线程处理么? 可以改进么?业务线程处理序列化40CodecHandlerIoThreadExecutorHandle

20、rBizHandlerclear bufferRead data Framedo next in thread poolChannelbufferData FramemessagemessageBizHandlerDesiralizationHandlerDesiralize Data FrameDesiralizationHandlerDesiralize Data FrameCodec 可以放到业务线程池处理么?有必要么?Reactor多线程模型41MainReactorsubReactorClientClientClientAccceptorreadreadreadsendsendsen

21、dThreadpooldecodedecodedecodeThreadpooldeserizecomputeserializeencodedeserizecomputeserializeencode线程派发策略 5个事件 Connect (连接建立) Disconnect (连接断开) MessageReceived (消息已接受) Sent(消息已发送) Exception Caught(异常) 派发策略 5个事件共享同一个线程池 Connect disconnect 使用独立线程池(size为1) 全部不派发线程池,IO线程处理42Thread Pool Size 设置多少线程合适?有这样一个模块cpu计算时间18ms(running)查询数据库,网络io时间80ms(waiting)解析结果2ms如果服务器2CPU,大家看看这里多少线程合适43充分利用cpu资源:线程数量=100/20*2=10Thread Pool Size 从CPU角度而言线程数量=(cpu时间+cpu等待时间)/cpu时间*cpu数量 线程数量的设置就是由CPU决定的?有这样一个模块:线程同步锁(数据库事务锁)50ms cpu时间18ms查询数据库,网络io时间80ms解析结果2ms 如果服务器有2个CPU,这个模块线程多少合适?44Th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论