목록분류 전체보기 (145)
쿼카러버의 기술 블로그
문제 Leetcode의 141번 문제를 보면 Tortoise and hare, 즉 토끼와 거북이 알고리즘으로 유명한 문제가 있다. 문제는 간단하게 말하자면 링크드리스트가 주어지고, 해당 링크드리스크가 싸이클이 있는지 없는지를 확인하는 문제가 주어진다. 입력 : 링크드 리스트의 head 출력 : 사이클이 있으면 true 없으면 false를 리턴 예를 들면 아래와 같이 사이클이 있는 링크드 리스트와 사이클이 없는 링크드 리스트가 있을텐데, 이 중에서 싸이클이 있는 케이스를 판별한다는 것이다. 사이클이 없는 링크드 리스트 사이클이 있는 링크드 리스트 위 알고리즘은 해쉬맵을 사용해서도 풀 수 있지만 가장 정석 방법은 Floyd가 제안한 cycle detection 알고리즘이다. 본 문제는 해당 알고리즘을 사용해..
앞 글에서 prometheus의 기본 개념에 대해 알아보았다. 이미 솔루션들에서 제공해주는 exporter이 있는 경우에는 왠만하면 exporter에서 제공해주는 정보만으로 모니터링이 가능하지만, 직접 웹 어플리케이션을 동작하고, 이 어플리케이션에 대한 모니터링을 수행해야 하는 등의 경우에는 custom exporter를 구현해야한다. 기본으로 제공되는 exporter들을 활용할 때도 물론이지만, custom exporter를 구현하기 위해서는 prometheus에서 수집하고 있는 메트릭이 어떤 종류가 있는지에 대해 알아둘 필요가 있다. 따라서 본 글에서는 프로메테우스에서 수집할 수 있는 메트릭의 종류들에 대해 알아보고자 한다. 메트릭 종류 프로메테우스에서 제공하는 메트릭 종류는 크게 아래와 같다. (1..
prometheus는 오픈 소스 기반의 모니터링 시스템이다. (그리스 로마 신화에서 최초로 인간을 창조했다는 그 프로메테우스가 말고..ㅎ) SoundCloud사에서 만들었지만 지금은 독립형 오픈소스 프로젝트이고, 현재 필자가 속해 있는 회사는 prometheus를 사용하여 쿠버네티스 환경에 동작하는 어플리케이션들의 메트릭을 수집하고 있다. 모니터링은 로깅과는 성격이 약간 다르다. 로깅은 어플리케이션 로직 내에서 발생하는 일들에 대한 것이라면, 모니터링은 response latency, RPM, 컨넥션 갯수와 같은 모니터링 지표들을 수집하여 저장하고 검색하는 것을 의미한다. prometheus는 기본적으로 pull model을 사용해 메트릭을 수집한다. 이를 간단하게 설명하자면 메트릭 대상이 되는 타겟 서..
앞 글에서 profiling이 무엇인지에 대해서 알아보았다. profiling이 어떤건지 감이 아직 안잡힌 독자는 아래 글을 읽어보고 오는 것을 추천한다. https://etloveguitar.tistory.com/147 [golang] profile 간단 이해(profiling, 프로파일링에 대하여) golang은 성능이 매우 중요한 경우 사용되는 언어 중 하나다. 따라서 코드가 최적화 된 것을 직접 확인하기 전에 그냥 가정만으로 최적화하는 방식으로는 사실 부족하다. 코드의 성능과 bottleneck에 etloveguitar.tistory.com 특정 코드를 정해두고 프로파일링을 진행하는 경우도 있지만, 실제로 동작하고 있는 웹서버에 대한 프로파일링이 필요할 때가 있다. 따라서 본 글에서는 프로파일링이..
앞 글에서 profiling에 대해 알아보며 간단하게 benchmark와의 차이에 대해 다루었다. 사실 성능 개선을 하거나 리팩토링을 하기 위해서는 프로파일링 뿐 아니라, benchmark도 매우 중요하다. 이 알고리즘을 사용하면 진짜 성능이 좋아질지, 자주 호출되는 로직을 수정했는데 성능적으로 괜찮을지 등의 증거를 확보할 수 있기 때문이다. 벤치마크를 해본 적이 없다면 이 기회에 배워서 그냥 추측만으로 할게 아니라 실제로 측정해보자. 예상했겠지만 본 글은 간단하게 벤치마크가 무엇인지 그리고 go에서 benchmark 하는 방법에 대해 간단하게 살펴보려고 한다. 벤치마크란? benchmark란 특정 코드 segment를 여러번 반복 실행하고 해당 코드의 성능을 측정하는 함수를 의미한다. 스포일러로 아래 ..
golang은 성능이 매우 중요한 경우 사용되는 언어 중 하나다. 따라서 코드가 최적화 된 것을 직접 확인하기 전에 그냥 가정만으로 최적화하는 방식으로는 사실 부족하다. 코드의 성능과 bottleneck에 대한 insight를 가지고 있어야 좀 더 효율적으로 최적화할 수 있는데, 이 때 활용하는 것이 바로 profiler다. 필자는 최근 맡고 있는 서비스의 성능테스트를 진행하면서 성능 개선을 위해 profiling을 진행해보았고 나름 성과도냈다(후후), 그리고 이왕 하는김에 내용을 좀 정리해보았다. 제목은 간단 이해라 했는데 사실 분량이 상당히 길다. 죄송.. 본 글의 목적은 다음과 같다. (1) profiling 기본 개념 이해 (긴글 주의) (2) SVG 그래프 기본 개념 이해 이 글에선 이정도만 다..
오랜 만에 채널과 관련된 글을 쓴다. 이전에 go에서 concurrency programming을 위해 필수로 알아두어야 할 개념으로 channel을 꼽으며 작성한 글이 있다. 일단 channel이 무엇인지 모르는 분들은 글을 먼저 읽고 오는 것을 추천한다. https://etloveguitar.tistory.com/40?category=902018 [golang] 채널 (channel)이란? - 1탄 간단한 소개 채널에 대한 설명을 읽기 전에 이전 포스팅인 고루틴 (go routine)에 대한 간단한 이해를 하길 바란다. 링크 : https://etloveguitar.tistory.com/39 [golang] 고루틴(go routine)이란? - 1탄 간단한 소개 공식 도.. etloveguitar.t..
필자는 현재 API 서비스를 개발하고 있다. 회사에서 가장 많은 트래픽을 받는 서비스의 주요 로직들을 변경하게 됐는데, 변경된 로직을 검증하기 위해 production level과 비슷한 수준의 트래픽, 그리고 스트레스 테스트 등을 진행해야 했다. 따라서 변경된 로직의 서비스를 production 환경과 동일하게 셋업하고 부하테스트를 진행하기로 했다. 일반적인 서비스 개발 후에 부하테스트는 간단하게 로컬 서버 한 대에서, docker를 활용해 여러 worker를 띄운뒤 테스트해볼 수 있었지만, 이번에는 워낙 트래픽을 좀 받는 서비스기도 하고, 테스트해야 하는 로직들이 CPU-bound 태스크가 좀 많아서, 실제로 약 10개정도의 노드를 띄워 분산테스트를 진행해야 했다. 그리고 아래의 옵션들을 만족할 수 ..