From: komamitsu@... Date: 2021-05-23T08:16:17+00:00 Subject: [ruby-core:103999] [Ruby master Feature#17853] Add Thread#thread_id Issue #17853 has been updated by komamitsu (Mitsunori Komatsu). `native_id` sounds better to me. I agree with it. As for `m:n thread model`, in my opinion, either volatile value or `nil` (this can happen when it's waiting an event in `select/epoll/kqueue` without assigning any thread?) sounds good to me since what I want to do is just mapping the result of Ruby Thread information to native thread resource. `current_native_id` might be better since it sounds like the attribute/property can be easily changed. ---------------------------------------- Feature #17853: Add Thread#thread_id https://bugs.ruby-lang.org/issues/17853#change-92136 * Author: komamitsu (Mitsunori Komatsu) * Status: Open * Priority: Normal ---------------------------------------- # 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 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) ``` -- https://bugs.ruby-lang.org/ Unsubscribe: