kotlin ↔️ openJDK 이슈 해결기

0️⃣1️⃣·2023년 8월 15일
0

개발

목록 보기
3/7
post-thumbnail

Version

  • kotlin 1.7.10
  • openJDK 17.0.2+8
  • coroutines-* 1.6.4

Situation

병렬 스레드로 코루틴을 사용하는 코드가 JVM Crash로 중지되는 현상이 발생

#                                                                     
# A fatal error has been detected by the Java Runtime Environment:     
#                                                                     
#  SIGSEGV (0xb) at pc=0x0000000000000000, pid=1, tid=95              
#                                                                     
# JRE version: OpenJDK Runtime Environment Temurin-17.0.2+8 (17.0.2+8) (build 17.0.2+8)                                                                                 
# Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (17.0.2+8, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)                
# Problematic frame:                                                                                                                                                    
# C  0x0000000000000000                                               
#                                                                                                 
# Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E" (or dumping to /home
#                                                                                                                                                                       
# If you would like to submit a bug report, please visit:             
#   https://github.com/adoptium/adoptium-support/issues               
#                                                                                                
---------------  S U M M A R Y ------------                                                                 
Command Line: -Xms2g -Xmx2g -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -Duser.timezone=Asia/Seoul -Dtrace_warm_up_enabled=false -Dspring.profiles.active=test

---------------  T H R E A D  ---------------                         
Current thread (0x00007f90b0183710):  JavaThread "C2 CompilerThread6" daemon [_thread_in_native, id=95, stack(0x00007f90fd8c4000,0x00007f90fd9c5000)]

Current CompileTask:                                                                                                                                                    
C2:  20639 17631   !   4       kotlinx.coroutines.reactive.PublisherAsFlow::collectImpl (406 bytes)   

위의 에러가 발생하면서, 어플리케이션이 종료되는 상황이였다.


TroubleShooting

Attempt 1: 병렬 스레드의 풀을 줄여보자

  • OOME와 같은 부하로 인해서 발생하는 문제라고 생각되어, 부하를 줄여봤지만, 동일하게 발생
  • 부하 테스트를 진행해봤지만, 마찬가지로 위에 에러가 필연적으로 발생하지 않음
  • 결론, 스레드 병렬 프로세싱은 문제가 없다고 판단

Attempt 2: 어플리케이션의 코드를 보면, webFluxFluxasFlow 메소드를 통해 coroutinesFlow로 전환하지 않도록 해보자

  • 라이브러리가 다른 리액티브 스트림을 두 번 변환하는 것이 어색하고, 버전에 따라서 병목 현상이 발생할 수 있다고 판단
  • 덤프 파일 기준으로 PublisherAsFlow에서 에러가 발생했음
  • FLux 코드를 변환없이, 그대로 사용하도록 변경
  • JVM Crash 빈도는 줄었으나, 일부 코루틴(runBlocking, suspend) 코드가 남아있어서, 완전히 해결되지 않았음
  • 빈도가 줄긴 했으나, asFlow에 문제점이라고 하기에는 섣부른 판단이라고 생각

Attempt 3: openJDK 버전 업그레이드를 해보자

  • 다시, 코어 덤프로 돌아가서 아래 링크를 발견 https://github.com/adoptium/adoptium-support/issues
  • kotlin 관련되서 openJDK 이슈를 검색하던 도중, C2 컴파일러 관련 이슈를 발견
    https://github.com/adoptium/adoptium-support/issues/721#issuecomment-1447487717
  • kotlin 개발자가 openJDK 이슈임을 확인하고, openJDK 개발자는 버전 업을 통해서 문제를 픽스한겠다고 결론(https://bugs.openjdk.org/browse/JDK-8303279)
  • 17.0.9+2 버전에서 C2 관련 kotlin 버그들이 픽스됐으나, 아직 릴리즈가 되지 않은 상황
  • 최근 릴리즈로 업그레이드하고, coroutines 관련 코드들은 릴리즈 이후에 사용하도록 변경

Result

  • coroutines 코드 제거 + openJDK 최근 버전 릴리즈 적용
    • JVM Crash는 발생하지 않음 🎉
    • coroutines 코드는, 17.0.9+2 버전 릴리즈 이후에 원복하도록 결정

Retrospective

  • 다양한 이슈들을 경험했지만, openJDK 버전 이슈는 처음 경험해봐서 힘들었다. 위에 버그 관련된 글도, 작성일자 기준으로 3주전에 이슈가 픽스됐다는 것을 확인할 수 있었다. 운이 좋아서, 다른 사람들의 질문을 통해서 해결할 수 있었다는 생각도 들지만~ 한편으로는, 누군가 질문하지 않았더라면 문제를 해결하지 못할 수도 있겠다는 생각도 들었다. 앞으로는 직접 오픈 소스에 질문을 해보는 경험을 가져봐야 겠다는 생각도 든다.

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

글 잘 봤습니다.

답글 달기