数据库网络延迟

14

我目前正在处理一个n层系统,正在解决一些数据库性能问题。我们一直在研究的一个领域是数据库服务器和应用服务器之间的延迟。在我们的测试环境中,两个服务器之间的平均ping时间约为0.2毫秒,但在客户端现场,这个时间更多地在8.2毫秒左右。这是我们应该担心的事情吗?

对于普通的系统,你们认为什么样的延迟是合理的,你们会如何测试/测量延迟?

4个回答

14

是的,网络延迟(通过ping测量)会产生巨大的影响。

如果你的数据库响应时间为0.001毫秒,那么从0.2毫秒到8毫秒的ping延迟将会对它造成重大影响。据我所知,数据库协议比HTTP更加啰嗦,这意味着它们受慢网络延迟的影响会更多。

如果你只运行一个查询,那么增加8ms来获取来自数据库的回复并不重要。但是,如果你正在执行10,000个查询,通常是由于糟糕的代码或ORM使用不当,那么在8ms ping的情况下,你需要额外等待80秒,而在0.2ms ping的情况下,你只需要等待4秒。

作为我的一项政策,我从不让客户端应用程序直接连接数据库。我要求客户端应用程序始终通过应用服务器(例如REST Web服务)进行访问。这样,即使我有一个 "1+N" ORM问题,它也不会产生太大的影响。我仍然会尝试解决潜在的问题...


我偶然发现这个问题,因为我很好奇我们工作中依赖的服务有多慢。那个服务的延迟大约是50毫秒,你使用8毫秒作为慢的例子,真是太疯狂了。 - Peter

12

简而言之:不需要。

你应该监控的是查询的全局性能(即传输到数据库+执行+传回服务器)。

你可以使用性能计数器来监控查询通常执行所需的时间。你可能会发现你的结果超过了毫秒级别。

“合理的延迟”这种说法不存在。相反,你应该考虑“对于你的项目而言合理的延迟”,这将因你所从事的工作而有很大差异。人们对实时交易平台和只读业余网站的期望不同。


SQL 中也有内置的功能。不要将筛选器设置为 1 毫秒,否则您将看不到执行更快的操作。 - Olof Forshell

6

在基于Linux的服务器上,您可以使用tc命令自行测试延迟效果。

例如,此命令将向通过eth0传输的所有数据包添加10毫秒的延迟。

tc qdisc add dev eth0 root netem delay 10ms

使用此命令以消除延迟

tc qdisc del dev eth0 root

更多细节请参考这里: http://devresources.linux-foundation.org/shemminger/netem/example.html

所有应用程序都不同,但我确实见过10毫秒延迟对系统性能产生显著影响的情况。


2
根据answers.com的研究,网页加载等待时间为400毫秒左右时,人们开始取消页面加载并转向其他网站。我的建议是要从客户端请求到完成整个过程进行全面考虑,如果你在这方面做得很好,就没有必要进一步优化。数学上来说,8.2毫秒与0.2毫秒之间的差异呈指数级增长,但从人类感官来看,没有人能真正感知8.0毫秒的差异。这就是为什么比赛中会有照片结束的原因;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接