TCP性能分析与调优策略
网络传输
- 传播延迟: 消息从发送端到接收端需要的时间,是信号传播距离和速度的函数
- 传输延迟: 把消息中的所有比特转移到链路中需要的时间,是消息长度和链路速率的函数
- 处理延迟: 处理分组首部、检查位错误及确定分组目标所需的时间
- 排队延迟: 到来的分组排队等待处理的时间
CDN把距离缩短,以加快访问速度
延迟的最后一公里
延迟相当大一部分往往花在最后的几公里,因为客户单端连接公网的方式和接入链路都比较差
TCP
时延
每个http连接都需要经过三次握手,从纽约向伦敦请求,启动一次TCP连接,光三次握手至少要花56ms,向伦敦发送分组需要28ms,响应要28ms。可以看出三次握手带来的延迟是非常大的
拥塞控制
拥塞崩溃
可能是往返时间超过了所有主机的最大中断间隔,于是相应的主机会产生越来越多的副本,使整个网络陷入瘫痪,最终个交换节点的缓冲区被填满,多出来的分组必须删除
流量控制
通过缩放接收窗口(rwnd)的大小来控制流量的发送(可配)
慢启动
通过一个动态可变的拥塞窗口(cwnd)大小来控制流量的发送,网络可发送的最大数据取rwnd和cwnd的最小值
如图可见,一个请求需要经过220ms才可以达到最大速率。因为慢启动限制了可用的吞吐量,对于小文件的传输是很不利的
慢启动重启:在连接空闲一段时间后,重置拥塞窗口到一个安全的默认值。毫无疑问,SSR对于长周期空闲而突发请求的TCP连接有很大的影响,建议服务器金庸SSR
拥塞预防
慢启动每次往返都会成倍提高传输的数据量,知道超过接收端的流量控制窗口或者有分组丢失为止。此时拥塞预防算法接入
带宽延迟积
BDP表示数据链路的容量与其端到端延迟的乘积,结果就是任意时刻在途未确认的最大数据量
发送端和接收端发送超过了未被确认的最大数据量,都会停下来等待对方的ACK,这就造成了数据缺口。为了解决这个问题应该设置窗口足够大,过小的窗口会限制连接的吞吐量。窗口的大小最小应该设置为BDP
队首阻塞
TCP按序交付与可靠交付,如果有时丢包,那么后续的包必须等到这个丢包的数据重发并接收,才能交付给应用程序,这就导致读数据时会感觉延迟交付
在应用程序不关系按序交付和可靠交付的情况下TCP并不是最好的选择。例如音频,丢了一个包可以在音频中插入一个小小的间隙,就可以继续处理后面的包,只要间隙足够小,用户就注意不到,而等待丢包可能导致音频输出产生无法预料的。相对而言,后者的用户体验更差.
调优
原因
- TCP 三次握手增加了整整一次往返时间;
- TCP 慢启动将被应用到每个新连接;
- TCP 流量及拥塞控制会影响所有连接的吞吐量;
- TCP 的吞吐量由当前拥塞窗口大小控制。
方案
- 把服务器内核升级到最新版本(Linux:3.2+);
- 确保 cwnd 大小为 10;
- 禁用空闲后的慢启动;
- 确保启动窗口缩放;
- 减少传输冗余数据;
- 压缩要传输的数据;
- 把服务器放到离用户近的地方以减少往返时间;
- 尽最大可能重用已经建立的 TCP 连接。
UDP
网络地址转换
这三段地址只允许私网拥有,不允许公网拥有这些ip
连接状体超时
中转UDP的路由,由于UDP没有连接和终止的概念,这导致中转路由不知道什么时候该删除连接状态。为了解决这个问题,路由器会定期清理,路由状态一旦清除,UDP则需要重新建立。解决方法是定期双向发keep-alive分组。按理TCP有明确的连接状态,路由器应当可以完整把握TCP的生命周期,但是路由器没有这么做,也同样给TCP设置了超时清理的动作,这导致一个长时间不活跃的TCP,会无端端的连接断开。
P2P
STUN: Session Traversal Utilities for NAT 是一个协议,可以让内网应用程序获得一个外网ip和端口,STUN服务器架设在公网
各自内网的应用程序使用STUN后,就能获得一个外网ip,STUN服务器通过keepalive方式保持路由不超时,各应用程序就能直接UDP通讯了
TURN: Traversal Using Relays around NAT. 当内网不能使用NAT时,可以使用TURN服务器,应用程序通过TCP连接TURN服务器,服务器做消息中转
libjingle是谷歌的一个实现了STUN/TURN/ICE的开源库。
92% 的时间可以直接连接(STUN);
8% 的时间要使用中继器(TURN)。
ICE: Interactive Connectivity Establishment协议,能直连就直连,不能直连则使用STUN,再不行则使用TURN
设计原则
- 应用程序必须容忍各种因特网路径条件;
- 应用程序应该控制传输速度;
- 应用程序应该对所有流量进行拥塞控制;
- 应用程序应该使用与 TCP 相近的带宽;
- 应用程序应该准备基于丢包的重发计数器;
- 应用程序应该不发送大于路径 MTU 的数据报;
- 应用程序应该处理数据报丢失、重复和重排;
- 应用程序应该足够稳定以支持 2 分钟以上的交付延迟;
- 应用程序应该支持 IPv4 UDP 校验和,必须支持 IPv6 校验和;
- 应用程序可以在需要时使用 keep-alive(最小间隔 15 秒)。
建议使用WebRTC
带宽/延迟与页面加载时间的关系
时延的原因
TCP握手/流量拥塞控制/丢包/队首拥塞
网站各资源的用户体验度量
通过Navigation Timing/User Timing/resource timing来度量
浏览器的优化
- 资源预取和排定优先次序
- DNS预解析
- TCP预连接
- 页面预渲染
服务器如何利用这些优化
- CSS 和 JavaScript 等重要资源应该尽早在文档中出现;
- 应该尽早交付 CSS,从而解除渲染阻塞并让 JavaScript 执行;
- 非关键性 JavaScript 应该推迟,以避免阻塞 DOM 和 CSSOM 构建;
- HTML 文档由解析器递增解析,从而保证文档可以间隙性发送,以求得最佳性能
http优化
- 减少DNS查询
- 减少HTTP请求
- 使用CDN
- 添加Expires首部并配置ETag标签
- Gzip资源
- 避免HTTP重定向
- 使用持久化连接
keep alive和连接池的局限
对于每个服务器的ip,客户端维持一个长连接的连接池,如果有多个请求发往服务器,并超过连接池的数量,则会迫使客户端必须等待连接池的空闲,而且启用多个socket严重占用系统资源。
http协议的局限
每次发送http请求,都必须加上头部,而头部是没有经过压缩的,这直接导致头部的长度有可能超过body的长度。
TCP性能分析与调优策略的更多相关文章
- x86服务器中网络性能分析与调优 转
x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 ...
- 软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结
本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书<软件性能测试分析与调优实践之路>部分章节归纳. 在国内互联网公司中,Web中间件用的最多的就是Apache和Nginx这两款 ...
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...
- Linux服务器性能分析与调优
一 linux服务器性能查看 1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc ...
- linux性能分析及调优
第一节:cpu 性能瓶颈 计算机中,cpu是最重要的一个子系统,负责所有计算任务: 基于摩尔定律的发展,cpu是发展最快的一个硬件,所以瓶颈很少出现在cpu上: 我们线上环境的cpu都是多核的,并且基 ...
- 一个简单web系统的接口性能分析及调优过程
在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...
- 数据库占用CPU过高,性能分析与调优
一.使用 dstat -tcdlmnsygr --disk-util 查看当前系统资源使用状况,当前cpu使用率100% 二.使用TOP命令 查看当前占用CPU进程,可以看到当前占用CPU进程最高的是 ...
- linux性能调分析及调优
转:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及调优介绍 写在前面:计算机要解决的基本问题之一是 ...
- 性能分析神器VisualVM
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
随机推荐
- DMZ是什么
刚刚接触安全域,实在是佩服自己真的是菜,,,啥都不懂,看看过段时间能有多大进步吧... 概念 DMZ:它是一个缓冲区,一个隔离区.它是位于两台防火墙之间的区域,相对于INTER网来说安全级别高一些,但 ...
- 温故知新----封装(struct)
上次提到class是最常见的封装,今天发现别人开发的SDK里面有大量的结构体struct 转载: 1. https://blog.csdn.net/a_forever_dream/article/de ...
- Win10桌面不见了只显示开始菜单该怎么办?
来源:http://www.w10zj.com/Win10xy/Win10xf_4256.html 在Win10系统中,有用户反应桌面不见了,只显示开始菜单的情况,该怎么办呢?出现这样的情况一般由于桌 ...
- 【SSO】一个简单的单点登录演示实现
业务系统的管理后台往往数量众多,且各自需要一套用户名密码来进行登录,不方便使用.因此花了点时间研究如何实现一套单点登录系统. 众所周知,SSO系统设计中,往往需要想办法解决cookie不能跨域的问题, ...
- 记录编译JDK11源码时遇到的两个问题
执行make all报错信息: 错误一 /src/hotspot/share/runtime/arguments.cpp:1461:35: error: result of comparison ag ...
- VMware ESXi 客户端连接控制台时,提示“VMRC 控制台连接已断开...正在尝试重新连接”的解决方法
故障描述: 通过 VMware vSphere Client 连接到安装 VMware ESXi 虚拟环境的主机时,当启动其中的虚拟机后,无法连接到控制台. 选择"控制台"时,控制 ...
- 多测师讲解selenium _assert断言_高级讲师肖sir
assert断言 # # 断言:最常用的断言方法if判断# assert Python语法中自带的断言from selenium import webdriverfrom time import sl ...
- 佛山6397.7539(薇)xiaojie:佛山哪里有xiaomei
佛山哪里有小姐服务大保健[微信:6397.7539倩儿小妹[佛山叫小姐服务√o服务微信:6397.7539倩儿小妹[佛山叫小姐服务][十微信:6397.7539倩儿小妹][佛山叫小姐包夜服务][十微信 ...
- 如何轻松使用 C 语言实现一个栈?
什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...
- go正则
package main import ( "fmt" "regexp" ) func main() { context1 := "3.14 1231 ...