[英]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.