由於對mysql的併發插入資料能力沒有乙個很好的評估,因此在些多程序併發程式時,忽略了mysql的堵塞問題
以至程式時不時因為mysql的堵塞,導致子程序一直在等待mysql釋放堵塞,完成insert 指令。
故障現象:
原因排查:
開始懷疑是socket部分的問題。以為是由於連線伺服器時,在等待對方關閉連線而引起的堵塞。
花了很長一段時間來檢查和除錯socket部分的**,幾次以為已經解決了的時候,又出現故障,都是以失敗告終。
這個週末,重新將整個socket連線,資料庫連線逐一檢查。發現,sbwait 狀態時,是由於mysql的堵塞引起的。多程序併發的情況下,同時搶占mysql的資源。而mysql預設表型別,是表鎖定的。當a子程序鎖定進行插入時,b子程序只能等待。以至併發時,發生堵塞現象。
解決辦法:
說明: insert delayed into,是客戶端提交資料給mysql,mysql返回ok狀態給客戶端。而這是並不是已經將資料插入表,而是儲存在記憶體裡面等待排隊。當mysql有空餘時,再插入。
這樣的好處是,提高插入的速度,客戶端不需要等待太長時間。壞處是,不能返回自動遞增的id,以及系統崩潰時,mysql還沒有來得及插入資料的話,這些資料將會丟失。
觀測:做這些調整後,執行了一天,沒有出現堵塞情況。並且執行時間也縮短了。
通過phpmyadmin觀測mysql的程序,提交後,會有一些使用者為delayed,狀態為waiting for insert的程序。過一會,資料完全插入後就消失了。
總結:乙個系統的東西,就要系統的去考慮存在的問題和可能將要發生的問題。不能過於片面的自以為是。
Date getTime 執行緒堵塞問題
new date gettime 出現執行緒堵塞的問題概率比較低,但是一旦出現,那麼效能也將下降很多,下面 可以測試這個問題,建立10個執行緒,不斷執行。其堵塞原因在於這個方法引用了getjuliancalendar synchronized private static final basecal...
Date getTime 執行緒堵塞問題
new date gettime 出現執行緒堵塞的問題概率比較低,但是一旦出現,那麼效能也將下降很多,下面 可以測試這個問題,建立10個執行緒,不斷執行。其堵塞原因在於這個方法引用了getjuliancalendar synchronized private static final basecal...
Sidekiq任務堵塞問題
今天發現伺服器上的sidekiq 執行緒全忙。佇列裡任務積累了好多。sidekiq裡的任務基本都是爬蟲指令碼,都需要請求外部 但是有些 的響應時間或者讀取時間太久,一直一直卡在那裡。使得後面的任務不能執行。所以我們就應該控制請求外部鏈結的讀取時間,避免執行緒卡住。第一種用rest client請求....