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

时间:2011-06-23 21:38:41

标签: multithreading unix parallel-processing openmp

所以我有一些计算量很大的代码,可以愉快地使用32个线程或更高效地使用。我也可以通过我的学校访问一个拥有32个处理器核心的集群。 “甜!”你可能会说。

但是,唉,如果你没有让每个线程以专用方式与处理器配对,那么代码会非常不满意。对于数值倾向,我的BLAS实现如果运行的线程被换掉另一个,则会对效率产生重大影响。除了群集处于无政府状态之外,这不是问题。

没有作业调度程序或队列,群集也不会阻止人们启动作业,即使已经说出了所有资源。

这是我的问题:当我登录并想要运行我的代码时,我看到已经有四个人了。他们可能正在运行串行和并行作业的某种组合。我想尽可能多地使用尽可能多的线程(也就是说集群上所有剩余的资源)。我如何确定一些可以使用的度量,或者是所有其他用户使用的线程数,它们产生的峰值计算负载,还是其他一些快速可用的度量?

目前,我的解决方案是运行我的代码的一部分,其中包含1个线程,然后运行2个线程,然后运行32个线程,并查看我在实际执行时间内撞墙的位置。我通过几个线程从墙上退了回去然后开了一份大工作。这需要几分钟时间,我想找到一个更快的方法来找到适合启动的线程数。

谢谢,

- 安德鲁

编辑:

sehe的回答肯定回答了我关于如何获取线程数的原始问题。事实证明,这并不像我想象的那样有用。菲尔的评论让我走上了富有成效的道路。我现在正在做的是:

top -bn1 | grep load

获取信息。这对我来说很有用,因为我的应用程序是基于Matlab的,我可以从脚本发出一个UNIX调用,每隔一段时间获取一次这个信息,并调整我正在使用的线程数量到可用资源。

感谢您让我走上正确的轨道。

- 安德鲁

2 个答案:

答案 0 :(得分:1)

如果您有足够的权限,请将线程固定到核心(线程关联);否则

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;

答案 1 :(得分:0)

查看ps(1)命令是否支持“-L”选项以获取有关线程的信息。