Feature #17853
closedAdd Thread#thread_id
Description
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
ortop
(with H key) and got which thread is busy - dumped all the threads of the application using https://github.com/frsyuki/sigdump
- 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 java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:516)
at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501)
at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:167)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:946)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
- locked <0x00000007b16e3e88> (a org.apache.tomcat.util.net.SocketWrapper)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)