iT邦幫忙

0

setInterval定時刷新ajax 造成CPU負載過高

各位前輩大家好,近期遇到一些網頁問題,因網頁頁面需即時刷新,頁面包含多筆資料與多張Highcharts圖表,每筆資料都是要拉DB(後端使用flask),前後端串資料的部分我使用ajax,並使用setInterval每30秒更新,但是這樣連續撈取DB資料卻導致CPU使用率上升飆到100,導致網頁當掉QQ

ajax取值的部分
https://ithelp.ithome.com.tw/upload/images/20210626/20138901UyU9eeMbkz.png

想請教各位前輩我該如何解決這個問題...
謝謝前輩幫忙/images/emoticon/emoticon02.gif

資料量越來越大且又無法寫入 cache 的話,想想有沒有必要每30秒刷新一次吧,且要釐清到底是資料庫取得速度太慢還是前端圖表渲染太慢,解決的方式有很多種,但是你得先確定問題是哪一層
D路里 iT邦新手 5 級 ‧ 2021-06-27 07:59:29 檢舉
你這功能要是對外的產品服務,如果機會見到,真想刷爆你們
0
froce
iT邦大師 1 級 ‧ 2021-06-26 22:34:29
  1. 麻煩程式碼用程式區塊,方便別人編輯
  2. 你hm3001該不會每30秒就重新整個繪製一次吧...那cpu當然都會100%
0
小魚
iT邦大師 1 級 ‧ 2021-06-26 22:47:33

你的繪圖是在前端對吧? 是在前端對吧?

0

我會建議你使用 setTImeout 不要使用 setInterval

因為 setInterval 最好是用在可以確保立即處理回應的事上。
如果需要用在AJAX等有BACK CALL的東西。
安全點還是使用 setTImeout ,確定運行完再倒數。

另外,如果30秒拿一次資料就會吃詪大資源的話。
這樣你的DB結構及資料的寫法要很小心。
如果是多人都這樣取得的話。

最好資料庫是做成有緩存制的才行。這樣主機才不會吃太重。
如果真的有即時資料的需求。且連線數也很高的情況下。
基本上程式上能改善的空間也很有限,只能用設備來處理了。

早期我是有每秒約50~100的請求並發量。最高有過500的並發量。
我是搭配了緩存機制及讀寫分離處理才過的。

1
I code so I am
iT邦高手 1 級 ‧ 2021-06-27 14:12:32

兩種解法:

  1. 使用 redis: 將最新內容放在redis server.
  2. 使用 SignalR: 有更新內容,由 Server 推播至瀏覽器。
0
淺水員
iT邦高手 3 級 ‧ 2021-06-27 15:07:35

當掉的是客戶端的頁面還是伺服器?
(看F12是卡在等 ajax 回應,或是收到資料後的畫面更新)

如果是伺服器的問題,上面已經有很多建議了

如果是瀏覽器運算的問題,可以考慮「只更新資料有變動的圖表」或是「只更新使用者看得到的畫面部分」。

我要發表回答

立即登入回答