[WIL] zero-copy

yoonn·2024년 2월 28일
post-thumbnail

zero-copy?

CPU가 메모리의 한 영역에서 다른 영역으로 데이터를 복사하는 작업을 최소화하거나 피하는 작업

without-zero-copy

웹 애플리케이션에서 정적 콘텐츠를 제공한다는 것은?

  1. kernel이 disk에서 데이터를 읽고 kernel-user 경게를 넘어 애플리케이션으로 푸시
  2. 애플리케이션이 다시 kernel-user 경계를 넘어 socket에 쓰기 위해 푸시

데이터가 kernel-user 경계를 넘어다닐 때마다 copy가 일어나므로 CPU와 memory가 소모된다.

traditional data copy

traditional context switch

with-zero-copy

zero-copy를 사용하는 애플리케이션은 kernel이 애플리케이션 통하지 않고 disk 파일에서 socket으로 직접 데이터를 복사하도록 요청한다.
애플리케이션 성능을 크게 향상시키고 kernel-user 모드 간 context switching 횟수를 줄여준다.

copying data with zero-copy

context switching in copying data with zero-copy

실습

소스코드: https://github.com/yoon1/wil/tree/main/zero-copy

without-zero-copy

func copyWithoutZeroCopy(sourceFile, destinationFile string) {
	source, err := os.Open(sourceFile)
	if err != nil {
		panic(err)
	}
	defer source.Close()

	destination, err := os.Create(destinationFile)
	if err != nil {
		panic(err)
	}
	defer destination.Close()

	bufferSize := 1024
	buffer := make([]byte, bufferSize)

	for {
		n, err := source.Read(buffer)
		if err == io.EOF {
			break
		}
		if err != nil {
			panic(err)
		}

		_, err = destination.Write(buffer[:n])
		if err != nil {
			panic(err)
		}
	}
}

with-zero-copy

func copyWithZeroCopy(sourceFile, destinationFile string) {
	source, err := os.Open(sourceFile)
	if err != nil {
		panic(err)
	}
	defer source.Close()

	destination, err := os.Create(destinationFile)
	if err != nil {
		panic(err)
	}
	defer destination.Close()

	_, err = io.Copy(destination, source)
	if err != nil {
		panic(err)
	}
}

benchmark test

func BenchmarkCopyWithoutZeroCopy(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		copyWithoutZeroCopy(sourceFile, destinationWithoutZeroCopy)
	}
}

func BenchmarkCopyWithZeroCopy(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		copyWithZeroCopy(sourceFile, destinationWithZeroCopy)
	}
}
filesize(bytes)non-zero-copyzero-copy
859832 ns/op53925 ns/op
7473152321734 ns/op369461 ns/op

대량의 데이터를 복사하는 애플리케이션에서는 zero-copy 기법이 높은 성능 향상을 제공하는 것을 확인했다.

Reference

0개의 댓글