App Engine Socket API因子8比本机python慢

Sju*_*sen 6 python sockets google-app-engine

我正在使用AE套接字API,我做了以下测试:

class TestHandler(webapp.RequestHandler):

    def get(self):
        size = 1024 * 4
        start = datetime.datetime.now()
        for _ in range(10):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(('some.ip.here', 12345))
            sock.send('some dummy data')
            data = ''
            newData = 'dummy'
            while newData != '' and not newData.endswith('\r\n'):
                newData = sock.recv(size)
                #print newData
                data += newData
            print '.'
            sock.close()
        #print 'timespent:' + str(datetime.datetime.now() - start)
        logging.info('timespent:' + str(datetime.datetime.now() - start))
Run Code Online (Sandbox Code Playgroud)
  • App Engine实例:0:00:04.022290和0:00:04.209410
  • 本地Python环境:0:00:00.509000和0:00:00.511000

我注意到单个请求大约需要400毫秒到500毫秒后才开始进行一些测试.正在回答请求的服务器位于Google GCE实例上.该请求的处理时间平均为0:00:00.0005秒.因此大多数延迟与网络相关.我认为一个很好的响应时间将是100毫秒.如果我知道这需要一些硬件,我甚至可以用200ms.但我不认为除了一些安全措施之外应该有所不同.但这会禁止某些功能,而不是让它变慢.

谁能解释为什么差异如此之大?

Ale*_*lli 1

我花了相当长的时间试图通过具体的公共站点重现这个问题,但似乎我做不到。

我的代码版本(足够丰富,因此它实际上可以运行并显示结果)...:

import datetime
import logging
import socket
import webapp2

class TestHandler(webapp2.RequestHandler):

    def get(self):
        size = 1024 * 4
        start = datetime.datetime.now()
        for _ in range(10):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(('216.58.216.4', 80))
            sock.send('GET / HTTP/1.0\n\r\n\r')
            data = ''
            newData = 'dummy'
            while newData != '' and not newData.endswith('\r\n'):
                newData = sock.recv(size)
                #print newData
                data += newData
            print '.'
            sock.close()
        msg = 'timespent:{} for:{}'.format(
            datetime.datetime.now() - start, len(data))
        logging.info(msg)
        self.response.write('<p>{}</p>'.format(msg))

app = webapp2.WSGIApplication([
    ('/timit', TestHandler),
], debug=True)
Run Code Online (Sandbox Code Playgroud)

该 IP 号是 www.google.com 的一个(最好www.google.com在其位置使用主机名,但您指定了一个 IP 号,所以我尝试了这一点),并且交互当然只是使用古老的 HTTP 获取其主页1.0 协议。

结果各不相同,但我刚才得到的结果是一个非常典型的结果:

timespent:0:00:02.748760 for:52823
Run Code Online (Sandbox Code Playgroud)

我在本地运行时得到的数字dev_appserver.py与上传到<myappid>.appspot.com.

所以我做了一个完全独立于GAE的版本:

import datetime
import logging
import socket

def doit():
    size = 1024 * 4
    start = datetime.datetime.now()
    for _ in range(10):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(('216.58.216.4', 80))
        sock.send('GET / HTTP/1.0\n\r\n\r')
        data = ''
        newData = 'dummy'
        while newData != '' and not newData.endswith('\r\n'):
            newData = sock.recv(size)
            #print newData
            data += newData
        print '.'
        sock.close()
    msg = 'timespent:{} for:{}'.format(
        datetime.datetime.now() - start, len(data))
    logging.info(msg)
    print('<p>{}</p>'.format(msg))

doit()
Run Code Online (Sandbox Code Playgroud)

你猜怎么着——运行它,在一堆点之后,向我展示了一个非常相似的结果

<p>timespent:0:00:02.421856 for:52853</p>
Run Code Online (Sandbox Code Playgroud)

所以我不知道下一步该做什么。也许一年多前你进行观察时就出现了问题,但现在已经消失了;也许这与您要连接的特定 IP 的地理位置有关(靠近您的本地计算机,远离您的 GAE 应用程序运行的位置);谁知道呢——没有更多的信息和具体的 IP 等,这实际上是对您观察到的内容的完全盲目猜测。

就我而言,我现在所在的本地计算机位于加利福尼亚州桑尼维尔,就网络延迟而言,我非常确定正在运行的两个 Google 服务(www.google.com 和 myapp.appspot.com) ,不可能离这里那么远(我的 ping 值平均为 50 或 60 毫秒)。

最好能就此结束,这是“未回答的”google-app-engine 问题中得票最高的......!-)