pingcap/tidb

Avoid double-copy buffer when responding MySQL packets

Open

#32,097 opened on Feb 3, 2022

View on GitHub
 (3 comments) (0 reactions) (1 assignee)Go (40,090 stars) (6,186 forks)batch import
help wantedtype/enhancementtype/performance

Description

Enhancement

When we want to return the packages to the client, our logic is:

  1. Prepare the packet and serialize it to a buffer allocated by the area.Allocator
  2. Write this data through packetIO.WritePacket, in the WritePacket, the data will be cached in a buffer writer
  3. Flush the buffer writer to the connection

Mostly, e.g, for write ok https://github.com/pingcap/tidb/blob/0c19f927419f6b043a345e4a2af5336272830229/server/conn.go#L1442, we can see that we don't need to double copy the buffer, we can serialize the data and write it directly to the connection.

Contributor guide