fgu*_*len 11 shell monitoring 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 [/]
Run Code Online (Sandbox Code Playgroud)
在我的配置中:
threads 8, 32
Run Code Online (Sandbox Code Playgroud)
我期待看到至少8个美洲狮线程?
要快速回答问题,可以使用以下方法获取在给定PID上运行的进程使用的线程数:
% ps -h -o nlwp <pid>
Run Code Online (Sandbox Code Playgroud)
这将只返回进程使用的线程总数.该选项-h删除标题,选项-o nlwp
格式化输出ps,使其仅输出轻量级进程数(NLWP)或线程.例如,当只有一个进程puma正在运行并且获得其PID时pgrep,您将得到:
% ps -h -o nlwp $(pgrep puma)
4
Run Code Online (Sandbox Code Playgroud)
流程,线程和轻量级流程有什么区别?
这个问题已经在各个地方得到了回答[见这里,这里和优秀的极客文章 ].快速,简短和丑陋的版本是:
一个过程实质上是一个程序的任何正在运行的实例.
一个线程是处理的执行的流程.包含多个执行流的进程称为多线程进程,并在其线程(内存,打开文件,io,...)之间共享其资源.Linux内核不知道什么
threads是唯一知道的进程.过去,多线程是在用户级而非内核级处理的.这使内核很难进行适当的进程管理.
输入轻量级进程(LWP).这基本上是线程问题的答案.每个线程都被认为是内核级别的LWP.流程与LWP之间的主要区别在于LWP共享资源.换句话说,轻量级进程是用户称之为线程的内核.
可以ps显示有关线程或LWP的信息吗?
的ps命令或进程状态命令提供关于当前运行的进程,包括它们的相应的LWP或线程的信息.为此,它使用了/proc作为虚拟文件系统的目录,并将其视为内核的控制和信息中心.[见这里和这里 ].
默认情况下,ps不会提供有关LWP的任何信息,但是,添加选项-L和-m命令通常可以解决问题.
man ps :: THREAD DISPLAYRun Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
但是,添加-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 -
Run Code Online (Sandbox Code Playgroud)
在此示例中,您将看到puma具有PID 2160的进程以4个线程(NLWP)运行,ID为2160--2163.在STAT你看到两个不同的值Sl+和'Rl +'.这l是一个指标multi-threaded.S并R代表可中断睡眠(等待事件完成)并分别运行.所以我们看到4个线程中的3个以99%的CPU运行,一个线程正在休眠.您还可以看到总累计CPU时间(44秒),而单个线程仅运行14秒.
获取信息的另一种方法是直接使用-o或使用格式说明符-O.
man ps :: STANDARD FORMAT SPECIFIERSRun Code Online (Sandbox Code Playgroud)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).
所以,你可以使用任何的lwp,spid或tid和nlwp或thcount.
如果您只想获取被调用进程的线程数
puma,可以使用:
% ps -o nlwp $(pgrep puma)
NLWP
4
Run Code Online (Sandbox Code Playgroud)
或者如果你不喜欢标题
% ps -h -o nlwp $(pgrep puma)
4
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式获得更多信息:
% ps -O nlwp $(pgrep puma)
PID NLWP S TTY TIME COMMAND
19304 4 T pts/39 00:00:00 ./puma
Run Code Online (Sandbox Code Playgroud)
最后,您可以组合标记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
...
Run Code Online (Sandbox Code Playgroud)
可以top显示有关线程或LWP的信息吗?
top可以选择通过H在交互模式下点击或通过启动top 来显示线程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
...
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到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
...
Run Code Online (Sandbox Code Playgroud)
现在我们只看到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
Run Code Online (Sandbox Code Playgroud)
当您运行多个进程时,您可能会对命中f和切换感兴趣PGRP.这显示了该过程的组PID.(以ps为单位的PID,其中顶部的PID是以ps为单位的LWP).
如何在不使用ps或top?的情况下获取线程数?
该文件/proc/$PID/status包含一行,说明进程使用PID的线程数$PID.
% grep Threads /proc/19304/status
Threads: 4
Run Code Online (Sandbox Code Playgroud)
普通的留言
/proc/.用过的示例程序:
#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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用.编译 gcc -o puma --openmp
如果您只是查找由进程生成的线程数,则可以看到task创建的文件夹数,/proc/[pid-of-process]/task因为每个线程都在此路径下创建一个文件夹.因此,计算文件夹的数量就足够了.
实际上,ps实用程序本身从该路径读取信息,该文件/proc/[PID]/cmdline以更易读的方式表示.
/proc非常特别的是它也是一个虚拟文件系统.它有时被称为进程信息伪文件系统.它不包含"真实"文件,但包含运行时系统信息(例如系统内存,安装的设备,硬件配置等).因此,它可以被视为内核的控制和信息中心.事实上,相当多的系统实用程序只是调用此目录中的文件.
您只需获得流程的PID puma,使用ps或您选择的任何实用程序
ps aux | awk '/[p]uma/{print $1}'
Run Code Online (Sandbox Code Playgroud)
或者更直接地使用pidof(8) - Linux手册页,它直接获取PID作为输入的进程名称
pidof -s puma
Run Code Online (Sandbox Code Playgroud)
现在您已经有PID来计算task/进程创建的文件夹数量,请使用该find命令
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
Run Code Online (Sandbox Code Playgroud)