我有一个go实用程序,它从平面文件中读取文档并将它们批量加载到couchbase中。当在一台计算机上执行2个写入程序线程时,应用程序能够以高达每秒21K写入的速度插入数据(目标是在网络中具有一个服务器的远程沙发基集群)。
但是当从2台不同的机器(每台1个线程)执行2个写入程序线程时,插入速度降低到一半(10K写入/秒)。 由于两台机器都使用自己的RAM和CPU进行插入,而且实用程序已经显示出每秒高达25K写入的速度,因此网络似乎不是问题(我也检查了网络利用率,它是使用多台机器时低于50%。)
注意:所有使用的机器都配有i7 3.40GHz四核处理器和8GB RAM。插入的数据总量高达500MB。 存储桶配置:5.00GB RAM,存储桶磁盘I / O优先级:高
我需要知道造成这种速度差距的原因。请帮忙......
以下是代码:
package main
import (
"bufio"
"encoding/csv"
"fmt"
"io"
"log"
"strconv"
"os"
"sync"
"runtime"
"gopkg.in/couchbase/gocb.v1"
)
var (
bucket *gocb.Bucket
CB_Host string
)
func main() {
var wg sync.WaitGroup
CB_Host = <IP Address of Couchbase Server>
runtime.GOMAXPROCS(runtime.NumCPU())
cluster, err := gocb.Connect("couchbase://" + CB_Host) //..........Establish Couchbase Connection
if err != nil {
fmt.Println("ERROR CONNECTING COUCHBASE:", err)
}
bucket, err = cluster.OpenBucket("BUCKET", "*******")
if err != nil {
fmt.Println("ERROR OPENING BUCKET:", err)
}
Path := "E:\\Data\\File_" \\Path of the text file that contains data
for i := 1; i <= 2; i++{
wg.Add(1)
go InsertDataFromFile(Path+strconv.Itoa(i)+".txt", i, &wg)
}
wg.Wait()
err = bucket.Close() //.............. Close Couchbase Connection
if err != nil {
fmt.Println("ERROR CLOSING COUCHBASE CONNECTION:", err)
}
}
/*-- Main function Ends Here --*/
func InsertDataFromFile(Path string, i int, wg *sync.WaitGroup) (){
var (
ID string
JSONData string
items []gocb.BulkOp
)
csvFile, _ := os.Open(FilePath) //...............Open flat file containing data
reader := csv.NewReader(bufio.NewReader(csvFile))
reader.Comma = '$'
reader.LazyQuotes = true
counter := 1
fmt.Println("Starting Insertion of File "+ strconv.Itoa(i) + "...")
for {
line, error := reader.Read()
if error == io.EOF {
break
} else if error != nil { //...............Parse data and append it into items[] array
log.Fatal(error)
}
ID = line[0]
JSONData = line[1]
items = append(items, &gocb.UpsertOp{Key: ID, Value: JSONData})
if counter % 500 == 0 {
BulkInsert(&items) //................Bulk Insert Next 500 Documents Data into couchbase
items = nil
}
counter = counter + 1
}
BulkInsert(&items) //................Insert remaining documents
items = nil
fmt.Println("Insertion of File "+ strconv.Itoa(i) + " Completed...")
wg.Done()
}
func BulkInsert(item *[]gocb.BulkOp) (){
err := bucket.Do(*item)
if err != nil {
fmt.Println("ERROR PERFORMING BULK INSERT:", err)
}
}