資料擷取伺服器中的 CPU 負載較高

資料擷取伺服器中的 CPU 負載較高

我設定了一個小型 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的提醒

相關內容