PostgreSQL、Redis與Memcached的效能比較 - CYBERTEC

banq發表於2021-10-20

測試設定的一些特徵:

  • AMD Ryzen 3600 CPU 設定為效能模式。我的測試指令碼本質上是同步的,即基本上使用單個 CPU 核心,所以速度可能很重要。
  • Ubuntu 20.04 桌面作為作業系統,禁用交換。
  • PostgreSQL v13.3,即最新的。
  • 預設 PostgreSQL 配置:“shared_buffers=512MB”、“track_io_timing=on”、“shared_preload_libraries='pg_stat_statements'”。
  • 用於系統和資料庫的單個 NVMe SSD。
  • 使用準備好的語句讀取/寫入 Postgres 以獲得最佳查詢效能,避免解析後續呼叫。
  • 完全適合 PostgreSQL 管理快取(共享緩衝區)的資料集大小。
  • 非同步模式用於寫入資料,這意味著在伺服器崩潰/重啟的情況下,最近的資料可能會略有丟失,作為更多寫入(尤其是在小事務中)效能的權衡。但這與 Redis 和 Memcached 預設處理寫入的方式一致。不過,使用 Redis,還可以啟用 AOF 永續性以獲得 PostgreSQL 預設行為。
  • 兩個讀/寫測試都從 1 到$rows一一遍歷所有插入的隨機生成的浮點資料鍵。
  • 鍵值表在讀取測試之前被提取到 Postgres 快取中,因此不會像 Redis/Memcached 那樣有冷快取效應。
  • 我沒有測量 Postgres 的記憶體使用情況,因為在插入和快取所有資料之後,對於這個用例,這預計會非常穩定。
  • 執行時間記錄在應用程式端,並呼叫系統時鐘以匹配原始測試。請注意,我決定從伺服器端測量執行時間也是為了更好地瞭解“浪費”的數量,因為畢竟 Python 並不是效能測試的最佳選擇,原因有很多,我不想在這裡深入研究. 再往前走一點——結果確實非常可怕,人們不應該使用 Python 來對資料庫進行基準測試——很多 CPU 時間就在某處消失了!
  • 完整的測試指令碼可在此處獲得。執行大約需要 10-15 分鐘。基本上是這樣的:

CREATE UNLOGGED TABLE kv_test(key text, value int);
CREATE INDEX ON kv_test (key);
 
-- pseudo-code from the Python script
for $ROWS in [1000, 10000, 100000, 1000000]:
  truncate kv_test
  generate $ROWS random values
  for $i := 1 .. $ROWS:
    insert $key into kv_test ($rand[i], $rand[i])
  vacuum analyze the table
  for $i := 1 .. $ROWS:
    select * from kv_test where key = $rand[i]

 

PostgreSQL vs Redis vs Memcached:寫操作

寫入鍵值對的計算時間以毫秒為單位。

資料庫           1,000行    10,000行    100,000行    1,000,000行
Redis (v3.0.7)        34    214          1,666        14,638
Memcached (v1.4.14)    23    100         276         2,813
PostgreSQL (v13.3)    29.6    304         2,888       31,230

 

PostgreSQL vs Redis vs Memcached:讀操作

計算的讀取鍵值對的時間(毫秒)。

資料庫          1,000    10,000    100,000    1,000,000
Redis (v3.0.7)     8        6        8         8
Memcached (v1.4.14)  9        14       14         30
PostgreSQL (v13.3)   0.026    0.028    0.027       0.029

Postgres 的讀測試結果領先,看起來非常好!與 Postgres 相比,Redis/Memcached 的平均鍵讀取時間似乎太慢了。我懷疑他們仍然使用遠端機器作為快取。

寫入操作方面,Postgres 對於 100k 和 1M 行記錄寫入,僅比 Redis 慢 2 倍。

快取的主要思想是,與無論如何寫入/更新相比,只有當我們從它們中讀取更多內容時,它們才有用!

很高興看到 Postgres 對不斷增長的資料集的響應的相對穩定性非常非常好!甚至擊敗了在 100 萬行讀取慢2 倍的 Memcached!

這一切都可能表明,為 PostgreSQL 選擇的演算法在數學上是合理的,並且實現得很好!

 

banq注:不能忽視Redis/Memcached分散式伸縮擴充套件能力。

相關文章