重寫收集程式感想

2021-09-03 10:39:42 字數 1637 閱讀 6469

本週周五下午,週六,週日我在家加班忙著重新寫我們專案的收集資料程式。

原來的程式是由我屬下用c寫的,在執行一段時間後出現假死的請求,找來找去沒有發現問題。後來決定用perl重寫,用perl重寫的原因是:

perl的優勢是解析字串,我們的收集程式需要解析通過tcp收到的字串,提取相關的資料,perl是模式匹配的"帶頭大哥",另外非常靈活的陣列和hash可以很方便處理資料。

perl的優勢其實也是劣勢,解析功能很強大,同時導致效能沒有c的強大,我之前一開始沒有用perl而用c的緣故就是,不確定perl寫出來的程式是否能夠支援每分鐘5000次請求。直到我看到perl有支援ev的模組(anyevent類似於c的libevent之類的非同步io的高效服務)時,正好遇到c程式出現問題,因此決定用perl重寫。

1.周五下午重新開始寫**,解析資料的模組很快寫完了,得益於perl的解析功能強大。

2.接下來是安裝perl模組,網上說perl5.14.1比perl5.8.8快,倒弄了半天安上perl5.14.1,安裝anyevent比較順利。

3.按照網上找的寫了個例子,anyevent的資料太少了

下面是悲劇開始,我開始了漫長的解決問題之路

4.由於資料要進入到資料庫裡,安裝dbi,dbd::mysql時總是安裝失敗,最好搞了幾個小時終於安上了,新版的perl的相容性不好

5.這時已經下班了,之後把入庫的**寫完加到anyevent裡,發現最後測試出的rps為140

6.週六下午,在家沒事重新想想效能的問題,

1) 首先把解析的**重新優化減少不必要的解析,例如因為提取的資料都是在前3行,因此解析時解析完第3行就跳出。

2) 把for迴圈裡的sql插入改為拼接sql字串,最好一次性插入。

3)把程式改為多執行緒,發現不行,主要是mysql連線不能執行緒共享,在網上找了資料沒有解決辦法。

4)改多程序,發現這樣系統負載急劇上公升。

5) 忽然想起有一種設計模式 分配任務模式,就是前端是接收請求,後端起20個程序,前端收到請求後馬上應答並關閉請求(對方其實不需要響應結果,只要送達即可),並把請求**給後端任意乙個工作程序進行處理,然後入庫。用這種模式理論上應該達到20*140rps,但是加上資料庫瓶頸,估計最好實際執行也能上千rps,這個基本上達到要求。這種方式有點類似雲lvs,不同的是我接收請求後馬上斷掉連線,如下圖所示,我的程式資料流是單向流動的

從圖上看來,有兩個效能瓶頸:lvs,資料庫。

collect_lvs按照上面測試中可以看到anyevent最高能夠達到9000rps,但是時間測試中**請求是要消耗時間的,最後測試出的是1614rps,這個效果比較好基本上滿足需要。

資料庫是耗時大戶,要提高效率目前只能用多台資料伺服器,但是資源有限只能用一台了。

6.我按照上面的設計把collect_lvs和collect_work寫完後,在一台虛機(cpu1g,記憶體1g)測試發現,發了10000條資料,測試結果為1614rps,但是從入庫的資料看到的是,傳送完畢之後,資料還有一大半沒有入庫,過1分鐘才入庫完畢,統計到每一秒,達到了400多rps,效果比剛才測試的要好,在執行平台上應該能夠翻倍(因為配置是虛機的4倍)。

7.弄完這個之後,為了讓執行程式不能異常退出,和需要檢測各個worker是否工作正常,我寫了個daemon程式,監控這些程序,若是掛了則馬上重啟。發現這個工作非常繁瑣,花費了週日的乙個上午和晚上,還導致我去參加cu的資料庫沙龍遲到。

小程式 批量收集formid

第一次寫文章,主要是記錄一下之前公司中業務的需要,封裝formid的乙個思路,方便自己和其他人,不多說,上 const common require utils common let ishide false page onload onshow onhide data formsubmit e i...

怎麼重寫MDK(KEIL)Flash燒寫程式

syd8801是一款低功耗高效能藍芽低功耗soc,整合了高效能2.4ghz射頻收發機 32位arm cortex m0處理器 128kb flash儲存器 以及豐富的數字介面。syd8801片上整合了balun無需阻抗匹配網路 高效率dcdc降壓轉換器,適合用於可穿戴 物聯網裝置等。具體可諮詢 摘錄...

微信小程式重寫checkbox radio樣式

1 方形對勾 重寫 checkbox 樣式 未選中的 背景樣式 checkbox wx checkbox input 選中後的 背景樣式 紅色背景 無邊框 可根據ui需求自己修改 checkbox wx checkbox input.wx checkbox input checked 選中後的 對勾...