簡體   English   中英

來自 PHP AppEngine 的 Google 數據存儲非常慢

[英]Google Datastore very slow from PHP AppEngine

我正在使用官方google-cloud-php庫從我的 PHP App Engine 實例訪問 Google Cloud Datastore。

我一直看到每個查詢的延遲超過 0.35 秒 即使對於數據存儲中少於 100 個實體的簡單查詢也是如此。

我的 Web 應用程序需要對每個請求進行 4 次左右的連續數據存儲查詢,這使得數據存儲完全無法使用(每個頁面加載的延遲始終為 1.5 到 3 秒)

我錯過了什么嗎?


這是我連接到數據存儲的方式:

        // Same issue even without 'authCache' (a memcached wrapper).
        $authCache = new DatastoreAuthCache();
        $datastore = new DatastoreClient([
            'projectId' => AppIdentityService::getApplicationId(),
            'authCache' => $authCache
        ]);
        Datastore::$ds = $datastore;

以下是我的查詢的兩個示例:

    // Lookup by keys.
    $ds = Datastore::get();
    $queryResults = $ds->lookupBatch($keys);
    $rows = keyValue($queryResults, "found");

    // Query by fields.
    $query = $ds->query()
        ->kind(self::EntityName)
        ->filter('owner', '=', $a)
        ->filter('target', '=', $b)
        ->limit(1)
        ->keysOnly();

    $results = $ds->runQuery($query);
    foreach ($results as $entity) {
        return $entity;
    }

這種延遲水平是否在意料之中? 我可以緩存一些結果,但不是全部,所以我希望這是我的問題。

這是我已經嘗試改善延遲的方法:

  • 添加了“authCache”處理程序以緩存數據存儲 API 令牌(無影響)

  • 確認數據存儲和應用引擎實例在同一區域

  • 確認 index.yaml 設置正確

  • 確認延遲是由於數據存儲調用而不是業務邏輯

  • 其他數據庫后端工作正常(Cloud SQL 服務器在 < 0.1 秒內返回)。 本地數據存儲模擬器也在 <0.01 秒內返回。

我可以做些什么來改善這種延遲?

我不確定這是否符合答案,但我會嘗試幫助您使用 Stack Driver 對其進行調試。

在 Cloud Console 中查看您的日志 - https://console.cloud.google.com/logs/viewer

尋找慢處理程序。

gae_log_message

將鼠標懸停在延遲列上並單擊。 這將帶您進入 Stack Driver 監控中的分布式跟蹤系統。 這可能會確認 Datastore 很慢,但希望它會揭示導致緩慢的其他原因。

它看起來像這樣:

stack_driver_tracing

最大的瓶頸是建立與 Datastore 的連接(這可能需要 200 毫秒,這是身份驗證緩存的幫助所在)。 不幸的是,這對 php 來說是個壞消息,因為我們無法建立永久連接。 Datastore 客戶端需要在每次請求時重新連接。

嘗試優化時會變得更加困難,因為它嚴重依賴延遲加載。 似乎最有效的是為所有請求重用相同的數據存儲客戶端實例。

限制過濾器的數量可以加快查詢速度,取而代之的是檢索更大的數據塊,然后可以在本地過濾這些數據。 使用諸如redis之類的東西,它也可以兼作數據緩存。

cron服務獲取的批處理更新也有助於更快地發布請求。 通知可以推送到`websocket 或在后續請求中獲取。

你沒有提到它,所以不清楚你是否使用gRPC ,如果安裝了模塊, DatastoreClient將默認使用grpc否則它會回退到REST ,相比之下,它要慢得多。

要檢查您是否安裝了grpc

php -m|grep grpc

我能想到的唯一其他建議是索引,但這只會對大型數據集有所幫助。 您還應該嘗試在另一個數據中心進行測試,因為您所在的數據中心可能會出現擁塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM