将networking延迟从500毫秒减less到60-100毫秒的策略

我正在构build一个自动完成function,并意识到客户端和服务器之间的时间太长 (在450-700毫秒的范围内)

自动完成响应时间

我的第一站是检查这是否是服务器延迟的结果。

在这里输入图像说明

但正如你所看到的,这些Nginx日志几乎总是0.001毫秒请求时间是最后一列 )。 这不是一个值得关注的问题。

所以很明显,我在服务器和客户端之间失去了时间 。 我的基准是Google即时响应时间 。 这通常在30-40毫秒的范围内。 幅度较低

在这里输入图像说明

虽然很容易说谷歌拥有庞大的基础设施能力,但是我想让自己学习一下,如果不是这个水平的人,这是可能的。 如果不是60毫秒,我想削减100-150毫秒。

以下是我设法学习的一些策略。

  1. 启用httpd slowstart和initcwnd
  2. 如果您使用的是https,请确保SPDY
  3. 确保结果是http压缩的
  4. 等等。

在这里我还能做些什么呢?

例如

  • 有一个持久的连接帮助?
  • 我是否应该大幅缩小响应大小?

编辑:这里是ping和traceroute数字。 该网站是通过从弗里蒙特Linode机器的cloudflare服务。

mymachine-Mac:c name$ ping site.com PING site.com (160.158.244.92): 56 data bytes 64 bytes from 160.158.244.92: icmp_seq=0 ttl=58 time=95.557 ms 64 bytes from 160.158.244.92: icmp_seq=1 ttl=58 time=103.569 ms 64 bytes from 160.158.244.92: icmp_seq=2 ttl=58 time=95.679 ms ^C --- site.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 95.557/98.268/103.569/3.748 ms mymachine-Mac:c name$ traceroute site.com traceroute: Warning: site.com has multiple addresses; using 160.158.244.92 traceroute to site.com (160.158.244.92), 64 hops max, 52 byte packets 1 192.168.1.1 (192.168.1.1) 2.393 ms 1.159 ms 1.042 ms 2 172.16.70.1 (172.16.70.1) 22.796 ms 64.531 ms 26.093 ms 3 abts-kk-static-ilp-241.11.181.122.airtel.in (122.181.11.241) 28.483 ms 21.450 ms 25.255 ms 4 aes-static-005.99.22.125.airtel.in (125.22.99.5) 30.558 ms 30.448 ms 40.344 ms 5 182.79.245.62 (182.79.245.62) 75.568 ms 101.446 ms 68.659 ms 6 13335.sgw.equinix.com (202.79.197.132) 84.201 ms 65.092 ms 56.111 ms 7 160.158.244.92 (160.158.244.92) 66.352 ms 69.912 ms 81.458 ms mymachine-Mac:c name$ site.com (160.158.244.92): 56 data bytes 

我可能是错的,但是我个人闻到一只老鼠。 你的时间不适合你的设置; 我相信你的请求应该跑得快得多。

如果可能的话,使用curl生成一个简短的查询,并在客户端和服务器端用tcpdump拦截它。

这可能是主机上的带宽/并发问题。 检查其诊断面板,或尝试估计流量。

您可以尝试将响应查询保存到静态文件中,然后请求该文件(注意不要触发本地浏览器缓存…),以查看问题是否可能在处理数据(服务器端或客户端)。

这是否缓慢影响每个请求,或只有自动完成的? 如果是后者,并且不管nginx说什么,那么恢复或格式化输出的自动完成数据可能会有一些低效率/延迟。

此外,你可以尝试绕过nginx的静态响应,以防这是nginx的问题(对于这个问题:你检查了Nginx的错误日志?)。

我没有看到您提到的一种方法是使用SSL会话:您可以将以下内容添加到您的nginx conf中,以确保每次连接请求都不会发生SSL握手(非常昂贵的进程):

 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; 

请参阅“HTTPS服务器优化”: http : //nginx.org/en/docs/http/configuring_https_servers.html

如果你还不是,我会推荐使用New Relic 。 有可能你的服务器端代码可能是问题。 如果你认为这可能是问题,那么有很多免费的代码分析工具。

您可能需要考虑在呈现页面的同时在后台预加载自动完成选项的选项,然后在本地存储中保存在客户端上使用的特里结构或任何结构。 当用户开始在自动填充字段中输入时,您不需要向服务器发送任何请求,而是查询本地存储。

Web SQL数据库和IndexedDB向客户端引入数据库。 而不是通过XMLHttpRequest或表单提交将数据发布到服务器的常见模式,您可以利用这些客户端数据库。 减少HTTP请求是所有性能工程师的主要目标,因此将它们用作数据存储可以通过XHR保存许多行程,或者将帖子形成回服务器。 localStorage和sessionStorage可以在某些情况下使用,比如捕获表单提交进度,并且比客户端数据库API明显更快。

例如,如果您有一个数据网格组件或一个包含数百条消息的收件箱,将数据本地存储在数据库中会在用户希望搜索,筛选或排序时节省HTTP往返时间。 朋友列表或文字输入自动填充功能可以在每次按键时进行过滤,从而提供更加敏感的用户体验。

http://www.html5rocks.com/en/tutorials/speed/quick/#toc-databases