Узнайте, сколько потоков используют другие пользователи в системе UNIX - PullRequest
0 голосов
/ 24 июня 2011

Итак, у меня есть некоторый тяжелый в вычислительном отношении код, который может успешно выполнять 32 потока или более эффективно.У меня также есть доступ к кластеру через мою школу, которая имеет 32 процессорных ядра."Милая!"Вы могли бы сказать.

Но, увы, код становится очень несчастным, если у вас нет каждого потока, специально связанного с процессором.Что касается числовой склонности, моя реализация BLAS значительно повышает эффективность, если поток, на котором он работает, заменяется другим.Это не будет проблемой, за исключением того, что кластер находится в состоянии анархии.

Нет планировщика заданий или очереди, и кластер не будет мешать людям запускать задания, даже если все ресурсыо них уже говорят.

Вот мой вопрос: когда я вхожу в систему и хочу запустить свой код, я вижу уже четверых людей.Возможно, они выполняют некоторую комбинацию последовательных и параллельных заданий.Я хотел бы использовать столько потоков, сколько я могу эффективно (то есть все оставшиеся ресурсы в кластере).Как я могу определить какую-то меру того, что я могу использовать, или число потоков, используемых всеми другими пользователями, пиковую вычислительную нагрузку, которую они генерируют, или какую-то другую быстро доступную меру?

В настоящее время мойРешение состоит в том, чтобы запустить часть моего кода с 1 потоком, затем 2 потоками, затем .... затем 32 потоками и посмотреть, где я врезался в стену в реальном времени выполнения.Я отступаю от стены парой ниток и затем выполняю большую работу.Это займет несколько минут, и я бы хотел быстрее найти нужное количество потоков для запуска.

Спасибо,

- Эндрю

РЕДАКТИРОВАТЬ:

Ответ sehe определенно ответил на мой оригинальный вопрос о том, как получить номера потоков.Оказывается, это не так полезно, как я думала.Комментарий Фила поставил меня на продуктивный путь.То, что я делаю сейчас:

top -bn1 | grep load

, чтобы получить информацию.Для меня это является преимуществом, поскольку мое приложение основано на Matlab, и я могу выполнить вызов UNIX из сценария, чтобы время от времени получать эту информацию и адаптировать число потоков, которые я использую, к доступным ресурсам.

Спасибо, что поставили меня на правильный путь.

- Андрей

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Если у вас достаточно прав, прикрепите поток к ядру (привязка потока);в противном случае

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

и иметь графическое отображение запущенных потоков.

Tidied 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;
0 голосов
/ 24 июня 2011

Проверьте, поддерживает ли ваша команда ps (1) параметр "-L" для получения информации о потоках.

...