Go 1.6

2 17(미국 시간)에 프로그래밍 언어 "Go"의 버전 1.6 이 나왔음.

 

이전 버전 1.5의 발매부터 약 반년 후의 업데이트.

 

주된 기능으로는 우선 net/http 패키지에서 HTTP/2 대응. HTTPS 채용 서버와 클라이언트 쌍방에서 HTTP/2(Hypertext Transfer Protocol Version 2)이 기본적으로 유효하게 되었다.

HTTP/2 2015년 공식 RFC 7540로서 표준화된 통신 프로토콜이다. RFC에 따르면 네트워크 자원의 보다 효율적 이용과 레이턴시 감소.

 

template 패키지가 개선되어 버전 1.5에서 시험적으로 도입된 vendor 디렉토리가 기본적으로 유효하게 되었다. 이 밖에 cgo에서는 Go C의 코드들 사이에서 포인터 교환 규칙이 변경되었다.

변경 내용은 문서에서 확인할 수 있다.

 

 

 

저작자 표시
신고
by 흥배 2016.02.24 08:00

Go 1.5(2015 6)에서는 GC 지연 감소를 목표로.

구체적으로는 50밀리 초마다 GC 지연을 10밀리 세컨드 이하로 억제.

도달 가능한 값의 최대 2배의 힙을 사용한다.

 

구현 방침은 stop the world(STW)Concurrent GC의 하이브리드. STW에 의한 정지 시간을 50밀리 초마다 10밀리 세컨드 이하로 낮추고, 그 시간 내에 GC가 완료되지 않으면 Concurrent GC로 전환.

이로써 50밀리 세컨드 이내의 응답 시간이 필요한 프로그램이 40밀리 초의 실행 시간을 얻도록 한다. 이 수치는 1000달러 Linux PC 정도를 상정. 이른바 non-generational, non-moving, concurrent, tri-color, mark and sweep 컬렉터를 구현한다.

 

Go 1.6(2016 1) 1.5에서의 피드백을 바탕으로 목표를 결정하게 되지만 아마 bump pointer allocation nursery spaces generational copy를 도입하여 산출량을 향상시킨다.

 

Go 1.5에서 도입되는 새로운 알고리즘에서는 지연은는 크게 짧아지지만 스루풋이 저하된다. 그것을 상쇄하는 별개의 최적화를 하고, 버전을 올림으로써 성능이 악화되지 않도록 한다.

 

 

출처: https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/edit

저작자 표시
신고
by 흥배 2015.07.30 08:00

Go 1.5 릴리스는 2015 8 1일 예정.

- 5월 시점에서 작업이 끝나 있고, feature freeze에 들어가 있음

- 여기까지 The State of Go에서의 정보

- 끝이 정확한 경우 곧 Release Candidate가 나올 것 같음

 

 

Go 1.5부터 년 2회 릴리스 계획

- 2 1, 8 1일 반년마다 메이저 (1.x) 출시

- 3개월은 개발, 3개월은 testing (feature freeze) 기간을 가진다

- http://golang.org/s/releasesched

 

 

 

Go 1.5에서 주목해야 할 새로운 기능과 변경 부분

출시되지 않았지만 저장소의 릴리스 노트에서 발췌

기대의 새로운 기능

- Shared Library

- Execution Tracing (go trace 명령)

- Concurrent Garbage Collection

- "vendoring"external package

 

신경 쓰이는 변경 부분

- 툴 체인에서 C언어를 배제(Go 1.5의 빌드에 Go 1.4 이상이 필요)

 https://talks.golang.org/2015/gogo.slide#1

 https://golang.org/s/go13compiler

 

 

Go 1.5의 차이

GOMAXPROCS 환경 변수가 기본적으로 CPU 코어 수로 된다

internal package 언어 사용자에게 도입

http://golang.org/s/go14internal

전술 한 바와 같이 출시 계획 변경하여 반년마다 년 2회 릴리즈

언어의 작은 변화

등등

 

 

Shared Library

buildmode라는 명령 줄 옵션이 새롭게 추가되어 shared object 생성이 가능.

$ go build -buildmode = shared ~ ~ 생략 생략 ~ ~

buildmode (go help buildmode의 일부를 짤라서 설명)

- archive : main 패키지 이외 .a 파일로 빌드

- c-archive : main과 필요한 패키지를 C언어용 아카이브로 빌드한다. Go 소스 중에서 "//export funcname" 마크가 필요

- c-shared : c-archive shared library 작성 버전

- shared : main 패키지 이외를 shared library 화 하고, -linkshared 옵션으로 링크 할 수 있도록 한다

 

 

Execution Tracing

fine-grained로 성능 모니터링을 할 수 있게 되었다

감시 할 수 있는 stats : 각각의 시작 시간과 소요 시간

- Heap (GC)

- Goroutine

- 스레드

- Go Processor 마다의 프로필

 시스템 호출 스택 추적



제안 문서에서는 network IO도 대상 이었지만, 패치를 보면 IO 모니터는 확인할 수 없었다

 Go Execution Tracer : http://golang.org/s/go15trace

  Groups 스레드에서는 AMD Code Analyst Intel VTune을 의식한 발언도

 

 

"vendoring"external package

Go언어에서 import (go get) 버전 문제에 대한 실험적 노력

Go 사용자는 아시다시피 Go는 의존하는 외부 라이브러리의 버전을 지정하는 기능을 제공 하지 않는다

- 이를 해결하기 위해 Godep 명령과 같은 hack이 있다

- Go 공식 vendoring (의존 저장소를 자신의 저장소에 포함) 법이 실험적으로 지원된다

https://golang.org/s/go15vendor

 

 

Concurrent GC

GC Stop the world Concurrent GC의 하이브리드를 전부터 채택했다. 1.5에서는 stop the world에서 concurrent collector로 된 GC에 의한 정지 기간을 개선

- GC 지연 시간을 10ms 이하를 목표로 하고있다

GC에 의한 정지 기간을 짧게 하는 대신 CPU 및 메모리 소비가 약간 증가

대부분의 경우 goroutine의 병렬 때 CPU 사용율이 오르는 것 같다

디자인 문서

https://golang.org/s/go14gc

  https://golang.org/s/go15gcpacing

 

 

 

trace 명령어 소개(Execution Tracing)

$go test -‑‒trace=/tmp/trace -‑‒run=BenchName-‑‒bench=BenchName cpu=4

$PATH=trace-‑‒viewer/tracing:$PATH trace -‑‒http=localhost:9876 path/to/ testbinary.test /tmp/trace


 

설명: http://golang.org/s/go15trace

 

 

출처: http://www.slideshare.net/pfi/go15-50328018

저작자 표시
신고
by 흥배 2015.07.27 08:00

주된 차이
 

Erlang

Golang

언어의 분류

함수형

절차형

동적 (dialyzer 의한 검사 있음)

정적

변수

immutable

mutable

예외에 관한 사상

Let it crash

Defensive Programming

병행 처리 모델

Message Passing 
(Actor Model)

Message Passing 
(CSP/π caluculus)


각각의 프로세스 차이

 

Erlang

Golang

워커 쓰레드

default CPU 코어 개수

default 1
(
기본적으로는 CPU 코어 개수로 지정)

초기 스택

309 words 
(1words
64bit)

8k bytes

프로세스 메모리 공유

없음

있다(global변수)

프로세스 상한

디폴트 32768
최대 268435456

10 가능

프로세스 실행

워커 스레드와 바인드 하지 않는다
(
고정하는 것도 가능)

워커 스레드와 바인드 하지 않는다

※ 프로세스(Erlang Process/goroutine  )



병행 처리 모델의 차이

이 부분을 쓰는데 arild씨의 슬라이드를 참고하였다. 그림이 매우 알기 쉬우므로 이쪽도 참조해 주길 바란다.

Erlang: Actor model

Process(Actor)가 Mailbox를 1개 가진다

 통신은 어느 Process로 보낼지 명확

 블록

 수신 측: Mailbox가 빈 경우 블록

 송신 측: 블록 하지 않는다


Golang: CSP (Communication Sequential Processes)

Channel을 공유하고 통신을 한다

  Channel과 Process는 다 vs다 관계(어떤 프로세스가 받을지 모른다.)


블록

  송신 측과 수신 측이 갖추어지지 않으면 안 된다

  ※Golang은 Channel사이즈를 지정할 수 있기 때문에 사이즈>0의 경우는 Channel이 비거나/다 찬 경우에만 차단



스케쥴러

대량으로 Process를 실행하는 경우 어떻게 실행되느냐에 차이가 있다.
Erlang
  모든 Process를 균등하게 실행하려고 한다.
Golang
  일정 시간까지는 1개(코어 수 만큼)의 Process를 실행한다(ver1.2까지는 Process가 sleep/종료까지 계속 실행하였다)


프로세스 관리 방법

Erlang

프로세스 트리를 구성한다


Golang

관리하지 않는다

결과를 기다리는 쪽에서 데몬화를 막는다



예외 처리

Erlang

기본적인 예외 처리

 예외를 catch 하지 않고 프로세스 자체를 크래시 시킨다

   수퍼바이저(관리 프로세스)가 프로세스의 비정상 종료를 검지

   재 기동 전략에 따라 프로세스를 다시 실행한다

재 기동

 

개요

one_for_one

떨어진 프로세스만 기동한다

one_for_all

모든 자식 프로세스를 시작 한다

rest_for_one

자식 프로세스에 의존 관계가 있는 경우에 사용한다

simple_one_for_one

자식 프로세스를 동적으로 기동하고 싶은 경우에 사용한다

이 부분은 learn you some Erlang 에 자세히 


Golang

함수의 반환 값으로 error가 어떤지 반환한다.

에러 처리를 써 주게 되어 있다

  모든 변수는 unused로 컴파일 시에 에러가 나온다(공백 변수/재 대입하면 처리를 깜박해도 오류가 나지 않지만……)


보충 1: panic/recover의 용도

recover를 표준 라이브러리 내에서 사용하고 있는 것에 대해 ruiu 씨가 이 글에 적고 있다

  깊은 네이스트에서 최고 레벨 함수로 한꺼번에 돌아온다

  런타임 오류를 catch하고 함수의 반환 값으로 되돌려준다

  프로세스 전체가 떨어지지 않게 하기 위해

요악하면 위 3가지 용도로 사용되고 있다.


보충 2: goroutine 내에서 panic

  panic이 발생하면 모든 프로세스를 종료한다

  goroutine내 panic는 다른 process에서는 처리할 수 없다



정리

Erlang/Golang을 어떤 때 선택하면 좋은가에 대해 개인적인 생각을 정리.

Erlang

 Process가 독립하고 있는 경우(Read/Write가 같은 I/F에 못할 경우 등)

 분산 프로그램이 되는 경우(이번에는 언급하고 있지 않지만……)

 Process를 대량으로 동시에 실행하는 경우(echo Server)

 Process를 떨어뜨리고 싶지 않은 경우


Golang

 복수의 Process가 1개의 Queue를 공유하고 싶은 경우 

 문자열 처리/계산을 다루는 경우

 Process가 떨어지더라도 그 Process를 재 기동할 필요가 없는 경우



출처: http://qiita.com/soranoba/items/68d57b4635a2917f3c73

 

신고
by 흥배 2014.12.16 08:00
| 1 |

티스토리 툴바