【问题标题】:How to know the number of active threads in Puma如何知道 Puma 中的活动线程数
【发布时间】:2017-10-07 08:22:00
【问题描述】:

我正在尝试查看我的服务器上活动 puma 线程的数量。

通过ps看不到:

$ ps aux | grep puma
healthd   2623  0.0  1.8 683168 37700 ?        Ssl  May02   5:38 puma 2.11.1 (tcp://127.0.0.1:22221) [healthd]  
root      8029  0.0  0.1 110460  2184 pts/0    S+   06:34   0:00 grep --color=auto puma
root     18084  0.0  0.1  56836  2664 ?        Ss   May05   0:00 su -s /bin/bash -c puma -C /opt/elasticbeanstalk/support/conf/pumaconf.rb webapp
webapp   18113  0.0  0.8  83280 17324 ?        Ssl  May05   0:04 puma 2.16.0 (unix:///var/run/puma/my_app.sock) [/]                                                               
webapp   18116  3.5  6.2 784992 128924 ?       Sl   May05 182:35 puma: cluster worker 0: 18113 [/] 

在我的配置中:

threads 8, 32

我希望看到至少 8 个 puma 线程?

【问题讨论】:

  • 您找到解决方案了吗?
  • @knagode 我已经为这个问题开了一个赏金,它得到了很多关注,你能检查答案并投票给你认为更有帮助的答案吗?它将帮助我选择有效的答案。

标签: shell monitoring puma


【解决方案1】:

如果您只是在查找进程产生的线程数,您可以查看在/proc/[pid-of-process]/task 下创建的task 文件夹的数量,因为每个线程都会在此路径下创建一个文件夹。所以计算文件夹的数量就足够了。

事实上,ps 实用程序本身会从此路径读取信息,这是一个文件/proc/[PID]/cmdline,它以更易读的方式表示。

来自Linux Filesystem Hierarchy

/proc 非常特别,因为它也是一个虚拟文件系统。它有时被称为进程信息伪文件系统。它不包含“真实”文件,而是包含运行时系统信息(例如系统内存、安装的设备、硬件配置等)。因此,它可以被视为内核的控制和信息中心。事实上,相当多的系统实用程序只是简单地调用该目录中的文件。

您只需要获取进程的 PID puma,使用 ps 或您选择的任何实用程序

ps aux | awk '/[p]uma/{print $1}'

或者更直接地使用pidof(8) - Linux man page,它会直接给你进程名称作为输入的PID

pidof -s puma

现在您有了 PID 来计算您的进程创建的 task/ 文件夹的数量,使用 find 命令

find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l

【讨论】:

    【解决方案2】:

    ps aux | grep puma 将为您提供仅 puma 的进程列表。您需要找出特定进程正在运行多少线程。这可能会对您有所帮助:

    ps -T -p 2623

    您需要提供进程 id,您想为其找出线程数。确保您提供准确的进程 ID。

    【讨论】:

      【解决方案3】:

      使用pswc 计算puma 线程数:

      ps --no-headers -T -C puma | wc -l
      

      字符串“puma”可以根据需要替换。例如,计数bash 个线程:

      ps --no-headers -T -C bash | wc -l
      

      在我的系统上输出:

      9
      

      问题中的代码ps aux | grep puma,有几个grep相关的问题:

      1. 它返回grep --color=auto puma,它根本不是puma 线程。
      2. 类似地,任何带有字符串“puma”的实用程序或命令,例如名为notpuma的实用程序,都将与grep匹配。

      【讨论】:

        【解决方案4】:

        为了快速回答问题,一个线程使用的线程数 在给定 PID 上运行的进程,可以使用 以下:

        % ps -h -o nlwp <pid>
        

        这只会返回您使用的线程总数 过程。选项 -h 删除标题和选项 -o nlwp 格式化ps 的输出,使其仅输出轻量级进程数 (NLWP) 或线程。例如,当只有一个进程puma在运行并且它的PID是用pgrep获取的,你会得到:

        % ps -h -o nlwp $(pgrep puma)
           4
        

        进程、线程和轻量级进程有什么区别?

        这个问题已经在很多地方得到了回答 [参见hereherethe excellent geekstuff article]。快速、简短和丑陋的版本是:

        • 进程本质上是程序的任何运行实例。

        • 一个线程是一个流程的执行流程。一个过程 包含多个执行流被称为多线程 进程并在其线程之间共享其资源(内存, 打开文件,io,...)。 Linux内核不知道什么 threads 是并且只知道进程。在过去, 多线程是在用户级别而不是内核上处理的 等级。这使得内核很难进行正确的处理 管理。

        • 输入 轻量级进程 (LWP)。这本质上是 回答线程问题。每个线程都被认为是 成为内核级别的 LWP。之间的主要区别 进程和LWP是LWP共享资源。换句话说,轻量级进程是内核对用户所说的线程的说法。

        ps 可以显示有关线程或 LWP 的信息吗?

        ps 命令或进程状态 命令提供信息 关于当前正在运行的进程,包括它们对应的 LWP 或线程。为此,它使用了/proc 目录 这是一个虚拟文件系统,被视为控制和 内核的信息中心。 [参见herehere]。

        默认情况下,ps 不会向您提供有关 LWP 的任何信息, 但是,将选项 -L-m 添加到命令通常会 诀窍。

        man ps :: THREAD DISPLAY

           H      Show threads as if they were processes.
           -L     Show threads, possibly with LWP and NLWP columns.
           m      Show threads after processes.
           -m     Show threads after processes.
           -T     Show threads, possibly with SPID column.
        

        对于单个进程puma,pid 由pgrep puma 给出

        % ps -fL $(pgrep puma)
        UID        PID  PPID   LWP  C NLWP STIME TTY      STAT   TIME CMD
        kvantour  2160  2876  2160  0    4 15:22 pts/39   Sl+    0:00 ./puma
        kvantour  2160  2876  2161 99    4 15:22 pts/39   Rl+    0:14 ./puma
        kvantour  2160  2876  2162 99    4 15:22 pts/39   Rl+    0:14 ./puma
        kvantour  2160  2876  2163 99    4 15:22 pts/39   Rl+    0:14 ./puma
        

        但是,添加-m 选项显然可以提供更好的概览。这 当多个进程以相同的方式运行时特别方便 名字。

        % ps -fmL $(pgrep puma)
        UID        PID  PPID   LWP  C NLWP STIME TTY      STAT   TIME CMD
        kvantour  2160  2876     -  0    4 15:22 pts/39   -      0:44 ./puma
        kvantour     -     -  2160  0    - 15:22 -        Sl+    0:00 -     
        kvantour     -     -  2161 99    - 15:22 -        Rl+    0:14 -     
        kvantour     -     -  2162 99    - 15:22 -        Rl+    0:14 -     
        kvantour     -     -  2163 99    - 15:22 -        Rl+    0:14 -     
        

        在此示例中,您会看到 PID 为 2160 的进程 puma 以 4 ID 为 2160--2163 的线程 (NLWP)。在STAT 下,您会看到两个不同的值Sl+ 和'Rl+'。这里lmulti-threaded 的指标。 SR 分别代表可中断睡眠(等待事件完成)正在运行。所以我们看到 4 个线程中的 3 个以 99% 的 CPU 运行,一个线程正在休眠。 您还可以看到单线程仅运行 14 秒时的总累积 CPU 时间(44 秒)。

        另一种获取信息的方法是直接使用格式 带有-o-O 的说明符。

        man ps :: STANDARD FORMAT SPECIFIERS

           lwp    lightweight process (thread) ID of the dispatchable
                  entity (alias spid, tid).  See tid for additional
                  information.  Show threads as if they were processes.
           nlwp   number of lwps (threads) in the process.  (alias thcount).
        

        因此您可以使用lwpspidtidnlwpthcount 中的任何一个。

        如果您只想获取调用的进程的线程数 puma,你可以使用:

        % ps -o nlwp $(pgrep puma)
        NLWP
           4
        

        或者如果你不喜欢标题

        % ps -h -o nlwp $(pgrep puma)
           4
        

        您可以通过以下方式获得更多信息:

        % ps -O nlwp $(pgrep puma)
        PID   NLWP S TTY          TIME COMMAND
        19304    4 T pts/39   00:00:00 ./puma
        

        最后,您可以将标志与ps aux 结合起来列出线程。

         % ps aux -L
        USER       PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        ...
        kvantour  1618  1618  0.0    4  0.0  33260  1436 pts/39   Sl+  15:17   0:00 ./puma
        kvantour  1618  1619 99.8    4  0.0  33260  1436 pts/39   Rl+  15:17   0:14 ./puma
        kvantour  1618  1620 99.8    4  0.0  33260  1436 pts/39   Rl+  15:17   0:14 ./puma
        kvantour  1618  1621 99.8    4  0.0  33260  1436 pts/39   Rl+  15:17   0:14 ./puma
        ...
        

        top 可以显示有关线程或 LWP 的信息吗?

        top 可以通过在交互模式中点击H 或使用top -H 启动top 来显示线程。问题在于它将线程列为进程(类似于ps -fH)。

        % top
        top - 09:42:10 up 17 days, 3 min,  1 user,  load average: 3.35, 3.33, 2.75
        Tasks: 353 total,   3 running, 347 sleeping,   3 stopped,   0 zombie
        %Cpu(s): 75.5 us,  0.6 sy,  0.5 ni, 22.6 id,  0.0 wa,  0.0 hi,  0.8 si,  0.0 st
        KiB Mem : 16310772 total,  8082152 free,  3662436 used,  4566184 buff/cache
        KiB Swap:  4194300 total,  4194300 free,        0 used. 11363832 avail Mem 
        
          PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
          868 kvantour  20   0   33268   1436   1308 S 299.7  0.0  46:16.22 puma
         1163 root      20   0  920488 282524 258436 S   2.0  1.7 124:48.32 Xorg
         ...
        

        在这里您看到puma 以大约 300% 的 CPU 运行,累积时间为 46:16.22。但是,没有迹象表明这是一个线程进程。唯一的指标是 CPU 使用率,但是,如果 3 个线程“休眠”,这可能低于 100%?此外,状态标志状态为S,表示第一个线程处于睡眠状态。打H给你然后

        % top -H
        top - 09:48:30 up 17 days, 10 min,  1 user,  load average: 3.18, 3.44, 3.02
        Threads: 918 total,   5 running, 910 sleeping,   3 stopped,   0 zombie
        %Cpu(s): 75.6 us,  0.2 sy,  0.1 ni, 23.9 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
        KiB Mem : 16310772 total,  8062296 free,  3696164 used,  4552312 buff/cache
        KiB Swap:  4194300 total,  4194300 free,        0 used. 11345440 avail Mem 
        
          PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
          870 kvantour  20   0   33268   1436   1308 R 99.9  0.0  21:45.35 puma
          869 kvantour  20   0   33268   1436   1308 R 99.7  0.0  21:45.43 puma
          872 kvantour  20   0   33268   1436   1308 R 99.7  0.0  21:45.31 puma
         1163 root      20   0  920552 282288 258200 R  2.0  1.7 124:52.05 Xorg 
          ...
        

        现在我们只看到 3 个线程。由于其中一个线程正在“休眠”,因此它位于底部,因为top 按 CPU 使用率排序。

        为了查看所有线程,最好让top显示一个特定的pid(对于单个进程):

        % top -H -p $(pgrep puma)
        top - 09:52:48 up 17 days, 14 min,  1 user,  load average: 3.31, 3.38, 3.10
        Threads:   4 total,   3 running,   1 sleeping,   0 stopped,   0 zombie
        %Cpu(s): 75.5 us,  0.1 sy,  0.2 ni, 23.6 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
        KiB Mem : 16310772 total,  8041048 free,  3706460 used,  4563264 buff/cache
        KiB Swap:  4194300 total,  4194300 free,        0 used. 11325008 avail Mem 
        
          PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
          869 kvantour  20   0   33268   1436   1308 R 99.9  0.0  26:03.37 puma
          870 kvantour  20   0   33268   1436   1308 R 99.9  0.0  26:03.30 puma
          872 kvantour  20   0   33268   1436   1308 R 99.9  0.0  26:03.22 puma
          868 kvantour  20   0   33268   1436   1308 S  0.0  0.0   0:00.00 puma
        

        当您有多个进程正在运行时,您可能有兴趣点击f 并打开PGRP。这显示了进程的组 PID。 (以 ps 为单位的 PID,其中顶部的 PID 为以 ps 为单位的 LWP)。

        如何在不使用pstop 的情况下获取线程数?

        文件/proc/$PID/status 包含一行说明有多少线程 PID为$PID的进程正在使用。

        % grep Threads /proc/19304/status
        Threads:        4
        

        一般cmets

        • 您可能没有找到其他用户的进程 因此无法获取进程正在使用的线程数。这可能是由于mount options of /proc/ (hidepid=2)。

        使用的示例程序:

        #include <omp.h>
        #include <stdio.h>
        #include <stdlib.h>
        
        int main (int argc, char *argv[]) {
        char c = 0;
        #pragma omp parallel shared(c)   {
            int i = 0;
            if (omp_get_thread_num() == 0) {
              printf("Read character from input : ");
              c = getchar();
            } else {
              while (c == 0) i++;
              printf("Total sum is on thread %d : %d\n", omp_get_thread_num(), i);
            }
          }
        }
        

        gcc -o puma --openmp编译

        【讨论】:

          【解决方案5】:

          我发现“htop”是一个很好的解决方案。只需切换“树视图”,您就可以查看每个 puma-worker 及其下的线程。

          【讨论】:

            【解决方案6】:

            每个工作线程的 puma 线程数:

            ps aux | awk '/[p]uma/{print $2}' | xargs ps -h -o nlwp
            

            样本输出:

               7
              59
              59
              61
              59
              60
              59
              59
              59
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-24
              • 2010-12-01
              • 2015-01-03
              • 2011-07-11
              • 2012-03-11
              相关资源
              最近更新 更多