[Spring] Gradle build 최적화 하기 (2)

들어가며

예전에 한번 gradle 튜닝 관련해서 글을 쓴적이 있는데, 좀 더 빠르게 하기 위한 글을 작성해두려고 한다.

해당 방식은 앞에 작성한 글에 적용된 옵션이 다 적용되어 있어야 한다.

Gradle Build Performance 글 보러가기

Running tests

  • gradle에 테스트 관련해서 설정을 변경하면 build시에 성능 향상을 가져올 수 있다.

Parallel Testing

tasks.withType(Test) {
    maxParallelForks = 4
}

or

tasks.withType(Test) {
    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
}
  • 병렬로 테스트를 실행하는 방법을 추가하여 테스트를 빠르게 효율적으로 동작 시킨다.
  • 단, 이 방식을 사용하는 경우 병렬로 테스팅이 가능하게 테스트가 짜여져 있어야 한다.
  • 공식적으로 추천하는 방식은 이용 가능한 CPU에 반을 사용하는 방법이다.
  • 전체 테스트를 프로세스가 나눠서 가져가기에, 병목 현상이 있는 테스트가 있는 경우 비슷한 성능을 가져올 수 있으니 참고!

Forking options

tasks.withType(Test) {
    forkEvery = 100
}
  • 해당 부분은 속도를 빠르게 한다기 보다, 안정성을 높이는 설정이다.
  • 테스트를 하다보면 out of memory가 발생할 수 있는데, forkEvery의 수 만큼 테스트를 진행하고 새로운 프로세스를 fork하여 이어서 진행하는 방식이다.
  • fork를 해서 진행하다보니, fork가 발생하는 횟수 만큼 느려질 수 밖에 없지만, 중간에 out of memory를 회피할 수 있는 방법 중 한 가지이다.
  • out of memory를 회피하기 위해서는 heap size를 늘려야 하는데 heap size를 늘리면 garbage collection 비용이 많이 발생하게 된다.
  • fork vs garbage collection 중 fork 방식이 더 비용이 적은 방식이라, memory를 늘리는 방식 보다는 적당한 forkEvery를 계산하여 설정하는게 좋다.
  • forkEvery는 VM을 이용해서 해당 값이 작으면 비용이 많이 드는 작업이기에, 유의해야 한다.

Report generation

tasks.withType(Test) {
    reports.html.enabled = false
    reports.junitXml.enabled = false
}
  • 테스트 시에 테스트 결과 리포트를 생성하지 않도록 하여 성능을 향상 시킨다.

Compiler daemon

tasks.withType(JavaCompile) {
    options.fork = true
}
  • Gradle Java 플러그인에 JavaCompile을 사용하는 경우, 별도의 프로세스로 실행할 수 있도록 한다.
  • 별로의 프로세스는 빌드 기간 재사용될 수 있어, fork의 오버헤드를 최소하하고, 메인 gradle의 데몬의 garbage collection을 줄여준다.
  • 단, 해당 옵션은 gradle을 parallel로 설정이 되어 있어야 동작한다. (default가 parallel)

Incremental compilation

tasks.withType(JavaCompile) {
    options.incremental = true
}
  • gradle은 변경의 영향을 받은 클래스만 다시 컴파일하여, 변경이 발생하지 않은 부분은 skip 처리 한다.
  • gradle 4.10 이후부터는 해당 설정이 true가 되었다, 만약 4.10 이전 버전인 경우 해당 옵션을 추가해야 한다.

마치며

  • query dsl을 사용하는 유저들 중 query dsl plugin을 사용하게 되면, querydsl이 cache가 되지 않아, 매번 생성하는 불편함이 있다.
  • cache가 될 수도 있는데… 어떻게 하는지 찾지를 못 하였다.
  • gradle에서 querydsl을 캐시하여 build 속도 향상을 하는 방법에 대해서는 다음 포스트에 추가!
  • gradle에서 공식적으로 튜닝하는 방법에 대해서는 Gradle Performance 에 나와 있으니 참고하면 된다.

Leave a comment