查找其他用户正在UNIX系统上使用的线程数

|| 因此,我有一些计算量大的代码,可以愉快地使用32个线程或更高效地进行调试。我还可以通过我的学校访问具有32个处理器核心的群集。您可能会说“甜!”。 但是,可惜的是,如果您没有以专用方式将每个线程与处理器配对,那么代码将变得非常不愉快。对于数字方面的偏见,如果我运行的线程被换成另一个线程,则我的BLAS实现会极大地影响效率。除了集群处于无政府状态之外,这不是问题。 没有作业调度程序或队列,即使已经使用了所有资源,集群也不会阻止人们启动作业。 这是我的问题:登录并想运行我的代码时,我已经看到四个人。他们可能正在运行串行和并行作业的某种组合。我想尽可能多地使用线程(也就是说,集群中所有剩余资源)。我该如何确定我可以使用的度量,或者其他所有用户正在使用的线程数,他们正在生成的峰值计算负载还是其他快速可用的度量? 当前,我的解决方案是使用1个线程,然后2个线程,然后.....然后32个线程来运行我的代码部分,并查看我在实时执行时遇到的困难。我从墙壁上退了几根线,然后做了大量的工作。这需要几分钟,我想找到一种更快的方法来找到适当数量的线程来启动。 谢谢, - 安德鲁 编辑: sehe的答案肯定回答了我最初有关如何获取线程号的问题。事实证明,这并没有我想象的有用。菲尔的评论使我走上了富有成效的道路。我现在正在做的是:
top -bn1 | grep load
获取信息。这对我来说是有利的,因为我的应用程序是基于Matlab的,并且我可以从脚本发出UNIX调用以偶尔获取此信息,并使我正在使用的线程数适应可用资源。 感谢您使我走上正确的轨道。 - 安德鲁     
已邀请:
        如果您有足够的权限,则将该线程固定到一个核心(线程相似性);除此以外
perl -e \'map { ($u,$n)=split; $N{$u}+=$n } split /\\n/, 
              `ps --no-header -eo uid,nlwp=`; 
         print \"$_\\t$N{$_}\\n\" for keys %N\' | sort -rn
显示每个用户拥有的所有线程(假设使用Linux);以下内容仅限于正在运行的线程:
perl -e \'map { ($u,$n,$s)=split; $N{$u}+=$n } split /\\n/, 
              `ps --no-header -eo uid,nlwp,stat= | grep R`; 
         print \"$_\\t$N{$_}\\n\" for keys %N\' | sort -rn
您可以使用
watch(1)
运行此命令(作为脚本):
watch monitor.pl
并以图形方式显示正在运行的线程。 整齐的perl:
#!/usr/bin/perl
use strict;
use warnings;

open(my $PS, \'ps --no-header -eo uid,nlwp,stat=|\') or die \"oops, ps doesn\'t like that\";

my %users;
map { my ($u,$n,$s)=split; $users{$u}+=$n } (<$PS>); 

close ($PS);

print \"$_\\t$users{$_}\\n\" 
    for sort { -($users{$a} <=> $users{$b}) } 
        keys %users;
    
        查看ps(1)命令是否支持\“-L \”选项以获取有关线程的信息。     

要回复问题请先登录注册