【问题标题】:How can I monitor the thread count of a process on linux?如何在 linux 上监控进程的线程数?
【发布时间】:2010-09-21 02:04:36
【问题描述】:

我想监控 Linux 上特定进程使用的线程数。 有没有一种简单的方法可以在不影响流程性能的情况下获取这些信息?

【问题讨论】:

  • 如果一个应用程序的进程只运行很短的时间呢? (说 2 秒。)

标签: linux multithreading monitor


【解决方案1】:

如果您正在寻找多个进程的线程数,那么其他答案对您来说效果不佳,因为您不会看到进程名称或 PID,这使得它们相当无用。改用这个:

ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>

要实时观看更改,只需添加watch

watch ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>

【讨论】:

  • 我只想显示特定用户的所有进程的线程数量。这个答案启发了以下内容: watch ps -u -o pid,nlwp,args
【解决方案2】:

我的答案是更多 gui,但仍在终端内。 Htop 可以通过一些设置来使用。

  1. 启动 htop。
  2. 按 F2 进入设置菜单。
  3. 从最左边的列中选择“列”
  4. 从最右边的列中选择要添加到主监控输出的列,“NLWP”就是您要查找的内容。
  5. 按 F10。

【讨论】:

    【解决方案3】:

    如果你想在 linux 系统中每个用户的线程数,那么你应该使用:

    ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
    

    &lt;USER&gt; 使用所需的用户名。

    【讨论】:

      【解决方案4】:

      获取给定 pid 的线程数:

      $ ps -o nlwp <pid>
      

      其中nlwp 代表轻量级进程(线程)的数量。因此psnlwp 别名为thcount,这意味着

      $ ps -o thcount <pid>
      

      也可以。

      如果要监控线程数,只需使用watch

      $ watch ps -o thcount <pid>
      

      获取系统中运行的所有线程的总和:

      $ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
      

      【讨论】:

      • 这里最有用的答案。尤其是watch 命令。但是,请注意,虽然 nlwp 对我有用,但使用 thcount 对某些人(Red Hat...)来说可能会失败。
      • 要获取给定进程名称的进程 ID,请使用 pidofpgrep。例如,ps -o nlwp $(pidof chrome)ps -o nlwp $(pgrep chrome)
      【解决方案5】:

      最简单的方法是使用“htop”。您可以安装“htop”(top 的更高级版本),它将显示您所有的内核、进程和内存使用情况。

      按“Shift+H”显示所有进程或再次按隐藏它。 按“F4”键搜索您的进程名称。

      在 Ubuntu 或 Debian 上安装:

      sudo apt-get install htop
      

      在 Redhat 或 CentOS 上安装:

      yum install htop
      dnf install htop      [On Fedora 22+ releases]
      

      如果你想从源代码编译“htop”,你会发现它here

      【讨论】:

        【解决方案6】:

        如果您试图找出给定 pid 使用 cpu 的线程数,我会使用:

        top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
        

        【讨论】:

          【解决方案7】:

          $ ps H p pid-id

          H - 列出进程中的所有单独线程

          $cat /proc/pid-id/status

          pid-id 是进程 ID

          例如..(截断以下输出)

          root@abc:~# cat /proc/8443/status
          Name:   abcdd
          State:  S (sleeping)
          Tgid:   8443
          VmSwap:        0 kB
          Threads:    4
          SigQ:   0/256556
          SigPnd: 0000000000000000
          

          【讨论】:

            【解决方案8】:

            VisualVM 可以清楚地显示给定 JVM 进程的线程状态

            【讨论】:

            • 自我引起的颠簸?该死!
            【解决方案9】:
            cat /proc/<PROCESS_PID>/status | grep Threads
            

            【讨论】:

            • 注意你不需要cat + grep,你可以只做一个grep...
            【解决方案10】:

            如果您对那些真正活跃的线程感兴趣——比如在做某事(未阻塞、未定时等待、未报告“线程正在运行”但真正等待流提供数据) ) 而不是闲着但活着——那么你可能会对jstack-active 感兴趣。

            这个简单的 bash 脚本运行 jstack,然后过滤掉所有通过启发式方法似乎处于空闲状态的线程,向您显示那些实际消耗 CPU 周期的线程的堆栈跟踪。

            【讨论】:

              【解决方案11】:

              shell 上的ps -eLf 将为您提供当前在系统上运行的所有线程和进程的列表。 或者,您可以运行top 命令然后点击“H”来切换线程列表。

              【讨论】:

              • 这是给我的调味汁。我不想将其仅限于一个进程。如有必要,可以轻松添加-p 或其他任何内容。这是您查看线程列表所需的最低要求。
              【解决方案12】:

              这是一个显示给定进程的线程数的命令:

              ps -L -o pid= -p <pid> | wc -l
              

              与其他基于ps 的答案不同,这里无需从其输出中减去1,因为-o pid= 选项没有ps 标题行。

              【讨论】:

                【解决方案13】:

                试试

                ps huH p <PID_OF_U_PROCESS> | wc -l
                

                htop

                【讨论】:

                • 我相信你应该从中减去1,因为它会为表头打印一行USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
                • “h”隐藏了标题。
                • -1 为什么只能通过ps -o thcount &lt;pid&gt; 将输出传输到wc?见this answer
                • 或 htop - 你如何使用它来计算线程数?
                • andrzejdoro,您可以在 htop 设置中启用它,只需按 F2(setup) - 设置列 - 在可用列中选择 NLWP 并将其移动到已激活列 - F10 保存
                【解决方案14】:

                jvmtop 可以在其他指标旁边显示当前 jvm 线程数。

                【讨论】:

                  【解决方案15】:

                  进程中的每个线程在/proc/&lt;pid&gt;/task 下创建一个目录。数一下目录数,就知道线程数了。

                  【讨论】:

                  • 添加到上述评论。您可以使用此命令查找线程数:find /proc/&lt;PID&gt;/task -maxdepth 1 -type d -print | wc -l。只需将 替换为您可以从 top 或使用 ps 获得的进程 ID
                  • @Navigatron:一个简单的ls /proc/&lt;PID&gt;/task | wc 就可以了。
                  【解决方案16】:

                  如果你使用:

                  ps uH p <PID_OF_U_PROCESS> | wc -l
                  

                  您必须将结果减去 1,因为“wc”正在计数的行之一是“ps”命令的标题。

                  【讨论】:

                  • 欢迎来到 StackOverflow。可以说,这应该是对 slav0nic 答案的评论。但是,据我了解,当您第一次加入 SO 时,在获得一定声誉之前,您(仍然)不能评论答案,因此添加答案就是您所能做的。你是对的;您不应将 ps 的标题行视为线程之一。
                  【解决方案17】:

                  较新的 JDK 发行版附带 JConsole 和 VisualVM。两者都是从正在运行的 Java 进程中获取脏细节的绝佳工具。如果您必须以编程方式执行此操作,请研究 JMX。

                  【讨论】:

                    【解决方案18】:

                    JStack 相当便宜 - 一种选择是通过 grep 管道输出以查找活动线程,然后通过 wc -l 管道。

                    更图形化的是 JConsole,它显示给定进程的线程数。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-08-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-07-24
                      • 2013-01-06
                      • 1970-01-01
                      相关资源
                      最近更新 更多