1. GC(Garbage Collection) Go는 개발하기 편하지만 GC의 사용으로 성능에 문제가 생길 수 있습니다. Go는 일반적으로 확보된 메모리 크기가 2배가 될때 GC를 수행합니다. (아래 포스팅의 5. Go GC Pacing 부분을 참고하세요) Go/Golang Memory Management 이번엔 Go의 메모리 관리에 대해 정리해보려 합니다 Go가 1.17이 Release되는 현재 시점에서 해당 내용에 관해 국내에서 정리된 문서가 없는 것 같습니다 (몇가지 번역 문서는 존재하는것 같습니다) syntaxsugar.tistory.com 성능에 영향을 줄이려면 GC의 수행을 줄이는게 좋습니다. 먼저, 메모리를 미리 확보해두는 방법이 있습니다. sync.Pool을 사용하여 추가 메모리 할당 없이..
안녕하세요! 요즘 회사에선 프로덕션 개통이 한창이고, 또 개인적으로 이것저것 준비하다보니 너무 바빠서 포스팅이 제대로 안되고 있습니다...ㅎㅎ 원래는 밤새서라도 한두개 포스팅했었는데 그럴시간도 없네요. 개인적으로 포스팅할 거리가 생기면 메모는 확실히 해두고 있습니다. 시간나면 정리해서 모두 포스팅으로 바뀔예정! 이번엔 Reddit에서 Go관련 글을 Subscribe하다가 재밌는 글하나 발견해서 공유합니다. 2016년에 나온 내용이지만 전 이제야 봤는데 재밌네요. https://divan.dev/posts/go_concurrency_visualize/ Visualizing Concurrency in Go · divan's blog Posted on Jan 24, 2016 divan.dev 위에 나온 Go ..
Go는 버전이 오르면서 dependeny 관리 기능에도 꾸준히 향상이 있어왔습니다. 1.18 beta가 나온 현재시점에서 사용하게 되는 go mod 명령을 쓰기좋게 정리합니다. go mod go는 mod라는 툴을 사용해 dependency 관리를 자동화합니다. GOPATH가 아닌곳에서 go build를 수행하려면 mod를 만들어야 합니다. go mod init {MODULE} 을 입력하여 모듈을 생성하고 외부 라이브러리인 경우 go get을 통해 해당 dependency를 로컬에 다운로드합니다. 이후, go mod tidy를 수행하면 go.mod 파일이 위치한 해당 디렉터리에 Dependency들을 설정합니다. 이게 일반적인 사용 형식이고, go 코드 모듈 생성 go mod init {MODULE_PAT..
set이 필요해질때 고민해본 사항인데 마침 눈이 띄어서 짧게 공유해둡니다. empty struct가 재밌는 타입이었네요. for sets: map[T]struct{} vs. map[T]bool I recently saw a colleague using `map[T]struct{}` as a set of unique T. ```go seen := map[string]struct{}{} for _, s := range stuff { if _,... www.reddit.com The empty struct – The acme of foolishness Introduction This post explores the properties of my favourite Go data type, the empty st..
오픈소스 프로젝트 Wire-Jacket 소개 GitHub - bang9211/wire-jacket: Jacket of google/wire: advanced DI approach wrapping google/wire for cloud. Jacket of google/wire: advanced DI approach wrapping google/wire for cloud. - GitHub - bang9211/wire-jacket: Jacket of google/wire: advanced DI approach wrapping google/wire for cloud. github.com 1. Introduction 블록체인, 코인 주제의 프로젝트로 Ossicones를 개발하는 중이었습니다. 스마트 컨트랙트 등 ..
Go 같은 경우 GitHub을 통해 Document와 Package 문서가 자동으로 작성되기 때문에 Release(배포)가 중요합니다. 처음부터 배포를 신중하게 하는 것이 중요하지만 종종 실수하기 마련입니다. 먼저 말하자면, 배포 이후에 tag를 삭제하거나 수정하여 같은 버전으로 배포하는 경우에는 문서(godoc)가 refresh되지 않습니다. x/pkgsite: refresh of pkg.go.dev · Issue #48832 · golang/go What is the URL of the page with the issue? https://pkg.go.dev/github.com/bang9211/wire-jacket What is your user agent? Mozilla/5.0 (Macintosh; ..
Go는 아주 쉽고 빠르게 HTTP 기능들을 구현할 수 있지만 성능 요구사항이 높아지다 보면 TIME_WAIT 등 자주 접하는 문제들이 있으며 자연스럽게 Go HTTP 튜닝 방법을 찾게 됩니다. 이번 포스팅에선 일반적인 Go HTTP 옵션들을 정리해봤습니다. 1. HTTP 통신을 위한 프로세스당 FD 개수 한도 설정 일반적으로 다음과 같이 리눅스가 설치되고 시스템 자원의 한도 값 중 프로세스당 FD의 개수에 대한 한도 값을 보면 다음과 같이 1024로 설정되어 있습니다. $> ulimit -n 1024 HTTP는 프로토콜의 특성상 TCP의 연결이 자주, 많이 발생하므로 1024는 부족해서, 조금만 트래픽 부하를 주어도 'Too many open files'와 같은 오류를 발생시킬 수 있습니다. 따라서 이 ..
요즘 새로 투입될 업무 때문에 규격 분석만 하고 코딩할 틈이 없어 토이 프로젝트를 시작했습니다 프로젝트에서 golang은 DI(Dependency Injection)를 어떻게 쓰는 게 좋은 방법일지 고민해보았습니다 사내에선 golang에서 Google Guice같이 DI를 사용할 수 있는 아래의 소스를 이용하고 있었습니다 GitHub - alecthomas/inject: Guice-ish dependency injection for Go. Guice-ish dependency injection for Go. Contribute to alecthomas/inject development by creating an account on GitHub. github.com 사내 공통모듈에서 해당 소스를 impor..
Go Memory에 이어 이번엔 Go Scheduler입니다 Go는 일반적인 프로그래밍 언어들과는 달리 goroutine이라는 형태를 사용합니다 우리는 goroutine으로 기존의 thread 방식보다 편리하게 concurrency를 구현합니다 뿐만 아니라 goroutine은 thread보다 가벼운 구조체이며 높은 성능을 자랑합니다 thread랑 goroutine은 뭐가 다른 걸까요? 단순히 goroutine만 아는 것보단 Go의 Scheduling을 이해해야 합니다 Memory 포스팅에서 잠깐 언급했듯이 Go는 Java의 JVM, .NET Framework의 CLR처럼 호스트 머신에 설치된 런타임을 이용하는 것이 아니라 생성되는 바이너리 파일에 작은 런타임을 포함합니다 해당 런타임이 바로 Go의 GC와..
보통 TDD(Test Driven Developmen) 까진 안 해도 기본적인 틀을 갖추면 테스트를 병행해서 진행하는 편입니다 토이 프로젝트 기본적인 형태가 갖춰져서 우리의 소중한 동반자 [테스트]를 작성하면서 진행하려고 합니다 테스트는 안정성이 중요한 상용 프로젝트에서 가장 중요한 부분이라고 볼 수 있습니다 안정적이지 않은 App과 장애 발생은 서비스 가용성을 보장하지 못하게 되고 이는 단순한 비용 손해뿐만 아니라 가장 중요한 고객의 신뢰 손실까지 이어집니다 기업 입장에서 고객 신뢰성 상실은 가장 큰 손해로 이어지기 때문에 개발자들은 수많은 테스트들과 이중화 구성 등 만발의 준비를 합니다 높은 안정성 보장을 위해 테스트 케이스를 먼저 작성하는 TDD 방식의 개발도 채택되고 있습니다 위에서 말했듯 테스트..