Go 가비지 컬렉터 해킹: 어셈블리에서의 포인터 저장

2025-06-23
Go 가비지 컬렉터 해킹: 어셈블리에서의 포인터 저장

이 글에서는 Go 어셈블리 코드에서 포인터를 조작하는 복잡성을 자세히 살펴보고, Go 가비지 컬렉터와의 중요한 상호 작용에 중점을 둡니다. 포인터를 직접 조작하려면 `runtime.gcWriteBarrier2` 및 `runtime.writeBarrier` 와 같은 함수를 사용하여 GC에 명시적으로 알려야 합니다. 이를 통해 충돌 및 가능한 크래시를 방지할 수 있습니다. 이 글에서는 AVX 명령어를 최적으로 사용하기 위한 128비트 정렬된 메모리 할당이라는 과제에도 해결책을 제시합니다. 하지만 향후 Go 버전에서 가용성이 변경될 수 있으므로 내부 런타임 함수에 의존하지 않도록 주의해야 합니다.

더 보기

Linux 파이프 성능 한계에 도전: 3.5GiB/s에서 62.5GiB/s로의 최적화

2025-06-22
Linux 파이프 성능 한계에 도전: 3.5GiB/s에서 62.5GiB/s로의 최적화

이 글에서는 파이프를 통해 데이터를 읽고 쓰는 테스트 프로그램을 반복적으로 최적화하여 Linux에서 Unix 파이프의 구현 방식을 탐구합니다. 약 3.5GiB/s의 처리량을 가진 간단한 프로그램으로 시작하여 여러 최적화 단계를 거쳐 성능을 20배 이상 향상시킵니다. 주요 개선 사항으로는 `vmsplice` 및 `splice` 시스템 호출을 사용하여 데이터 복사를 제거하고, 대용량 페이지를 활용하여 페이징 오버헤드를 줄이며, 바쁜 루프를 사용하여 동기화 비용을 최소화하는 것이 포함됩니다. Linux의 `perf` 도구를 사용한 코드 예시와 성능 분석을 통해 이 과정을 자세히 설명합니다.

더 보기
개발 파이프