簡體   English   中英

調查 Google Cloud Spanner 延遲 - 二級索引是否鎖定?

[英]Investigating Google Cloud Spanner Latency - are secondary indexes locking?

我有一個應用程序,它使用以下代碼將數十萬行(每行只有 3 列)插入到 spanner,並同時運行 5000 個批次。

public async Task ExecuteBatchInsertOrReplaceAsync<T>(List<T> items, SpannerConnection connection)
{
    // This will throw if the items count * column > 20,000. In this case, batch the batches.
    await connection.RunWithRetriableTransactionAsync(async transaction =>
    {
        await Task.WhenAll(items.Select(item => ExecuteInsertOrReplaceAsync(item, connection, transaction)));
    });
    
    Logger.LogInformation($"ExecuteBatchInsertOrReplaceAsync executed on {items.Count} items.");
}

public async Task<int> ExecuteInsertOrReplaceAsync<T>(T item, SpannerConnection connection, SpannerTransaction spannerTransaction = null)
{
    var parameters = new SpannerParameterCollection().CreateKeys<T>();
    parameters.PopulateFrom(item);

    await using var command = connection.CreateInsertOrUpdateCommand(TableName, parameters);
    command.Transaction = spannerTransaction;

    var count = await command.ExecuteNonQueryAsync();
    return count;
}

但是當執行的 spanner 以延遲運行時,使寫入花費的時間比我想要的要多。 Spanner 監控顯示我有大約 40 秒的延遲 使用 5 個 pod,我的寫入吞吐量約為 14MiB/s。

我要插入的表有一個唯一索引。 Spanner 文檔建議高延遲可能是表鎖定的結果。 使用檢查 Spanner 的鎖定統計信息

SELECT CAST(s.row_range_start_key AS STRING) AS row_range_start_key,
   t.total_lock_wait_seconds,
   s.lock_wait_seconds,
   s.lock_wait_seconds/t.total_lock_wait_seconds frac_of_total,
   s.sample_lock_requests,
   t.interval_end
FROM spanner_sys.lock_stats_total_10minute t, spanner_sys.lock_stats_top_10minute s
WHERE
  t.interval_end = "2022-03-04T16:00:00Z" 

向我展示確實有許多鎖正在等待幾秒鍾,每個鎖都有 sample_lock_requests = _Index_ix_my_index_name._exists,Exclusive

所以這是我的問題:spanner 是否會減慢我的寫入速度,因為我的唯一二級索引在每次寫入時都鎖定了表,或者延遲可能是由其他原因引起的嗎? 如果我遺漏了任何關鍵信息,我深表歉意,請告訴我。

謝謝

spanner 是否減慢了我的寫入速度,因為我的唯一二級索引在每次寫入時都鎖定了表

請注意,Spanner 不會鎖定表,鎖定粒度是行和列,或單元格。 有關鎖定的更多詳細信息: https://cloud.google.com/spanner/docs/transactions#locking

還是延遲可能是由其他原因引起的?

在不了解您的工作負載的更多細節的情況下,通常很難得出導致 Spanner 高延遲的原因:模式、您插入的鍵范圍、您的數據庫當前是空的還是已經有數據、如果有數據,它們是如何分布的等等。一般來說,唯一索引約束將在提交時進行驗證,因此如果您沒有插入展開的鍵范圍,就會出現鎖爭用。 但是很難斷定 40 秒的延遲是否完全是由這個因素造成的。

此頁面https://cloud.google.com/spanner/docs/bulk-loading包含有關批量加載最佳實踐的一些信息。 如果您的數據庫當前為空並且您正在進行一次性批量加載,那么刪除約束並在數據加載后將其添加回來會更快。

如果要插入到非空表中,請嘗試為每個事務使用較小的變異大小,這可能會有所幫助。

您還可以使用 Key visualizer https://cloud.google.com/spanner/docs/key-visualizer查看您的插入是否會導致熱點或滾動熱點,這通常會導致高延遲。

如果您需要更詳細的幫助,請隨時提交服務單。

暫無
暫無

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

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