我設定了一個小型 python 程序,它使用 websocket 連接從 API 獲取資料並將其寫入 postgresql 資料庫。
只有兩個(使用者)程式在運行:一個是 websocket 連接,用於接收資料並將其寫入資料庫;另一個程式是基本的 while 循環,每 15 秒運行一次並檢查是否正在寫入資料。
這兩個程序都由 Supervisor 進行守護進程,並且當 15 秒內沒有寫入資料時,Supervisor 將重新啟動(以處理無效的 Websocket 連線)。
另外,我(非常)懶惰,使用 Django ORM 為我做資料庫連接,而不是直接使用 psycopg2。
它可以工作,但我的伺服器上的 CPU 負載一直很高。它是一個 1CPU 1Gb 記憶體伺服器(AWS micro)。 top 指令輸出以下內容:
top - 17:10:58 up 19 days, 15:03, 1 user, load average: 1,57, 1,63, 1,58
Tasks: 116 total, 1 running, 115 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0,3 us, 0,3 sy, 0,0 ni, 0,0 id, 99,0 wa, 0,0 hi, 0,0 si, 0,3 st
KiB Mem : 1014552 total, 63440 free, 86572 used, 864540 buff/cache
KiB Swap: 1048572 total, 987380 free, 61192 used. 615096 avail Mem
嗯,系統有點滯後,有時會崩潰。
我可以看到這是由高 IO 負載(99 wa)引起的。很多睡眠進程。但我平均每天只在資料庫上寫入 400MB。
我已經嘗試根據文件修改 Postgresql 配置以實現高寫入負載並設定交換記憶體檔案(1GB),但這些對緩解平均負載沒有幫助。
因此,對於像我這樣沒有經驗的用戶,我不知道這是否是我應該期望的負載。我可以優化這個設定嗎?如果我刪除 django ORM 並僅使用 psycopg2 編寫程序,它會有所改善嗎?我應該為無效的 websocket 連線制定不同的檢查方法嗎?是否有任何伺服器配置可以針對這種需求進行最佳化?
謝謝!
答案1
我設法弄清楚如何使用此連結修復它http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
基本上我運行iotop
並輸出哪個進程導致高 IO 負載。在那裡我發現負載是由於讀取資料庫而不是寫入造成的。所以我意識到我在做一些愚蠢的事情:我透過計算條目數同時檢查它是否正在記錄來查詢整個資料庫。平均讀取速度為 500MB/s。因此,我更改了代碼以檢查最後一個條目的主鍵編號,而不是對條目進行計數,然後...成功了。平均負載現在為 0.01。感謝@match的提醒