为什么我看到 google 云扳手的响应时间很慢?
Why am I seeing slow response times from google cloud spanner?
我正在为 GAE 上的 Django 应用程序迁移到 google Cloud Spanner,发现响应时间非常长,索引查询大约需要 2-3 秒在扳手查询编辑器中 运行ning 时需要 10 毫秒。
也只有第一个查询耗时这么长,后续任何查询都需要 100 毫秒左右。
我在 运行 使用 python 客户端进行最低限度的查询时遇到了同样的问题,我附上了下面的代码:
from google.cloud import spanner_v1
client = spanner_v1.Client()
i = client.instance("my-instance")
db = i.database("my-database")
start = time.time()
with db.snapshot() as snapshot:
QUERY = (
"""
SELECT
*
FROM
dates
WHERE
date_id = 4507
""")
result = snapshot.execute_sql(QUERY)
for row in result:
print(row)
end = time.time()
print((end-start)*1000)
在这种情况下需要 1154 毫秒。 运行 再次查询(不重新初始化数据库对象)需要 110 毫秒。
我将在对应于 db.snapshot():
的函数中包含来自行分析器 运行 的一些输出
Timer unit: 0.001 s
Total time: 1.05145 s
File: /Users/opt/anaconda3/envs/dev/lib/python3.8/site-packages/google/cloud/spanner_v1/database.py
Function: __enter__ at line 859
Line # Hits Time Per Hit % Time Line Contents
==============================================================
859 def __enter__(self):
860 """Begin ``with`` block."""
861 1 1051.4 1051.4 100.0 session = self._session = self._database._pool.get()
862 1 0.0 0.0 0.0 return Snapshot(session, **self._kw)
运行 这个 python==3.8.0 和 google-cloud-spanner==3.11.1 在 Mac.. 任何帮助或想法非常感谢排除故障
我认为您所看到的是以下原因:
- 第一个查询会比其他查询慢,因为第一个查询必须等待 Python 客户端使用的会话池被创建,并且至少有一个会话有由 Cloud Spanner 创建并返回。所有后续查询都将重用池中的会话,这就是为什么您在第二个查询中看到的值要低得多。
- 第二个查询的总执行时间将取决于您的客户端与 Cloud Spanner 实例之间的物理距离以及网络质量。我假设查询是根据主键选择一行(即
date_id
是 table 的主键中的唯一列)。客户端最好 运行 在 Google App Engine 实例上,该实例与您的 Cloud Spanner 实例位于同一物理区域(例如,两者都可以在区域 us-central1
中,而不是一个在us-east1
和 us-central1
中的一个)。
如果我没理解错的话,你提供的数字是基于你自己的开发机器在本地执行的。我认为您看到的第二个和更多查询的大部分执行时间差异(与 GCP 控制台相比)是由于本地计算机和 Cloud Spanner 之间的网络延迟造成的。
如果您从 GAE 实例或与 Cloud Spanner 数据库位于同一物理区域的简单 Google 计算虚拟机执行测试查询,看看您是否获得更好的数字会很有趣。
我正在为 GAE 上的 Django 应用程序迁移到 google Cloud Spanner,发现响应时间非常长,索引查询大约需要 2-3 秒在扳手查询编辑器中 运行ning 时需要 10 毫秒。
也只有第一个查询耗时这么长,后续任何查询都需要 100 毫秒左右。
我在 运行 使用 python 客户端进行最低限度的查询时遇到了同样的问题,我附上了下面的代码:
from google.cloud import spanner_v1
client = spanner_v1.Client()
i = client.instance("my-instance")
db = i.database("my-database")
start = time.time()
with db.snapshot() as snapshot:
QUERY = (
"""
SELECT
*
FROM
dates
WHERE
date_id = 4507
""")
result = snapshot.execute_sql(QUERY)
for row in result:
print(row)
end = time.time()
print((end-start)*1000)
在这种情况下需要 1154 毫秒。 运行 再次查询(不重新初始化数据库对象)需要 110 毫秒。
我将在对应于 db.snapshot():
的函数中包含来自行分析器 运行 的一些输出Timer unit: 0.001 s
Total time: 1.05145 s
File: /Users/opt/anaconda3/envs/dev/lib/python3.8/site-packages/google/cloud/spanner_v1/database.py
Function: __enter__ at line 859
Line # Hits Time Per Hit % Time Line Contents
==============================================================
859 def __enter__(self):
860 """Begin ``with`` block."""
861 1 1051.4 1051.4 100.0 session = self._session = self._database._pool.get()
862 1 0.0 0.0 0.0 return Snapshot(session, **self._kw)
运行 这个 python==3.8.0 和 google-cloud-spanner==3.11.1 在 Mac.. 任何帮助或想法非常感谢排除故障
我认为您所看到的是以下原因:
- 第一个查询会比其他查询慢,因为第一个查询必须等待 Python 客户端使用的会话池被创建,并且至少有一个会话有由 Cloud Spanner 创建并返回。所有后续查询都将重用池中的会话,这就是为什么您在第二个查询中看到的值要低得多。
- 第二个查询的总执行时间将取决于您的客户端与 Cloud Spanner 实例之间的物理距离以及网络质量。我假设查询是根据主键选择一行(即
date_id
是 table 的主键中的唯一列)。客户端最好 运行 在 Google App Engine 实例上,该实例与您的 Cloud Spanner 实例位于同一物理区域(例如,两者都可以在区域us-central1
中,而不是一个在us-east1
和us-central1
中的一个)。
如果我没理解错的话,你提供的数字是基于你自己的开发机器在本地执行的。我认为您看到的第二个和更多查询的大部分执行时间差异(与 GCP 控制台相比)是由于本地计算机和 Cloud Spanner 之间的网络延迟造成的。
如果您从 GAE 实例或与 Cloud Spanner 数据库位于同一物理区域的简单 Google 计算虚拟机执行测试查询,看看您是否获得更好的数字会很有趣。