성배 퀘스트

정적으로 연결된 Java 이미지는 훌륭한 아이디어입니다. 공격 표면이 낮은 초소형 초고속 이미지를 좋아하지 않는 이유는 무엇입니까? 그러나 현실은 이와 거리가 멀다. 이 게시물은 내가 다소 기본적인 작업, 즉 Cloud Logging 을(를) 얻으려고 시도했던 재미있는 좌절감을 설명합니다.

알 수 없는 호스트 예외



첫 번째 문제는 정적으로 연결된 Graal Native Images가 libc 설정 없이는 일부 작업을 수행할 수 없다는 것입니다. 이 경우 DNS 조회를 수행할 수 없어 java.net.UnknownHostException 가 됩니다. 나는 이것이 얼마나 어리석은 지에 대해 생각하지 않고 그냥 넘어갈 것입니다. Graal site에서 이를 위해 musl를 사용할 수 있는 대략적인 지침이 있지만 빠른 Google이 Google Cloud에서 뭔가를 생각해 냈습니다. 나는 이것을 Helidon에 넣었고 ... 빌드하지 않았습니다.

#11 274.5 [WARNING] Error: Detected a direct/mapped ByteBuffer in the image heap. A direct ByteBuffer has a pointer to unmanaged C memory, and C memory from the image generator is not available at image runtime.A mapped ByteBuffer references a file descriptor, which is no longer open and mapped at run time.   To see how this object got instantiated use --trace-object-instantiation=java.nio.DirectByteBuffer. The object was probably created by a class initializer and is reachable from a static field. You can request class initialization at image runtime by using the option --initialize-at-run-time=<class-name>. Or you can write your own initialization methods and call them explicitly from your main entry point.
#11 274.5 [WARNING] Trace: Object was reached by
#11 274.5 [WARNING]     reading field io.grpc.netty.shaded.io.netty.buffer.PoolChunk.memory of
#11 274.5 [WARNING]             constant io.grpc.netty.shaded.io.netty.buffer.PoolChunk@42d125b0 reached by
...


인터넷 검색



빌드 문제는 gRPC 라이브러리 내에 내장된 Netty 때문이었습니다. 다행히도 이에 대한 수정은 매우 쉬웠습니다: Google have their own library:

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-graalvm-support</artifactId>
  <version>0.3.0</version>
</dependency>


이를 추가하여 빌드하고 실행했지만 이제 GCP 구성을 찾을 수 없습니다.

java.lang.IllegalArgumentException: A project ID is required for this service but could not be determined from the builder or the environment.  Please set a project ID using the builder.
        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:142)
        at com.google.cloud.ServiceOptions.<init>(ServiceOptions.java:304)


당황



일반적으로 볼륨을 사용자 홈에 방금 마운트했지만 Graal에 user.home 값이 없는 것 같습니다. 나는 그것을 확인하기 위해 이것을 파헤치지 않았으므로 그냥 해결할 것이라고 생각했습니다.

docker run --rm -it -p 8080:8080 `
  -e CLOUDSDK_CONFIG=/gcloud `
  -v $Env:APPDATA/gcloud/:/gcloud:ro `
  helidon-quickstart-mp:native


붐! 오류 없이 실행되었습니다.

아아, microsoft/WSL#5324에 의해 응답된 마지막 딸꾹질이 하나 있었습니다. 간단히 말해서 Windows를 절전 모드로 전환하면 WSL2의 시계가 드리프트됩니다. 즉, 타임스탬프가 잘못 지정되어 로그 메시지를 찾을 수 없었습니다. WSL을 다시 시작하면 Cloud Logging에 일부 로그가 표시됩니다. 만세!



결과 이미지는 다소 포동포동한 116MB로 Alpine JLink보다 24MB 더 크고 11MB만 떨어져 있습니다. 나는 여분의 라이브러리로 설명될 수 있다고 생각하지 않지만 다른 날에 대해 걱정할 것이 있습니다. 그러나 스니핑할 수 없는 도커 컨테이너에 설정된 -m 32m로 약 160ms에서 시작됩니다. Graal의 매력에 관계없이 알아야 할 곰 덫이 많이 있습니다. 이것이 곧 개선되기를 바랍니다.

이제 측정항목 및 추적에 대해...

좋은 웹페이지 즐겨찾기