Programming

Programming/Go

Go/Golang이 느려지는 이유와 성능 향상

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을 사용하여 추가 메모리 할당 없이..

Programming/Go

Go/Golang - Visualizing Concurrency

안녕하세요! 요즘 회사에선 프로덕션 개통이 한창이고, 또 개인적으로 이것저것 준비하다보니 너무 바빠서 포스팅이 제대로 안되고 있습니다...ㅎㅎ 원래는 밤새서라도 한두개 포스팅했었는데 그럴시간도 없네요. 개인적으로 포스팅할 거리가 생기면 메모는 확실히 해두고 있습니다. 시간나면 정리해서 모두 포스팅으로 바뀔예정! 이번엔 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 ..

Programming/Go

Go/Golang Module 정리(작성 중)

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..

Programming/Go

Go/Golang for sets: map[T]struct{} vs. map[T]bool

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..

Programming/Framework & Tool

Concurrency with Actor Model(행위자 모델)

기존 포스팅에서 종종 Actor를 언급을 했습니다. Akka Framework에 대해 포스팅하려다가 Actor가 무엇인지, 왜 필요한지를 먼저 정리해봤습니다. 1. Background CPU Clock 성능 진화의 한계 도달 (무어의 법칙은 무너진 지 오래) CPU는 현대에와서는 질보다 양적 증가로 이어져 왔습니다. 양적 증가로 인해 여러개의 CPU를 잘 사용하여 하드웨어의 성능을 따라갈 수 있도록 소프트웨어에서 병렬 처리가 필요해졌습니다. 이를 보고 유명한 프로그래머이자 져널리스트인 허브 셔터(Hurb Shutter)가 아래와 같은 말로 동시성 프로그래밍 시대를 표현했습니다. Free launch is over - Hurb Shutter - 공짜 점심은 끝났다. (성능 날먹은 끝났다.) 소프트웨어적인 ..

Programming/Go

[ko]Wire-Jacket: IoC Container of google/wire for cloud-native

오픈소스 프로젝트 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를 개발하는 중이었습니다. 스마트 컨트랙트 등 ..

Programming/Go

Go/Golang Release & pkg.go.dev package update

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; ..

Programming/Go

Go/Golang HTTP 성능 튜닝

Go는 아주 쉽고 빠르게 HTTP 기능들을 구현할 수 있지만 성능 요구사항이 높아지다 보면 TIME_WAIT 등 자주 접하는 문제들이 있으며 자연스럽게 Go HTTP 튜닝 방법을 찾게 됩니다. 이번 포스팅에선 일반적인 Go HTTP 옵션들을 정리해봤습니다. 1. HTTP 통신을 위한 프로세스당 FD 개수 한도 설정 일반적으로 다음과 같이 리눅스가 설치되고 시스템 자원의 한도 값 중 프로세스당 FD의 개수에 대한 한도 값을 보면 다음과 같이 1024로 설정되어 있습니다. $> ulimit -n 1024 HTTP는 프로토콜의 특성상 TCP의 연결이 자주, 많이 발생하므로 1024는 부족해서, 조금만 트래픽 부하를 주어도 'Too many open files'와 같은 오류를 발생시킬 수 있습니다. 따라서 이 ..

Programming/Go

Go/Golang Dependency Injection

요즘 새로 투입될 업무 때문에 규격 분석만 하고 코딩할 틈이 없어 토이 프로젝트를 시작했습니다 프로젝트에서 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..

Programming/Go

Go/Golang Scheduling

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와..

Syntax Sugar
'Programming' 카테고리의 글 목록