본문 바로가기

분류 전체보기

ZGC를 프로덕션에 적용해보자! (GC 튜닝 & STW & 최적화) 발단 최근, 노래하는하리보가 끊기거나 반응하지 않는다는 이슈가 너무 많아졌다. 왜 이런 증상이 발생하나 살펴보던 도중, GC가 원인이라는 것을 알아냈다. 피크 시간대에 STW (Stop-The-World)를 유발하는 Full GC가 발생함으로써, 작업들이 Timeout되거나 밀리게 된 것. 게다가 Full GC가 완료된 후, 미뤄진 작업들이 한번에 처리되면서 또 다른 Full GC가 발생했고... 이러한 문제로 인해 끊김과 무반응 이슈가 생겨난 것이다. 해결 방법은 없었나? G1GC를 사용할 때는 STW 시간을 아무리 줄인다 해도, STW로 인해 발생하는 연쇄적인 Full GC를 막을 수 없었다. (STW 시간이 너무 길었기 때문) 여러가지 실험을 거친 후 내린 결론은 STW 시간이 매우 짧은 GC 알고.. 더보기
자바 GC (JVM GC) 최적화하기 요약 별다른 튜닝 없이도 대규모 서비스를 운영할 수 있게 해주는 GC 알고리즘들 GC 알고리즘 종류 ZGC 힙 사이즈가 대형 일수록 효율적 G1GC와 달리 대형 힙에서의 튜닝이 필요 없음 JDK 11부터 사용 가능, JDK 15부터 production ready (다만 패치가 백포팅된 몇몇 JDK에서는 JDK 버전이 15 미만이어도 production ready) Oracle에서 개발 &#39;G1GC보다 빠른 Shenandoah GC&#39; 보다도 압도적으로 빠름. realtime 애플리케이션에 매우 적합. (1TB 힙에서도 GC pause 1ms 미만, G1GC는 100ms 이상) (G1GC < Shenandoah GC < ZGC) 다만, 한번 점유한 메모리를 해제하지 않음 (2021/8 패치 이전.. 더보기
프로덕션 서버에 JSON 대신 Smile / CBOR 적용 Smile / CBOR은 대체 무엇인가? JSON(JavaScript Object Notation)은 많은 분이 알고 있듯, XML보다 덜 장황하고, 범용성과 가독성이 높은 데이터 포맷이다. (데이터 자체의 가독성) 하지만 여전히 텍스트 기반의 데이터 포맷이라는 점은 변하지 않아서, 내부 전송 형식으로 JSON을 사용하게 되면 심각한 자원 낭비가 발생한다. 이를 대체하기 위해 나온 것들이 BSON, MsgPack, CBOR, Smile, Protobuf, ION, Kyro 등의 이진 데이터 포맷이다. CBOR은 JSON의 이진 형식 버전이다. Smile은 Jackson (자바에서 JSON/XML/...etc 처리할 때 쓰는 라이브러리) JSON 프로세서 개발팀이 2010년에 내놓은 이진 데이터 포맷이다... 더보기
손쉽게 PHP 네이티브 확장 개발하기 (Zephir) 들어가며 PHP 네이티브 확장 개발해보신 분들은 알 것이다. 마이너 버전 (예: 7.3->7.4 올라갈 때마다 BC Break가 나타나는 것은 물론이요, Zend API (PHP 네이티브 확장 개발시 사용하는 API) 가 어떻게 변경됐는지 제대로 알려주지도 않는다. (당장 최신 버전 Zend API에 대한 문서도 없다. 찾아봐도 PHP 5.3 시절 문서가 끝, 마이너 버전 업데이트할 때마다 커밋 찾아가며 수정해야한다) 진짜 더럽게 만들기 힘들고, 관리도 매우 귀찮다. 본론 손쉽게 PHP 네이티브 확장을 개발하게 해주는 언어가 있다. Zephir라는 언어인데, 문법도 PHP와 유사하고, 무엇보다 호환성이 뛰어나다. PHP 버전 올라갈 때마다 커밋 뒤져가며 확장을 다시 개발할 필요가 없는 것이다. 심지어 P.. 더보기
JVM을 교체하면서 GraalVM은 뭐고, OpenJ9, AdoptOpenJDK, Azul JDK는 뭐지? GraalVM GraalVM은 Hotspot의 낡디낡은 C2 컴파일러를 대체하기 위해, Oracle Labs를 중심으로 개발중인 차세대 JIT 컴파일러입니다. 매우 빠른 것이 특징입니다. OpenJ9 OpenJ9은 IBM의 J9 JVM을 이클립스 재단에서 인수하여, 개발 및 배포중인 JVM입니다. (IBM도 개발에 참여 중) 매우 적은 메모리 사용량이 특징입니다. AdoptOpenJDK AdoptOpenJDK는, 커뮤니티에서 빌드하여 배포하는 OpenJDK입니다. Hotspot, OpenJ9 VM을 빌드하여 배포하고 있습니다. (보안 패치 또한 커뮤니티에서 제공합니다. 따라서 기존 OpenJDK보다 보안 패치가 빠르게.. 더보기
최근 노래하는하리보 봇이 자주 고장나는 이유에 관하여 최근 하리보 봇이 노래를 재생하지 않고 나간다는 신고가 많아졌습니다. 이는 최근 유튜브에서 트래픽을 많이 사용하는 회선에 리캡차(사람인지 봇인지 검사하는 프로그램)를 요구하여 발생한 문제입니다. (따라서 대부분의 노래 봇에 리캡차가 걸린 상태입니다) 현재까지는 이를 우회할 수 있는 방법이 없습니다. 여러 방법을 사용하여 리캡차를 해제해도, 다시 차단당하기까지 3시간~2시간 밖에 걸리지 않는 것으로 보입니다. 물론 캡차를 자동으로 해제하는 프로그램이 있는 것으로 보입니다만, 이는 하리보 서버에 적용하기에, 현실적으로 무리가 있어보입니다. 위 사진과 같은 아이디어도 나왔지만, 아직 Draft에 머물러 있는 상태입니다. 결론 제가 리캡차를 해제할 때까지 기다리셔야 합니다. 방법이 없습니다. 마지막 방법으로는,.. 더보기
[BOJ] [CodeUp.kr] 카드 역배치 (10804번, 4841번) std::array를 사용해 간단하게 풀 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include #include #include int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::array list; for (int i = 1; i start >> last; std::reverse(list.begin() + (start - 1), list.begin() + last); } for (auto i : list) { std::cout 더보기
[CodeUp.kr] 3020번 기억력 테스트 4 기억력 테스트 9와 동일한 방법으로 풀 수 있는 문제다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include #include int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::unordered_map list; int n; std::cin >> n; for (int i = 1; i > number; list[number] = i; } std::cin >> n; for (int i = 0; i > number; if(list.count(number)) std.. 더보기
[CodeUp.kr] 3170번 기억력 테스트 9 이 문제는 unordered_map 혹은 map을 사용하여 간단하게 풀 수 있는 문제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include #include #include #include #include #include int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::unordered_map list; //name, sum int n, m; std::cin >> n >> m; for (int i = 0; i > s >> k;.. 더보기
디스코드 끊김없는 한글 노래(음악) 봇 추천 디스코드 음성 채널에서 고음질 노래를 틀 수 있는 하리보 봇을 소개합니다. 디코 서버에 초대하기 위 "서버에 초대하기" 클릭 혹은 메인 홈페이지 접속 후 서버에 초대하기 클릭 무료인가요? 네. 모든 기능이 무료입니다. 고급 기능을 사용하기 위해 돈을 낼 필요가 없습니다. 한국어를 지원하나요? 네. 한국어로 서비스 중입니다. 사용 예시 반응을 클릭해서 (하단 숫자 스티커들) 검색 결과를 선택할 수 있음 트위치 스트리밍 재생 봇을 어떤 프로그래밍 언어로 작성하였나요? Kotlin입니다. 지원하는 링크 유튜브 유튜브 스트리밍 트위치 스트리밍 사운드클라우드 Vimeo Bandcamp HTTP 링크 명령어 !!help 를 입력하여 수많은 명령어에 대한 도움말을 얻을 수 있습니다. 핵심 명령어 !!s 유튜브에서 ‘.. 더보기