当请求rails页面上的ruby时,有时数据库查询需要2-4倍的时间。我为Moped启用了调试日志记录,并看到了这样的行:
D, [2013-11-21T23:11:10.889418 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY database=db collection=col selector={"emailCount"=>{"$gt"=>9}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (42.4671ms)
D, [2013-11-21T23:11:13.403011 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY database=db collection=col selector={"emailCount"=>{"$gt"=>9}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (127.4977ms)
重写查询和标志,这是时间上的差异:
D, [2013-11-21T22:28:16.268263 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (163.0192ms)
D, [2013-11-21T22:28:17.872661 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (89.7279ms)
D, [2013-11-21T22:30:26.645921 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (38.0206ms)
D, [2013-11-21T22:37:47.464478 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (42.1586ms)
D, [2013-11-21T22:39:53.393541 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (154.6400ms)
D, [2013-11-21T22:41:16.217997 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (38.3251ms)
D, [2013-11-21T22:41:29.540417 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (124.6662ms)
D, [2013-11-21T22:41:36.281601 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (37.7121ms)
D, [2013-11-21T23:11:07.696951 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (41.8334ms)
D, [2013-11-21T23:11:10.889418 #7690] DEBUG -- : MOPED: 127.0.0.1:17203 QUERY [...redacted...] (42.4671ms)
D, [2013-11-21T23:11:13.403011 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (127.4977ms)
D, [2013-11-21T23:11:16.796217 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (166.5795ms)
D, [2013-11-21T23:11:22.210991 #7690] DEBUG -- : MOPED: 54.213.xxx.xx:17203 QUERY [...redacted...] (195.2744ms)
我想知道为什么Moped有时会使用IP 127.0.0.1而其他时候使用54.213.xxx.xx?为什么在查询54.213.xxx.xx时需要2-4倍的时间?要生成这些日志条目,我只是刷新一个网页。
理想情况下,我希望所有查询花费大约40毫秒而不是偶尔花费大约160毫秒。
如果相关,我的mongoid.yml
就是:
development:
sessions:
default:
database: db
hosts:
- localhost:17203
- xxx.no-ip.biz:27017
options:
consistency: :eventual
username: user
password: pass
副本集中有两个mongos。 localhost:17203(或54.213.xxx.xx)上的那个是次要成员。 xxx.no-ip-.biz解析为174.21.xxx.xxx所以我知道我的主要成员没有被用于读取(正如我所期望的那样)。
答案 0 :(得分:0)
当Moped连接到您的mongoDB服务器时,它会将服务器的主机名解析为IP地址。您的Web应用程序服务器可能正在处理不同工作进程中的每个请求,并且每个进程都以不同方式解析主机名。
我不是网络专家,但很可能你的DNS设置搞砸了。有时localhost会解析为该框的外部IP地址,而不是预期的127.0.0.1环回地址。因此,您的请求不必在本地网络内进行通信,而是必须转到ISP的DNS服务器,在那里得到解决,然后回到同一个框中。