Feature #17853

Updated by komamitsu (Mitsunori Komatsu) over 1 year ago

# Abstract 

 New method `Thread#thread_id` to get associated native thread id (LWP.) It might return `nil` if OS doesn't support thread id or equivalent. 

 # Background 

 When I tried to investigate which Ruby thread of an application is busy, I did the following steps 
 - checked the CPU usage of the Ruby application's threads using `ps -eLf` or `top` (with H key) and got which thread is busy 
 - dumped all the threads of the application using 
 - tried to find a busy thread in the thread dump result, but the thread dump doesn't contain thread id... 

 `Thread` class itself has no method to get associated thread id. If the class has `#thread_id` or something, I can create a PR on `sigdump` project to add `thread id` in thread dump output to make investigations with thread dump much easier. 

 `Thread#name` may seem an alternative to `Thread#thread_id`, but `Thread#name` just returns a value that's set through `Thread#name=` while `Thread#thread_id` returns a thread id that OS or something has assigned. 

 In case of Java, thread dump created by `jcmd ${pid} Thread.print` contains `nid` field which is an associated native thread id 
 "http-bio-80-exec-77" daemon prio=6 tid=0x0000000026f29000 nid=0xbd0 runnable [0x0000000020c7f000] 
    java.lang.Thread.State: RUNNABLE 
     at Method) 
     at Source) 
     at Source) 
     at org.apache.coyote.http11.InternalInputBuffer.fill( 
     at org.apache.coyote.http11.InternalInputBuffer.fill( 
     at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout( 
     at org.apache.coyote.http11.AbstractHttp11Processor.process( 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process( 
     - locked <0x00000007b16e3e88> (a 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor$ Source) 
     at Source)