我试图在我的服务器上看到活跃的美洲豹线程数。
我无法通过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个美洲狮线程?
要快速回答问题,可以使用以下方法获取在给定PID上运行的进程使用的线程数:
% ps -h -o nlwp <pid>
这将只返回进程使用的线程总数。选项-h
删除标题,选项-o nlwp
格式化ps
的输出,使其仅输出轻量级进程数(NLWP)或线程。例如,当只运行单个进程puma
并使用pgrep
获取其PID时,您会得到:
% ps -h -o nlwp $(pgrep puma)
4
流程,线程和轻量级流程有什么区别?
这个问题已经在各个地方得到了回答[见here,here和the excellent geekstuff article]。快速,简短和丑陋的版本是:
threads
是什么,只知道进程。过去,多线程是在用户级而非内核级处理的。这使内核很难进行适当的进程管理。ps
可以显示有关线程或LWP的信息吗?
ps
命令或进程状态命令提供有关当前正在运行的进程的信息,包括其对应的LWP或线程。为此,它使用/proc
目录,该目录是一个虚拟文件系统,并被视为内核的控制和信息中心。 [见here和here]。
默认情况下,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
与pgrep puma
给出的pid
% 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+
和'Rl +'。在这里,l
是multi-threaded
的指标。 S
和R
代表可中断的睡眠(等待事件完成)并分别运行。所以我们看到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).
所以你可以使用任何lwp
,spid
或tid
和nlwp
或thcount
。
如果您只想获取名为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)。
如何在不使用ps
或top
的情况下获取线程数?
文件/proc/$PID/status
包含一行说明使用PID $PID
的进程有多少个线程。
% grep Threads /proc/19304/status
Threads: 4
普通的留言
/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
编译
如果您只是查找由进程生成的线程数,您可以看到在task
下创建的/proc/[pid-of-process]/task
文件夹的数量,因为每个线程在此路径下创建一个文件夹。因此,计算文件夹的数量就足够了。
事实上,ps
实用程序本身从这条路径读取信息,文件/proc/[PID]/cmdline
以更易读的方式表示。
/proc
非常特别,它也是一个虚拟文件系统。它有时被称为进程信息伪文件系统。它不包含“真实”文件,但包含运行时系统信息(例如系统内存,安装的设备,硬件配置等)。因此,它可以被视为内核的控制和信息中心。事实上,相当多的系统实用程序只是调用此目录中的文件。
所有你需要获得过程puma
的PID,使用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
ps aux | grep puma
将为您提供仅限puma的流程列表。您需要了解特定进程正在运行的线程数。可能这会对你有所帮助:
ps -T -p 2623
您需要提供进程ID,您要为其找出线程数。确保您提供准确的流程ID。
使用ps
和wc
来计算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
相关的问题:
grep --color=auto puma
,它根本不是puma
线程。notpuma
的工具,将由grep
匹配。我发现“htop”是一个很好的解决方案。只需切换“树视图”,您就可以查看每个puma-worker和该worker下的线程。