从ping获得的数据:是往返还是单向?


28

我有2台服务器,每台服务器位于两个不同的位置。我需要在一个主机上托管一个应用程序,在另一个主机上托管数据库服务器。

从应用程序服务器,如果我对数据库服务器执行ping操作,平均时间约为30毫秒。

我的问题是:

When I query the database from the app;

是否要采取 30 ms + database_server_query_run_time

要么;

需要30 毫秒30 ms + database_server_query_run_time

我想了解这一点。

Answers:


24

通常,这两个选项会花费更多。

Ping仅测量从客户端到服务器再返回的时间(rtt-往返时间)

通常,数据库使用TCP,因此您首先需要发送SYN数据包以开始TCP握手(为简化起见,假设15ms * + cpu时间,然后您接收到SYN / ACK(15ms + cpu时间),然后发回ACK和请求(至少15ms + cpu时间),然后是数据库处理查询的时间,然后是获取数据的时间(15ms + cpu),还有更多时间要确认,并关闭连接。

当然,这不包括对数据库的身份验证(用户名/密码),也不加密(ssl握手/ DH或所需的任何内容)。

*往返时间的一半,假设往返路线是对称的(到达目的地的时间是一半,而返回的时间是一半... ping回复的cpu处理时间非常短)


持久TCP会话可能会遇到三向握手问题。
米歇尔尼克(Michuelnik)

@Michuelnik,能否请您详细说明?我真的很想了解整个过程,并找到最小化查询数据库的延迟的最佳方法。
Phil

2
可悲的是,大多数软件(至少是Web应用程序)都不支持此功能://但想法是,(一次)建立与数据库的连接,并保持连接运行(打开),并继续发送查询/获得一个以上的答复,不断开放的连接。这样就无需每次都进行tcp握手,身份验证等操作。
mulaz

穆拉兹,谢谢您的解释。我将使用Python,所以我们将看看它的运行情况。;-)
Phil

不要忘记请求和回复的大小。例如,在1MB /秒的链路上,100KB的有效负载将花费额外的100ms的传输时间。
Dustin Boswell 2014年

7

ping时间是往返。如果您考虑一下-如何测量单向时间?因此,这将需要30毫秒加上查询时间。


1
我要补充一点的是,这可能比30秒+查询的时间要长一点。因为Ping是ICMP和你的数据库连接是TCP,你也有设置/握手,并DB连接启动等在那里,以及
杜恩

@Doon:通过持久的TCP /数据库连接可以“避免”
Michuelnik

@Michuelnik,您认为持久的数据库连接是解决问题的方法吗?会引起其他问题吗?
Phil

@michuelnik当然。只是指出它并不像RTT +查询那样简单。还有最大速度限制,每个会话由于延迟等原因。)
Doon 2012年

@phil在大多数情况下,如果要执行多个查询,则持久数据库连接很有用。如果查询分散/零星散布,则不必要地占用资源,但是如果查询一直在进行,等等。通过重用现有连接,而不是在每个请求上打开一个新连接,您将节省少量的开销。
Doon 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.