- 【TiDB 版本】: v4.0.0
- 【问题描述】:通过go client的写入速度比sysbench的要慢,而且会出现WARN[0058] get timestamp too slow: 235.40136ms 之类的打印
测试代码:
type worker struct{
id int
}
func newWorker(i int) *worker{
instance := new(worker)
instance.id = i
return instance
}
func (w *worker) start(k string, v string) {
go func() {
_k := k + strconv.Itoa(w.id)
_v := v + strconv.Itoa(w.id)
_key := byte(_k)
_val := byte(_v)
for {
txnentry(_key, _val)
}
}()
}
var pdAddr = flag.String(“pd”, “127.0.0.1:2379”, “pd address”)
var txnclient *txnkv.Client
func initDB() {
// todo: txnclient
var (
err error
)
addr := os.Getenv(“PD_ADDR”)
if addr != “” {
os.Args = append(os.Args, “-pd”, addr)
}
flag.Parse()
txnclient, err = txnkv.NewClient(context.TODO(), []string{*pdAddr}, config.Default())
if err != nil {
panic(err)
}
}
func getKey(keyLen int) (keystr string){
pwd, _ := os.Getwd()
_len := strconv.Itoa(keyLen)
targetFile := pwd + “\test” + _len + “file”
key, err := ioutil.ReadFile(targetFile)
if err != nil{
}
keystr = string(key)
return keystr
}
func getValue(valueLen int) (valuestr string){
pwd, _ := os.Getwd()
_len := strconv.Itoa(valueLen)
targetFile := pwd + “\test” + _len + “keyfile”
value, err := ioutil.ReadFile(targetFile)
if err != nil{
}
valuestr = string(value)
return valuestr
}
func txnentry(_key byte, _val byte){
// todo: txn put
txn, err := txnclient.Begin(context.TODO())
if err != nil{
panic(err)
}
{
err := txn.Set(_key, _val)
if err != nil {
panic(err)
}
}
txn.Commit(context.Background())
// todo: get
txn, err = txnclient.Begin(context.TODO())
if err != nil{
panic(err)
}
{
_, err := txn.Get(context.TODO(), _key)
if err != nil {
panic(err)
}
}
// todo: del
txn, err = txnclient.Begin(context.TODO())
if err != nil{
panic(err)
}
{
err := txn.Delete(_key)
if err != nil {
panic(err)
}
}
txn.Commit(context.Background())
}
func main(){
go func() {
http.ListenAndServe(“0.0.0.0:9999”, nil)
}()
key := getKey(1)
val := getValue(1)
initDB()
for i := 0;i<10;i++{
worker := newWorker(i)
worker.start(key, val)
}
for{
}
}
测试时发现cpu占用一直飙高,sysbench的性能可以达到97k ops,通过go client的方式测试性能只有9K ops,差距在10倍左右。示例代码中key的大小为128字节,value的大小为1KB,测试发现cpu的占用率很高,通过pprof包测试,占用较高的函数如下图