2

Need to do CPU profiling for Jruby application (jruby version : 1.7.20.1-8) which uses ruby version (1.9.3). I tried using default profiler but getting below error due to version compatibility issue of tomcat and jdk.

OS info is like below

app@sc-doc-prod-deployment-5cbd9f468-2bf2b:/usr/src/app$ uname -a
Linux sc-doc-prod-deployment-5cbd9f468-2bf2b 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64 GNU/Linux

JRuby default profiler issue

 app@sc-doc-preprod-deployment-7f4ddf6588-sxw9r:/usr/src/app$ jruby --profile -S ./bin/trinidad --ssl 37001 --config /etc/fk-sc-doc-b2b/trinidad.yml -p 37000
    Profiling enabled; ^C shutdown will now dump profile info
    Initializing ProtocolHandler ["http-bio-37000"]
    Initializing ProtocolHandler ["http-bio-37001"]
    Starting Servlet Engine: Apache Tomcat/7.0.28
    Unable to process Jar entry [sun/security/ec/ECDHKeyAgreement.class] from Jar [jar:file:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunec.jar!/] for annotations
    org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18
        at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
        at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60)
        at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209)
        at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2049)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1931)
        at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1899)
        at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1281)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:855)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:346)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5172)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1595)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1585)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)
    Unable to process Jar entry [sun/security/ec/ECDSAOperations.class] from Jar [jar:file:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunec.jar!/] for annotations
    org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18
        at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
        at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60)
        at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209)

I tried using ruby-prof version (0.15.0), but getting below error. Please suggest what to do. if ruby-prof can't work then please suggest any working alternative if you know

#35 43.77 Installing ruby-prof 0.15.0 with native extensions
#35 45.27
#35 45.27 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
#35 45.27
#35 45.27 /usr/lib/jruby/bin/jruby -r ./siteconf20250903-10-1x1rtxq.rb extconf.rb
#35 45.27 /usr/lib/jruby/lib/ruby/shared/mkmf.rb:14: Use RbConfig instead of obsolete and deprecated Config.
#35 45.27 mkmf.rb can't find header files for ruby at /usr/lib/jruby/lib/native/include/ruby/ruby.h
#35 45.27
#35 45.27 extconf failed, uncaught signal 1
#35 45.27
#35 45.27 Gem files will remain installed in /usr/lib/jruby/lib/ruby/gems/shared/gems/ruby-prof-0.15.0 for inspection.
#35 45.27 Results logged to /usr/lib/jruby/lib/ruby/gems/shared/extensions/universal-java-1.8/1.9/ruby-prof-0.15.0/gem_make.out
#35 45.27 An error occurred while installing ruby-prof (0.15.0), and Bundler cannot
#35 45.27 continue.
#35 45.27 Make sure that `gem install ruby-prof -v '0.15.0'` succeeds before bundling.
#35 ERROR: process "/bin/sh -c bundle install" did not complete successfully: exit code: 5

I tried using async profiler but it doesn't show ruby code info in CPU profiling. in this post https://www.ruby-forum.com/t/ruby-prof-for-jruby/149086 it was written that by enabling jruby.compile.mode=FORCE flag JVM profiler, it will work. but is not working. Generated sample HTML file Link and sample JFR file link

how to do the CPU profiling? Not able to figure out way to do this. please help

4
  • You haven't said anything about what system you're running on. Presumably that matters for Failed to build gem native extension. Commented Sep 8 at 3:34
  • @PeterCordes I have mentioned it app@sc-doc-prod-deployment-5cbd9f468-2bf2b:/usr/src/app$ uname -a Linux sc-doc-prod-deployment-5cbd9f468-2bf2b 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64 GNU/Linux Commented Sep 8 at 5:46
  • ruby-prof version0.15.0 is more than eleven years old. I suggest trying an up-to-date version of ruby-prof which would be ~> 1.7.2 (at the time of writing this comment). Commented Sep 8 at 8:19
  • 1
    Not sure why you need to do CPU Profiling but there have been marked performance improvements to ruby between 1.9.3 and 3.4.5 (Current Stable). It might make sense to update the entire application to a stable, secure, and supported ruby version before worrying about the performance. Commented Sep 8 at 14:10

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.