Database
PostgreSQL 大量寫入
我正在將 postgreSQL 用於科學應用程序(非監督式分群)。python 程序是多執行緒的,因此每個執行緒管理自己的 postmaster 程序(每個核心一個)。因此,它們有很多並發性。
每個執行緒程序通過兩個 SQL 查詢無限循環。第一個是閱讀,第二個是寫作。讀操作考慮的行數是寫操作考慮的行數的 500 倍。
這是 dstat 的輸出:
----total-cpu-usage---- ------memory-usage----- -dsk/total- --paging-- --io/total- usr sys idl wai hiq siq| used buff cach free| read writ| in out | read writ 4 0 32 64 0 0|3599M 63M 57G 1893M|1524k 16M| 0 0 | 98 2046 1 0 35 64 0 0|3599M 63M 57G 1892M|1204k 17M| 0 0 | 68 2062 2 0 32 66 0 0|3599M 63M 57G 1890M|1132k 17M| 0 0 | 62 2033 2 1 32 65 0 0|3599M 63M 57G 1904M|1236k 18M| 0 0 | 80 1994 2 0 31 67 0 0|3599M 63M 57G 1903M|1312k 16M| 0 0 | 70 1900 2 0 37 60 0 0|3599M 63M 57G 1899M|1116k 15M| 0 0 | 71 1594 2 1 37 60 0 0|3599M 63M 57G 1898M| 448k 17M| 0 0 | 39 2001 2 0 25 72 0 0|3599M 63M 57G 1896M|1192k 17M| 0 0 | 78 1946 1 0 40 58 0 0|3599M 63M 57G 1895M| 432k 15M| 0 0 | 38 1937
我很確定我可以寫得比這更頻繁,因為我已經看到它在 dstat 上寫到 110-140M。我怎樣才能優化這個過程?
我是 dstat 的作者和系統工程師。我注意到 60% 的平均 iowait 時間。鑑於您的輸出,我會說您的磁碟非常繁忙。您可以在最近的 dstat 版本中嘗試新的 –disk-util 外掛選項。
這將向您顯示磁碟的使用率,我希望您正在使用的磁碟接近 100%。因此,鑑於您特定的 I/O 模式,您的磁碟已足夠忙於處理讀取或寫入請求。
為什麼這低於基準數字?因為通常在您對磁碟吞吐量進行基準測試時,您會以某種模式對磁碟施加壓力,該模式最適合您的磁碟/記憶體(例如,線性讀取或使用單個執行緒的大塊大小的寫入),而在您目前的工作負載中,特定模式可能不太理想(隨機讀取或寫入具有小或不同塊大小的多個執行緒請求資源)。
這種模式上的差異會對吞吐量產生巨大影響。在實際工作負載期間獲得更好的吞吐量意味著您必須使用更接近實際工作負載的工作負載進行基準測試,以查看在這些條件下可以達到的最大值。或者,您可以通過更改設計(例如,將應用程序中的塊大小與文件系統/磁碟子系統對齊)或改進記憶體和/或預讀來影響實際工作負載。
如果不分析您的工作負載是什麼樣子,就沒有簡單的方法可以解決此問題。