我目前正在处理一个n层系统,正在解决一些数据库性能问题。我们一直在研究的一个领域是数据库服务器和应用服务器之间的延迟。在我们的测试环境中,两个服务器之间的平均ping时间约为0.2毫秒,但在客户端现场,这个时间更多地在8.2毫秒左右。这是我们应该担心的事情吗?
对于普通的系统,你们认为什么样的延迟是合理的,你们会如何测试/测量延迟?
我目前正在处理一个n层系统,正在解决一些数据库性能问题。我们一直在研究的一个领域是数据库服务器和应用服务器之间的延迟。在我们的测试环境中,两个服务器之间的平均ping时间约为0.2毫秒,但在客户端现场,这个时间更多地在8.2毫秒左右。这是我们应该担心的事情吗?
对于普通的系统,你们认为什么样的延迟是合理的,你们会如何测试/测量延迟?
是的,网络延迟(通过ping测量)会产生巨大的影响。
如果你的数据库响应时间为0.001毫秒,那么从0.2毫秒到8毫秒的ping延迟将会对它造成重大影响。据我所知,数据库协议比HTTP更加啰嗦,这意味着它们受慢网络延迟的影响会更多。
如果你只运行一个查询,那么增加8ms来获取来自数据库的回复并不重要。但是,如果你正在执行10,000个查询,通常是由于糟糕的代码或ORM使用不当,那么在8ms ping的情况下,你需要额外等待80秒,而在0.2ms ping的情况下,你只需要等待4秒。
作为我的一项政策,我从不让客户端应用程序直接连接数据库。我要求客户端应用程序始终通过应用服务器(例如REST Web服务)进行访问。这样,即使我有一个 "1+N" ORM问题,它也不会产生太大的影响。我仍然会尝试解决潜在的问题...
简而言之:不需要。
你应该监控的是查询的全局性能(即传输到数据库+执行+传回服务器)。
你可以使用性能计数器来监控查询通常执行所需的时间。你可能会发现你的结果超过了毫秒级别。
“合理的延迟”这种说法不存在。相反,你应该考虑“对于你的项目而言合理的延迟”,这将因你所从事的工作而有很大差异。人们对实时交易平台和只读业余网站的期望不同。
在基于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毫秒延迟对系统性能产生显著影响的情况。