GN⁺ 12달전 | parent | ★ favorite | on: Go의 Reaper를 속이기(mcyoung.xyz)
Hacker News 의견
  • 이 기사는 재미있는 읽을거리임

    • 이 기사를 즐겼거나 Go에서 메모리 할당을 더 잘 제어하고 싶다면, 내가 작성한 패키지를 확인해 보길 바람
    • 피드백을 받거나 다른 사람이 사용해 주면 좋겠음
    • 이 패키지는 런타임과 별도로 자체 메모리를 할당하여 GC를 완전히 우회함
    • 할당 시 포인터 타입을 허용하지 않지만, 동일한 기능을 제공하는 Reference[T] 타입으로 대체함
    • 메모리 해제는 수동으로 이루어지므로, 가비지 컬렉션에 의존할 수 없음
    • Go에서 이러한 커스텀 할당자는 일반적으로 함께 생성되고 소멸되는 할당 그룹을 지원하는 아레나를 지향함
    • 그러나 offheap 패키지는 대규모 장기 데이터 구조를 구축하여 가비지 컬렉션 비용을 제로로 만드는 것을 목표로 함
    • 대규모 인메모리 캐시나 데이터베이스 같은 것들임
  • 최근 Go에서 성능 튜닝을 하면서 성능을 극대화하기 위해 매우 유사한 아레나 디자인을 사용하게 되었음

    • unsafe 포인터 대신 바이트 슬라이스를 buf와 청크로 사용함
    • 그렇게 해봤지만 더 빠르지 않고 훨씬 더 복잡했음
    • 100% 확신하기 전에 다시 확인해야 함
  • 몇 가지 쉬운 개선점

    • 작은 슬라이스로 시작하고 일부 페이로드가 대량으로 추가되는 경우, 내장된 append를 호출하기 전에 cap을 더 공격적으로 증가시키는 자체 append를 작성함
    • unsafe.String은 바이트 슬라이스에서 문자열을 할당 없이 전달하는 데 유용함
    • 경고를 주의 깊게 읽고 무엇을 하는지 이해해야 함
  • 주제와는 다르지만, 옆에 있는 미니맵이 마음에 듦

    • 긴 기술 기사에서 내용을 돌아다니며 읽거나 이전에 읽었던 내용을 다시 참조할 때 유용함
    • 내 사이트에 어떻게 추가할 수 있을지 궁금함
    • 정말 멋짐
  • 긴 기사를 읽기 꺼리는 사람들을 위한 요약

    • OP는 Go에서 unsafe를 사용하여 할당자 작업을 가속화하기 위해 아레나 할당자를 구축함
    • 특히 함께 생성되고 소멸되는 많은 것을 할당할 때 유용함
    • 주요 문제는 Go의 GC가 데이터의 레이아웃(특히 포인터 위치)을 알아야 제대로 작동한다는 것임
    • unsafe.Pointer로 원시 바이트를 할당하면 GC가 아레나에서 가리키는 것을 제대로 볼 수 없어 실수로 해제할 수 있음
    • 그러나 포인터가 같은 아레나의 다른 것을 가리키는 한 작동하도록 하기 위해, 아레나의 일부가 여전히 참조되는 경우 전체 아레나를 유지함
    • (1) 시스템에서 아레나가 얻은 모든 큰 메모리 블록을 가리키는 슬라이스(청크)를 유지하고
    • (2) 이 블록에 추가 포인터 필드를 포함하는 새 유형을 생성하기 위해 reflect.StructOf를 사용함
    • 따라서 GC가 청크로의 포인터를 찾으면, 백 포인터도 찾게 되어 아레나를 살아있는 것으로 표시하고 청크 슬라이스를 유지함
    • 그런 다음 다양한 내부 검사와 쓰기 장벽을 제거하기 위한 흥미로운 최적화 기법을 소개함
  • 관련: 표준 라이브러리에 "메모리 영역"을 추가하는 논의

    • 이전 아레나 제안
  • 흥미로운 내용임

    • Go에서 오프힙 또는 아레나 스타일 할당자를 구축하는 사람들은 일반적으로 메모리 안전성과 GC 상호작용을 어떻게 테스트하거나 벤치마크하는지 궁금함
  • Go는 생태계를 깨지 않도록 우선시함

    • 이는 Hyrum의 법칙이 런타임의 특정 관찰 가능한 동작을 보호할 것임을 가정할 수 있게 함
    • 이 주장이 맞다면, Go는 언어로서 진화의 막다른 길임
    • 이 경우 Go가 흥미로운지 확신할 수 없음
  • 간단한 메타 노트

    • 이 기사는 정말 길어서 배경에 대한 세부 사항을 읽을 시간이 없음
    • 예를 들어 "Mark and Sweep" 섹션은 내 노트북 화면에서 4페이지 이상을 차지함
    • 그 섹션은 기사 시작 후 5페이지 이상 지나서 시작됨
    • AI가 섹션 작성에 도움을 주어 너무 포괄적이게 된 결과인지 궁금함
    • 콘텐츠 생성은 쉽지만 중요한 부분을 유지하기 위한 편집 결정이 이루어지지 않음
    • 아레나 할당자에 대한 부분만 알고 싶고 가비지 컬렉션에 대한 튜토리얼은 필요하지 않음