我正在构建自动填充功能,并意识到客户端和服务器之间的时间过长(在450-700ms范围内)
我的第一站是检查这是否是服务器延迟的结果。
但是你可以看到这些Nginx logs are almost always 0.001 milliseconds(请求时间是最后一列)。这几乎不是引起关注的原因。
所以很明显我在服务器和客户端之间浪费时间。我的基准是Google Instant's response times。这几乎经常在30-40毫秒的范围内。 幅度较低 。
虽然很容易说谷歌拥有以这种速度提供的巨大基础设施能力,但我想让自己去了解一下这个水平的人是否可能。如果不是60毫秒,我想减少100-150毫秒。
以下是我设法学习的一些策略。
我可以在这做什么其他事情?
例如
修改 这是ping和traceroute号码。该网站通过Fremont 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
答案 0 :(得分:3)
我可能错了,但我个人闻到了老鼠的味道。您的设置不符合您的时间;我相信你的请求应该运行得更快。
如果可能的话,使用curl
生成一个简短的查询,并在客户端和服务器上用tcpdump
拦截它。
它可能是托管上的带宽/并发问题。查看其诊断面板,或尝试估算流量。
您可以尝试将响应查询保存到静态文件中,然后请求该文件(注意不要触发本地浏览器缓存...),以查看问题是否可能是处理数据(服务器或客户端)。
这种缓慢会影响每个请求,还是仅影响自动完成请求?如果是后者,无论nginx说什么,恢复或格式化输出的自动完成数据可能会有一些低效/延迟。
此外,您可以尝试并完全绕过nginx提供静态响应,以防这是nginx的问题(并且就此而言:您是否检查过nginx'错误日志?)。
答案 1 :(得分:1)
我没有看到你提到的一种方法是使用SSL会话:你可以将以下内容添加到你的nginx conf中,以确保每次连接请求都不会发生SSL握手(非常昂贵的过程): / p>
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
参见" HTTPS服务器优化"这里: http://nginx.org/en/docs/http/configuring_https_servers.html
答案 2 :(得分:0)
如果你还没有,我建议使用New Relic。您可能存在服务器端代码问题。如果您认为这可能是问题,那么有很多免费的代码分析工具。
答案 3 :(得分:-1)
您可能需要考虑在呈现页面时在后台预加载自动填充选项的选项,然后在本地存储中保存您在客户端上使用的trie或任何结构。当用户开始输入自动填充字段时,您不需要向服务器发送任何请求,而是查询本地存储。
Web SQL数据库和IndexedDB将数据库引入客户端。 而不是通过发布数据到服务器的常见模式 XMLHttpRequest或表单提交,您可以利用这些客户端 数据库。减少HTTP请求是所有人的主要目标 性能工程师,因此使用这些作为数据存储区可以节省很多 通过XHR或表格帖子返回服务器。 localStorage和 sessionStorage可以在某些情况下使用,比如捕获表单 提交进度,并且已经看到明显快于 客户端数据库API。
例如,如果您有数据网格组件或收件箱 将数据本地存储在数据库中的数百条消息将保存 当用户希望搜索,过滤或排序时,您可以进行HTTP往返。一个 可以在每个上过滤朋友列表或文本输入自动完成 按键,提供更具响应性的用户体验。
http://www.html5rocks.com/en/tutorials/speed/quick/#toc-databases