我有两个站点托pipe在两个不同的数据中心。 最近一个网站变得非常缓慢。 从应用程序服务器到数据库服务器的ping响应速度不够快。 我如何调查这个问题?
On fast server: 10 packets transmitted, 10 received, 0% packet loss, time 8998ms rtt min/avg/max/mdev = 0.243/0.279/0.502/0.074 ms On slow server: 21 packets transmitted, 21 received, 0% packet loss, time 20011ms rtt min/avg/max/mdev = 1.131/1.816/3.584/0.560 ms
tracert命令显示以下内容:
On fast server: tracert db traceroute to db (xxx.xxx.100.101), 30 hops max, 40 byte packets 1 db (xxx.xxx.100.101) 0.552 ms 0.530 ms 0.527 ms On slow server: tracert xxx.16.55.140 traceroute to xxx.16.55.140 (xxx.16.55.140), 30 hops max, 40 byte packets 1 xxx.16.55.140 (xxx.16.55.140) 1.859 ms 1.845 ms 1.842 ms
执行从Web服务器到数据库服务器的path,并查看减速报告的位置。 然后,通过执行从数据库服务器到Web前端的path确认。 使用节点的IP地址,而不是DNS名称。 正如Womble指出的那样,这可能会减慢。
仅供参考,像Tracert这样的路由可以简单地基于数据包如何被路由到一个方向,并且基于networking拥塞而向后不同地提供欺骗path信息。 而且,正向path不保证与每个增加的跳跃相同。 但是,这些都是无关紧要的话题。 继续…
一旦确定放缓的位置,您可以继续排除故障。 可能是terminal节点本身就是放缓,如果他们在重负荷或以某种方式不适当地configuration。 如果你发现慢节点是什么,用适当的信息更新你的问题。
您可以使用traceroute来查看是否有沿着path放慢速度的点。
Traceroute( mtr甚至更好)两台机器之间的path,寻找特别的跳跃,增加了很多延迟。 一旦你确定了位置,你可以查看原因(检查链接两端的端口统计信息,看看是否有排队或其他问题); 你不会丢包(好吧,不要过多的数–21个ping不是统计意义上的),所以你可能不会在任何地方溢出缓冲区。
但是,对于“较慢”链接,您仍然只能看到1.8毫秒的延迟,这对于任何types的广域网链接都是非常好的。 除非你正在做一些令人难以置信的延迟敏感的事情(比如高速交易),否则我很难想象在任何有意义的意义上,这可能是“非常缓慢”的。
发送10个数据包,接收10个,包丢失0%,时间8998ms
8998ms是巨大的networking延迟。 你可以使用mtr来查看它在某个点上是否失败? 数据中心的位置有多远? 它从美国连接到中国吗? 服务器的平均负载是多less?
你在你的问题中说,该网站变得缓慢,然后询问平时间。 其他原因,这个网站可能是慢的吗?
如果您只在两个不同的数据中心中只有一个数据库托pipe两个网站,则两个数据中心之间的带宽可能成为限制因素。
在每个查询中检查从数据库中拉出多less数据可能是值得的。 在数据库查询中返回10MB只是让脚本语言parsing/破坏/丢弃数据,直到剩下几KB发送给用户,这并不罕见。 即使他们只需要一个字段,也有很多人使用“SELECT *”。 还有一点值得一看,你可以在整个数据库端口上看到多lessstream量。 如果您只有一个到另一个数据中心的10Mb链接,并且即使是一个1MB的查询,也只需要几秒钟的时间。
如果延迟实际上是您的问题而不是带宽,那么使用持久连接可以提供帮助,因为它避免了为每个查询创build一个全新的tcp连接。 在第二个数据中心设置从属只读数据库也可以提供帮助,因为只读查询可以在本地完成。
相对于平均,“慢”的分组的标准差( mdev )较高。 我会说networking拥塞(无论是在主机层面还是交换机/路由器)
你可以尝试在UDP模式下使用iperf ,这样你会得到很多的抖动。