Skip to content
Beside the Wheel
Search
Ctrl
K
Cancel
Email
GitHub
Select theme
Dark
Light
Auto
공부
(5)
spot 인스턴스에서 서버 가용성 개선하기
eBPF로 서버 성능 Profiling하는 법: Pyroscope의 구현 살펴보기
정수론부터 RSA까지
strace로 shaka-packager 버그 추적
Kubernetes The Hard Way
TIL
(956)
AI
(43)
DevOps
(230)
Network
(61)
OS
(155)
개발
(113)
데이터베이스
(64)
서버
(72)
수학
(20)
알고리즘
(24)
암호학
(32)
언어
(113)
컴퓨터구조
(5)
코드
(24)
독후감
(43)
과학
(1)
사회
(2)
산문
(3)
소설
(12)
인문
(11)
자기계발
(7)
철학
(7)
생각
(6)
고민
변화에 대하여
의식의 영역에 대하여
본질을 보려면
짧은 생각들
소유냐 존재냐
회고
(14)
2022.03-04 대덕소마고 입학소감/다짐
2022.05-08 프로젝트와 인간관계
2022.09-2023.02 불안과 판단
2023.03-07 DMS 리더 회고
2023.08-11 나는 누구인가?
2023.12 더 많은 걸 배우기 위한 경험
2024.01-02 회사 인턴 회고
2024.03-04 고3 근황
2024.05-07 고등학교 마무리
2024.08-12 첫 회사
2025.01-03 입출력
2025.03-08 효능감이란 무엇일까
2025.09-12 연말회고
2026.01-08 담론
Email
GitHub
Select theme
Dark
Light
Auto
태그: go
총 10개의 글이 있습니다.
GC
go
2024. 8. 10.
Go의 GC는 mark-sweep 방식으로 동작하며 두 가지 주요 단계로 나뉜다. 마킹: 메모리에서 살아있는 객체를 식별한다. 스윕: 죽은 객체를 해제하여 메모리를 반환한다. GC는 스윕 → 비활성 → 마킹 세 단계를 순회하며 주기적으로 진행된다. Go의 GC는 현시점의 Heap 크기와 직전 시점의 Heap 크기에 대한 증가율이 특정 정도에 다다르면 수행되는 로직으로 구현되었다. 이 때 그 정도를 정하는 변수는 GOGC라고 부른다. GOGC 값을 사용해 아래와 같이 목표 힙 메모리를 구한다. 목표 힙 메모리 = 살아있는 힙 메모리 + (살아있는 힙 메모리 + GC 루트) × GOGC / 100 예를 들어, 살아있는 힙이 8 MiB이고, GOGC가 100일 때, 목표 힙 메모리는 18 MiB이다.
BSON
go
2024. 8. 9.
golang에서 JSON 형태를 쓰고 싶을 때는 bson을 사용하면 된다. bson.D: 하나의 BSON 도큐먼트. MongoDB command 처럼 순서가 중요한 경우에 사용한다. bson.M: 순서가 없는 map 형태. 순서를 유지하지 않는다는 점을 빼면 D와 같다. bson.A: 하나의 BSON array 형태. bson.E: D 타입 내부에서 사용하는 하나의 엘리먼트.
slice
go
2024. 8. 9.
슬라이스는 내부적으로 사용하는 배열의 부분 영역인 세그먼트에 대한 메타 정보를 가지고 있다. 슬라이스는 크게 3개의 필드로 구성되어 있다. 1. 내부적으로 사용하는 배열에 대한 포인터 정보 2. 세그먼트의 길이 3. 세그먼트의 최대 용량(Capacity) append `append()`가 슬라이스에 데이터를 추가할 때는 슬라이스 용량(capacity)이 아직 남아 있는 경우: 용량 내에서 슬라이스의 길이(length)를 변경하여 데이타를 추가한다. 용량(capacity)을 초과하는 경우: 현재 용량의 2배에 해당하는 새로운 Underlying array를 생성하고, 기존 배열 값들을 모두 새 배열에 복제한 후 다시 슬라이스를 할당한다. 아래 예제는 길이 0, 용량 3의 슬라이스에 1부터 15까
Go에서 하기 쉬운 실수
go
2024. 7. 31.
slice를 선언할 수 있는 방법은 매우 다양하다. var s []string // empty=true, nil=true s = []string(nil) // empty=true, nil=true s = []string{} // empty=true, nil=false s = make([]string, 0) // empty=true, nil=false 책의 권장사항 `var s[]string`: 최종 길이를 모르고 슬라이스가 빌 수도 있는 경우 `[]string(nil)`: nil 슬라이스이면서 empty슬라이스를 생성하는 편의 구문 `make([]strign, length)`: 최종 길이를 아는 경우.
Command line argument, flag
go
2024. 3. 23.
Command Line Argument 사용 Go 프로그램의 `main()` 함수는 C,C 등의 다른 언어에서 갖고 있는 argument 파라미터를 갖지 않는다. 따라서, Command Line의 Argument를 얻기 위해서는 `os.Args` 를 사용해야 한다. `os.Args`는 문자열 슬라이스로 정의되어 있고, Args는 프로그램의 Command Line 정보를 순서대로 담고 있다. go var Args []string 프로그램이 2개의 argument를 가진다고 가정했을 때, `os.Args[0:1]`는 실행되는 Go 프로그램 이름을 가지며, `os.Args[1:2]`는 첫번째 argument를, `os.Args[2:3]`는 두번째 argument를 갖는다. 아래 예제는 프로
defer와 panic
go
2024. 3. 23.
1. 지연실행 defer Go 언어의 defer 키워드는 특정 문장 혹은 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전에) 실행하게 한다. 마지막에 Clean-up 작업을 위해 사용된다. 아래 예제는 파일을 Open 한 후 파일을 Close하는 작업을 defer로 써서, 어떤 에러가 발생하더라도 항상 파일을 Close할 수 있도록 한다. go package main import "os" func main() { f, err := os.Open("1.txt") if err != nil { panic(err) } // main 마지막에 파일 close 실행 defer f.Close() // 파일 읽기 byte
gomod와 gosum
go
2024. 3. 23.
go.mod Module is go support for dependency management. A module by definition is a collection of related packages with `go.mod` at its root. The go.mod file defines the: Module import path. The version of go with which the module is created Dependency requirements of the module for a successful build. It defines both project’s dependencies requirement and also locks them to their co
pprof
go
2024. 3. 23.
Profiling은 메모리 사용량, 함수별 CPU 점유 시간, tracing 등 어플리케이션을 동적으로 분석하는 것을 말한다. 서비스를 운영하는데 메모리 누수가 점점 쌓이거나 혹은 특정 로직 실행이 너무 오래걸릴 때 등 문제의 원인 파악을 용이하게 해준다. pprof는 Go 어플리케이션 데이터를 profiling해 분석하는 도구이다. Callstack과 symbolization 정보가 담겨있는 프로토콜 버퍼를 분석한다. Go로 만든 어플리케이션은 pprof를 이용해 편리하게 profiling을 할 수 있다. 분석할 수 있는 정보 분석할 수 있는 항목들은 다음과 같다. allocs: 메모리 할당을 샘
고루틴 스케줄링
go
2024. 3. 23.
Go 런타임은 프로그램이 실행되는 내내 고루틴을 관리한다. Go 런타임은 모든 고루틴을 다중화된 스레드들에 할당하고 모니터링하며, 특정 고루틴이 블록되면 다른 고루틴이 실행될 수 있도록 교체하는 일을 반복한다. 이 말은 고루틴이 블록 되더라도 다중화된 스레드는 블록 되지 않는다는 것을 의미한다. CPU Core가 존재하고 있으며 OS Scheduler에 의해서 다수의 Thread가 Scheduling되어 동작하고 있는 모습을 나타내는 그림이다. Network Poller는 Network를 처리하는 별도의 독립된 Thread를 의미한다. Run Queue에는 GRQ (Global Run Queue)와 LRQ (Local Run Queue)가 2가지가 존재한다. GRQ는 의미 그대로 전역 Gor
메모리 관리
go
2024. 3. 23.
Go는 힙에서 동적 할당이 필요한 메모리를 암묵적으로 할당한다. 할당이 암묵적으로 이뤄지기 때문에 코딩이 쉽지만, 메모리 할당과 해제가 명확하지 않으니 메모리 사용량이 높아질 수 있는 부분을 놓칠 가능성이 있다. Go는 참조 지향이 아닌 값 지향적 언어이다. Go 변수는 절대 객체를 참조하지 않고, 항상 객체의 전체 값을 저장한다. (포인터가 없다는 의미는 아니다.) 모든 변수 선언(함수 인자, 반환 인자, 메서드 리시버 포함)은 해당 타입 전체를 할당하거나 그 포인터만 할당한다. `new()`은 `&`과 동일하며, 힙 상의 포인터 박스와 별도의 메모리 블록에 타입을 할당한다. Go 할당자는 특정 스팬에 하나 혹은 여러 8KB 페이지를 포함하는 메모리 블록을 할당하여 단편화를 해결한다.