如何知道Puma中活动线程的数量

时间:2017-05-09 06:39:32

标签: shell monitoring puma

我正在尝试查看服务器上的活动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个美洲狮线程?

6 个答案:

答案 0 :(得分:6)

快速回答问题,a使用的线程数 在给定的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运行 线程(NLWP)具有ID 2160-2163。在STAT下,您会看到两个不同的值Sl+和&#39; Rl +&#39;。这里lmulti-threaded的指标。 SR代表可中断睡眠(等待事件完成)正在运行。所以我们看到4个线程中的3个以99%的CPU运行,一个线程正在休眠。 您还可以看到总累计CPU时间(44秒),而单个线程仅运行14秒。

获取信息的另一种方法是直接使用格式 -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).

因此,您可以使用lwpspidtid以及nlwpthcount中的任何一种。

如果您只想获取被调用进程的线程数 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启动顶部来显示主题。问题是它将线程列为进程(类似于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

一般性评论

  • 您可能找不到其他用户的进程 因此无法获得进程正在使用的线程数。这可能是由于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

编译

答案 1 :(得分:5)

如果您只是查找由该进程生成的线程数,您可以看到task下创建的/proc/[pid-of-process]/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 :(得分:2)

ps aux | grep puma会为您提供仅限puma的流程列表。您需要了解特定进程正在运行的线程数。可能这会对你有所帮助:

ps -T -p 2623

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

答案 3 :(得分:1)

使用pswc计算puma个帖子:

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

字符串&#34; puma &#34;可以根据需要更换。例如,计算bash个线程:

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

在我输出的系统上:

9

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

  1. 返回grep --color=auto puma,根本不是puma个帖子。
  2. 类似地,任何带有字符串&#34; puma &#34;,例如一个名为notpuma的工具的util或命令将与{匹配{1}}。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

每个工人的puma线程数:

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

示例输出:

   7
  59
  59
  61
  59
  60
  59
  59
  59