即使使用缓存池,Google Cloud Spanner 连接也很慢超过 800 毫秒 扳手配置客户位置会话绩效衡量

问题描述

我的公司正在考虑将我们的数据库迁移到多租户架构中的 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 个会话,因此您可能还需要增加此数量。请注意,一开始我不会增加这些数字,因为维护会话池会产生相关成本,随着添加更多会话,该成本会增加。我会尝试前面提到的其他事情。

绩效衡量

出于好奇,您究竟在哪里衡量绩效?是从客户端创建到查询执行结束?或者你只测量查询执行? 如果可能,您可以只创建一次客户端并在所有查询中重复使用它。