openj9 icon indicating copy to clipboard operation
openj9 copied to clipboard

Implement initial RAM class persistence feature

Open ThanHenderson opened this issue 1 year ago • 1 comments

This PR revives RAM class persistence work. It currently rebases/implements: https://github.ibm.com/runtimes/openj9-stratum/pull/7 and https://github.ibm.com/runtimes/openj9-stratum/pull/25.

Current considerations/limitations:

  • No JIT support (i.e. -Xint required)
  • Incompatible with SCC (i.e. -Xshareclasses:none required)
  • ASLR must be turned off (I've been using echo 0 | sudo tee /proc/sys/kernel/randomize_va_space to turn this off)
  • Build must be configured with --enable-snapshots (requires extension repo patches)
  • Only creates snapshot on VM exit. Further support for triggering points during execution is underway.
  • No functionality to auto-detect whether a specified cache is compatible with the current invocation. (i.e. if you specify ramCache as the cache name for one program, then again for a different program, it will try to reuse the created cache rather than recognizing that it is incompatible and emitting a warning or deleting it and creating a new one).
  • Development only for JDK8, need to reassess to see what is required for later versions.

Example:

# Ensure ASLR is disabled (echo 2 to reset to default)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

# Run the java program, creating a cache called "ramCache" that persists RAM class data
java -Xint -Xshareclasses:none -Xsnapshot=ramCache <java-program>

# Run the same java program, loading the persisted RAM class data from an image called "ramCache"
java -Xint -Xshareclasses:none -Xsnapshot=ramCache <java-program>

Signed-off-by: Nathan Henderson [email protected]

ThanHenderson avatar Oct 18 '24 21:10 ThanHenderson

ping @babsingh

ThanHenderson avatar Oct 18 '24 21:10 ThanHenderson

fyi @tajila @gacholio @hangshao0

ThanHenderson avatar Oct 23 '24 20:10 ThanHenderson

@keithc-ca I've addressed your comments. And rebased to resolve the merge conflicts.

ThanHenderson avatar Oct 30 '24 20:10 ThanHenderson

Jenkins test sanity.functional amac jdk11,jdk21

babsingh avatar Nov 05 '24 15:11 babsingh

Jenkins test sanity.functional zlinux jdk8

babsingh avatar Nov 05 '24 15:11 babsingh

Current intent: We aim to merge the initial VM support so that JIT and GC work can begin. We'll start by pushing initial changes in a disabled state. Once minimal functional support is in place, we’ll introduce builds to enable and test these changes. The current PR builds will ensure nothing breaks. There may be potential for improvements, which we’ll address, along with subsequent code reviews, in future PRs.

babsingh avatar Nov 05 '24 16:11 babsingh

Previous PR builds all passed: https://openj9-jenkins.osuosl.org/job/Build_JDK11_aarch64_mac_Personal/581/ https://openj9-jenkins.osuosl.org/job/Build_JDK21_aarch64_mac_Personal/233/ https://openj9-jenkins.osuosl.org/job/Build_JDK8_s390x_linux_Personal/824/ https://openj9-jenkins.osuosl.org/job/PullRequest-OpenJ9/6370/ https://openj9-jenkins.osuosl.org/job/Test_openjdk11_j9_sanity.functional_aarch64_mac_Personal/220/ https://openj9-jenkins.osuosl.org/job/Test_openjdk21_j9_sanity.functional_aarch64_mac_Personal/130/ https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal/353/

ThanHenderson avatar Nov 05 '24 18:11 ThanHenderson

@keithc-ca Please take another look when you have some time.

ThanHenderson avatar Nov 06 '24 22:11 ThanHenderson

The delta is quite large since the last PR builds. So, I will relaunch the PR builds just to be safe. These changes are being merged in a disabled state; also, a perf sanity test was done earlier to make sure that there is no impact on startup and footprint.

Jenkins test sanity.functional amac jdk11,jdk21

babsingh avatar Nov 07 '24 01:11 babsingh

Jenkins test sanity.functional zlinux jdk8

babsingh avatar Nov 07 '24 01:11 babsingh

Two JDK8 failures are seen:

  • https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_0/351/console
  • https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_1/344/console

The new native method isOpenSSLFIPS was added yesterday: https://github.com/ibmruntimes/openj9-openjdk-jdk8/pull/779. Probably, Java_jdk_crypto_jniprovider_NativeCrypto_ECDSASign was missed to be added in ‎closed/make/mapfiles/libjncrypto/mapfile-vers. But, this failure is unrelated to this PR.

02:15:03  /home/jenkins/workspace/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_0/aqa-tests/TKG/scripts/build_tools.xml:37: java.lang.UnsatisfiedLinkError: jdk/crypto/jniprovider/NativeCrypto.isOpenSSLFIPS()Z
02:15:03  	at jdk.crypto.jniprovider.NativeCrypto.<clinit>(NativeCrypto.java:89)
02:15:03  	at sun.security.provider.SunEntries.<clinit>(SunEntries.java:104)
02:15:03  	at sun.security.provider.Sun.<init>(Sun.java:56)
02:15:03  	at java.lang.J9VMInternals.newInstanceImpl(Native Method)
02:15:03  	at java.lang.Class.newInstance(Class.java:2130)
02:15:03  	at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:237)
02:15:03  	at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:222)
02:15:03  	at java.security.AccessController.doPrivileged(AccessController.java:690)
02:15:03  	at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:222)
02:15:03  	at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:203)
02:15:03  	at sun.security.jca.ProviderList.getProvider(ProviderList.java:256)
02:15:03  	at sun.security.jca.ProviderList$3.get(ProviderList.java:171)
02:15:03  	at sun.security.jca.ProviderList$3.get(ProviderList.java:166)
02:15:03  	at java.util.AbstractList$Itr.next(AbstractList.java:358)
02:15:03  	at java.security.SecureRandom.getPrngAlgorithm(SecureRandom.java:574)
02:15:03  	at java.security.SecureRandom.getDefaultPRNG(SecureRandom.java:208)
02:15:03  	at java.security.SecureRandom.<init>(SecureRandom.java:170)
02:15:03  	at java.io.File$TempDirectory.<clinit>(File.java:1940)
02:15:03  	at java.io.File.createTempFile(File.java:2049)
02:15:03  	at org.apache.tools.ant.util.FileUtils.createTempFile(FileUtils.java:950)
02:15:03  	at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:547)
02:15:03  	at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:63)
02:15:03  	at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1404)
02:15:03  	at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1133)
02:15:03  	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
02:15:03  	at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
02:15:03  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
02:15:03  	at java.lang.reflect.Method.invoke(Method.java:503)
02:15:03  	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
02:15:03  	at org.apache.tools.ant.Task.perform(Task.java:350)
02:15:03  	at org.apache.tools.ant.Target.execute(Target.java:449)
02:15:03  	at org.apache.tools.ant.Target.performTasks(Target.java:470)
02:15:03  	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
02:15:03  	at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:36)
02:15:03  	at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
02:15:03  	at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:437)
02:15:03  	at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:105)
02:15:03  	at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
02:15:03  	at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
02:15:03  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
02:15:03  	at java.lang.reflect.Method.invoke(Method.java:503)
02:15:03  	at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
02:15:03  	at org.apache.tools.ant.Task.perform(Task.java:350)
02:15:03  	at org.apache.tools.ant.Target.execute(Target.java:449)
02:15:03  	at org.apache.tools.ant.Target.performTasks(Target.java:470)
02:15:03  	at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
02:15:03  	at org.apache.tools.ant.Project.executeTarget(Project.java:1361)
02:15:03  	at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
02:15:03  	at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
02:15:03  	at org.apache.tools.ant.Main.runBuild(Main.java:834)
02:15:03  	at org.apache.tools.ant.Main.startAnt(Main.java:223)
02:15:03  	at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284)
02:15:03  	at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101)

babsingh avatar Nov 07 '24 12:11 babsingh

Opened https://github.com/ibmruntimes/openj9-openjdk-jdk8/pull/780 to fix the above linkage failure.

babsingh avatar Nov 07 '24 12:11 babsingh