问题描述
我的公司正在考虑将我们的数据库迁移到多租户架构中的 Cloud Spanner,但是在我们完成第一次测试之后,我们担心我们获得的性能。
有什么想法可以改进下面的代码吗?我们做错了什么吗?
$cache = new SysVCacheItemPool();
$sessionPool = new CacheSessionPool(
$cache,[
'minSessions' => 10,'maxSessions' => 10
]
);
$client = new SpannerClient([
'projectId' => 'XXX'
'keyFilePath' => __DIR__ . '/../config/CloudSpanner/XXX.json','authCache' => $cache
]);
$instance = $client->instance('XXX');
$database = $instance->database('XXX',[ 'sessionPool' => $sessionPool ]);
$results = $database->execute('SELECT "Hello World" as test')
foreach ($results as $row) {
print($row['test'] . PHP_EOL);
}
解决方法
我想到了一些可能会增加操作延迟的事情。
扳手配置
您正在测试的实例是否有任何其他负载?您可以在 Spanner 实例的监控选项卡中检查。确保单个区域实例配置 (https://cloud.google.com/spanner/docs/cpu-utilization#recommended-max) 的 CPU 不超过 65%。我认为这可能与您的问题无关,因为您只是在测试它,但我认为值得一提。
客户位置
您是在本地机器而不是 GCP 环境中执行代码吗?这可能会显着增加您所看到的延迟,特别是如果您的 Spanner 服务器位于远离您的客户端的区域内。确保您尝试将这两者尽可能靠近。我还会通过在 GCP 基础架构中部署代码来测试您的代码,这样您就可以比较您观察到的延迟并排除网络相关问题。
会话
我看到您已将会话池配置为最少和最多 10 个会话。这意味着您最多可以同时执行 10 个事务。如果您对多个操作进行基准测试,请确保配置会话池以满足您的需求。除此之外,我们通常建议每个 gRPC 通道最多有 100 个会话,因此您可能还需要增加此数量。请注意,一开始我不会增加这些数字,因为维护会话池会产生相关成本,随着添加更多会话,该成本会增加。我会尝试前面提到的其他事情。
绩效衡量
出于好奇,您究竟在哪里衡量绩效?是从客户端创建到查询执行结束?或者你只测量查询执行? 如果可能,您可以只创建一次客户端并在所有查询中重复使用它。