▲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가 섹션 작성에 도움을 주어 너무 포괄적이게 된 결과인지 궁금함 콘텐츠 생성은 쉽지만 중요한 부분을 유지하기 위한 편집 결정이 이루어지지 않음 아레나 할당자에 대한 부분만 알고 싶고 가비지 컬렉션에 대한 튜토리얼은 필요하지 않음
Hacker News 의견
이 기사는 재미있는 읽을거리임
최근 Go에서 성능 튜닝을 하면서 성능을 극대화하기 위해 매우 유사한 아레나 디자인을 사용하게 되었음
몇 가지 쉬운 개선점
주제와는 다르지만, 옆에 있는 미니맵이 마음에 듦
긴 기사를 읽기 꺼리는 사람들을 위한 요약
관련: 표준 라이브러리에 "메모리 영역"을 추가하는 논의
흥미로운 내용임
Go는 생태계를 깨지 않도록 우선시함
간단한 메타 노트