我有一个Apache服务器托管了几个json API。
此服务器正在使用Apache和Mysql运行Ubuntu16.04.4LTS。
所有API的响应时间都非常好,除了一个!从特定API获得json响应需要花费大约5s,而其他API则需要毫秒。
我检查了多个没有成功的东西:
1) SQL查询几乎立即运行(有和没有缓存--我尝试了这两种方法)
2)我们的开发人员添加了一个自定义头,以了解API生成json响应所需的时间: 2-3 ms。
3)使用wget从远程计算机或服务器本地调用API,结果是相同的:需要5s才能得到答复。根据浏览器开发模式,5s是“等待”。谷歌Chrome说“等待第一个字节”。然后,根据开发模式(几毫秒),数据传输速度似乎较快。
4) apache似乎没有被https请求淹没,请参见屏幕截图显示服务器状态页服务器状态。
5)对https API的访问是通过多个防火墙完成的,但不存在反向代理。
作为调试过程的一部分,我试图提高服务器性能:
你知道为什么Apache的回复速度这么慢吗?你知道如何解决这个问题吗?
谢谢你的帮助
托马斯
发布于 2018-05-09 14:01:01
几天前,我发现了以下线程:Apache在响应之前有很长的延迟.,这个问题看起来像我的,但听起来与IPv6有关。由于IPv6在我的服务器上是禁用的,我认为这个解决方案不适合解决我的问题。
在解决这个问题的最后一次绝望尝试中,我还是尝试了所描述的解决方案:我只是在/etc/serv.conf中添加了“选项单请求-重新打开”,然后5s延迟消失了。
此时,我真的不明白为什么这个设置解决了我的性能问题,因为我的服务器上禁用了IPv6。
此外,在Apache中禁用主机名查找。
经过近距离的调查…。
1)这个新的Json使用Google进行身份验证,这意味着访问Google服务需要DNS解析。我把这个忘在我以前的调查…里了我以为DNS在这里不会有问题。我错了。
2) IPv4 4专用服务器上的IPv6查询
基本上,Linux服务器依赖getaddrinfo来解析dns。根据手册页(gai.conf,它是getaddrinfo配置文件):
“调用getaddrinfo(3)可能返回多个答案。根据RFC 3484,必须对这些答案进行排序,以使成功率最高的答案在列表中居第一位。RFC为排序提供了一个算法。“
根据RFC 3484:
“默认策略表的另一个效果是更喜欢使用IPv6地址的通信,而不是使用IPv4地址的通信。
返回“单次请求-重新打开”:
“解析器对A和AAAA请求使用相同的套接字。一些硬件错误地只发送了一个回复。当这种情况发生时,客户端系统将坐着等待第二次答复。打开此选项会更改此行为,以便如果来自同一端口的两个请求没有得到正确处理,它将关闭套接字并在发送第二个请求之前打开一个新的套接字。“
我想我的服务器在等待第二个回复…花了5秒。“单次请求-重新开放”让我绕过了这个问题。
3)优先处理IPv4 dns查询:
我还更改了getaddinfo行为,以确保IPv4通信是首选的,参见/etc/gai.conf
# For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100托马斯
https://serverfault.com/questions/910691
复制相似问题