golang的mongo批量寫入壓測

2022-03-19 14:36:00 字數 2498 閱讀 4977

在實際生產環境下,某場景下,數以千萬乃至上億的資料會批量落入db,nosql,而根據資料的ttl過期,會在某個多久之後的時間給這批資料del.

加入每天9點都在批量insert—all,而前n天的資料恰好在這個時間節點(n天後的9點)ttl過期,觀察db的io負載,會急速飈上去,io打的很高,甚至到100%。

根據生產上的如上情況,做了下面的測試:

在實際場景中,操作nosql是很常用的,下面分享下壓測mongo的場景和具體結果: 

測試用例**如下:

package main

import (

"fmt"

"gopkg.in/mgo.v2/bson"

"time")

func main()

presstest() //測試mongo寫入壓測

}func presstest ()

}//耗時統計函式

func timecost() func()

}func insertmfandroid(newmid string, tokennums

int)

for j := 0; j < tokennums; j ++

err :=collection.insert(docs...)

if err !=nil

}

//獲取過期時間

func getexpiretime() time.time

uat環境壓測 

mongo

副本集:

8核16g

虛擬機器,(上面已搭若干例項),已使用

10g,空閒記憶體

6g左右前提下,壓測

mongo

服務。(插入欄位和生產線上字段格式長度基本相同。)

1)單程序(攜程

)寫入:單次批量寫入,1萬條

/次,耗時

221ms

;2)單程序(攜程

)寫入:單次批量寫入,1千條

/次,耗時

38ms

(40ms

左右);

3)單程序(攜程

)寫入: 連續遍歷

1千次,每次

insert_all 1k條/

次,插入總數量

1百萬條記錄,總耗時

19s;

4)單程序(攜程

)寫入: 連續遍歷

1萬次,每次

insert_all 1k條/

次,  

插入總量

1千萬條記錄,總耗時

3min12s

(3min14s

),cpu

使用率

150%

左右,mongo

狀態每秒鐘

insert

操作5w

多次;5)單程序(攜程

)寫入: 遍歷兩次,每次

insert-all 1k條/

次,耗時

77ms

;6)併發寫入:20個程序同時批量寫入,每個程序總共

insert_all 100

萬條記錄,連續遍歷

1000

次,每次寫入

1000

條記錄,

mongo

的寫入次數每秒鐘

/20萬次寫操作,每個程序寫完

1min40

s,20

個程序寫入基本為

1min40s

左右。7)在2千萬的表中,單純的做

ttl過期,

iostat

檢視await

和util%

,util%

達到30-40%

左右,說明這個操作比較消耗

io效能

.8) 併發寫入:20個程序,

2千萬條記錄,每個程序寫入

100w

條記錄的

iostat

狀態

9)最左邊是mongo每秒鐘的寫操作次數,連線數和等待佇列正常,無明顯增高變化;

10)用固定集合capcollection指定集合(表)大小和條數,insert每秒鐘2w多條操作,iostat的util最高在30%多,io正常.

結合前幾篇寫的部落格, 位址如下,

建立mongo刪除的索引,根據業務,如果是白天忙時,晚上閒時,最好選擇晚上去做ttl過期,這個不會在業務高峰的時候,批量插入和刪除都去搶占io操作,

而單純的ttl過期,就會把io的util%打到30%,業務資料量如上,總計2000w資料,然後ttl索引過期.

要是再加上,2000w的資料,20個程序每個程序100w同時批量寫,io util%一下會飆公升上去.

故建議根據業務選擇刪除mongo的資料,或者選擇寫指令碼或程式手動控制或自動刪除.

Golang寫檔案的坑

golang寫檔案一般使用os.openfile返回檔案指標的write方法或者writestring或者writeat方法,但是在使用這三個方法時候經常會遇到寫入的內容和實際內容有出入,因為這幾個函式採用的不是清空覆蓋的方式,有時字串或陣列長度和檔案內容不一致的時候只覆蓋了一部分,這就需要在呼叫o...

mongo批量插入資料和長鏈結問題

1.大批量資料插入 當爬蟲獲取的資料量較大時,一條一條的寫入mongodb會過於消耗資源。這時候就需要用到insert many 方法,把資料放入列表中並批量插入,但是如果你為了資料不被重複建立了mongodb的唯一索引,就可能會導致部分資料無法寫入。因為insert many 預設是按序寫入,一條...

url的位址迴圈怎麼寫 用Golang寫爬蟲 一

之前一直都是再用python寫爬蟲,最近想體驗下golang寫爬蟲的感覺,所以就有了這個系列。我想要抓取的頁面是豆瓣top250頁面,選擇它的理由有3個 豆瓣頁面 相對規範 豆瓣對爬蟲愛好者相對更寬容 top250頁面簡潔,很適合拿來練手 我們先看第一版的 按邏輯我把抓取 分成2個部分 http請求...