optimize performance: reduce allocations, buffered I/O, and zero-copy reads

- Read path: eliminate redundant allocation in bsPerformCommand - remove
  the pre-allocation before bs.Read() and the append loop for zero-fill,
  use direct copy and in-place zero-fill instead
- parseHeader: use command pool (getCommand) instead of direct allocation,
  reducing GC pressure on the hot path
- Unmap: use a shared 1MB zero buffer instead of allocating per-descriptor,
  dramatically reducing allocations for large unmap operations
- Network I/O: add 256KB bufio.Writer to iSCSI connections, batching
  small PDU writes into fewer syscalls. Flush after txHandler completes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lei Xue
2026-03-14 19:03:30 +08:00
parent 729b450ac9
commit 16108ced95
5 changed files with 41 additions and 10 deletions

View File

@@ -312,8 +312,7 @@ func parseHeader(data []byte) (*ISCSICommand, error) {
if len(data) != BHS_SIZE {
return nil, fmt.Errorf("garbled header")
}
// TODO: sync.Pool
m := &ISCSICommand{}
m := getCommand()
m.Immediate = 0x40&data[0] == 0x40
m.OpCode = OpCode(data[0] & ISCSI_OPCODE_MASK)
m.Final = 0x80&data[1] == 0x80