вторник, 8 февраля 2011 г.

Настройка кластера в Linux Mandriva 2010 и Ubuntu 10.04

1.3. Вход на сервер по протоколу SSH


Если требуется войти с помощью протокола SSH с компьютера
linux.local на компьютер linux-2.local по локальной
сети, то есть залогиниться на сервере ssh,
следует набрать команду


$ ssh linux.local


Можно указывать пользователя, под именем которого
осуществляется вход, например, если этот пользователь
studetn, то команда будет следующей:


$ ssh student@linux.local


здесь вместо имени узла можно указывать его ip-адрес.
Тогда команды будут выглядеть так:



$ ssh 172.16.229.27


или, например, для пользователя root, так:


$ ssh root@172.16.229.27




10.01.2011

При работе на двух компьютерах по протоколу SSH, кроме указанных
выше, можно использовать следующие имена компьютеров при входе
на них

  • node1 — 172.219.16.27 — linux-2.local
  • node0 — 172.219.16.22 — linux.local
Требуется проверить, сохраняется ли такое распределение имен при включении других компьютеров, или когда работают компьютеры без двух, указанных здесь. Таким образом залогиниться на сервере ssh можно без использования ip-адреса с помощью команд
[student@localhost ~]$ ssh linux.local [student@localhost ~]$ ssh linux-2.local

1.4. Изменение пароля пользователя

При первом подключении к серверу SSH от имени student система потребовала пароль для пользователя student. Если пароль какого-либо пользователя не известен, то от имени администратора можно поменять пароль нужного пользователя. Для осуществления этого входят в систему под именем администратора, вводят пароль суперпользователя и меняют пароль определенного логина, в нашем примере для пользователя student:
$ su
пароль:
# passwd student

После ввода последней команды система потребует ввода нового пароля и его подтверждения.

1.5. Беспарольный доступ по протоколу SSH

Найден способ получения беспарольного доступа на другой компьютер локальной сети. За основу взят совет из форума сообщества Ubuntu

http://forum.ubuntu.ru/index.php?topic=47437.45

а можно поподробнее про аутентификацию с использованием ключа?
Простенький скрипт для настройки:
Код:

REMOTE_USER=username
REMOTE_HOST=my-desktop.my-domain
ssh-keygen -t rsa
ssh-copy-id -i $HOME/.ssh/id_rsa.pub $REMOTE_USER@$REMOTE_HOST
ssh $REMOTE_USER@$REMOTE_HOST

В результате будет коннектиться без спроса пароля.
ps
И скрипт и команду следует выполнять с другого компьютера, не fox-laptop.
Предварительно убеждаются, что ssh установлен на обоих компьютерах. Затем, перейдя в скрытую папку .ssh домашней папки компьютера node0, создают открытый RSA-ключ
[student@localhost ~/.ssh]$ ssh-keygen -t rsa
Выяснилось, что следующая рекомендация действенна для Ubuntu. Выполняют, зайдя через ssh на компьютер node1, копирование ключа авторизации (нужен ли этот шаг — требуется проверить)
cat id_rsa.pub >> authorized_keys2
В Mandriva верной будет команда описанная ниже. В терминале компьютера-консоли кластера следует набрать команду
[student@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub student@172.16.229.27
После выполнения этой команды в папке ~/.ssh компьютера node1 появляется файл authorized_keys — видимо предыдущий шаг, связанный с копированием ключа авторизации не нужен, либо не должно быть цифры "2" в названии файла ключа авторизации (последнее утверждение требует проверки). Ниже приведен протокол работы этой команды
[student@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub student@172.16.229.27
29
student@172.16.229.27's password: 
Now try logging into the machine, with "ssh 'student@172.16.229.27'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[student@localhost ~]$ ssh student@172.16.229.27
Last login: Mon Jan 10 10:36:22 2011 from linux-2.local
[student@localhost ~]$ ls
Как видно из трех последних строк, вход на соседний компьютер через ssh выполнен без пароля. Введенная для проверки команда ls вывела содержимое домашней папки компьютера node1.

Внимание! Не требуется залогинится в ssh на компьютере node0, тогда не требуется вводить пароль. Нужно сразу логинится к linux-2.local.

2. Освоение NFS

На обоих компьютерах в домашних папках создают папки с одинаковым именем /mympi. В папке /etc находится файл hosts.allow. В нем прописывают следущие строки
portmap: 172.16.229. /home/student/mympi 172.16.229.22/24(rw,async,no_subtree_check,no_root_squash)
Затем перезагружают nfs-сервер:

[root@localhost etc]# /etc/init.d/nfs-server restart
Stopping NFS kernel daemon
Stopping rpc.mountd:                                           [  OK  ]
Stopping nfsd:                                                 [  OK  ]
Unexporting directories for NFS kernel daemon...
Exporting directories for NFS kernel daemon...
Starting NFS kernel daemon
Starting nfsd                                                  [  OK  ]
Starting rpc.mountd                                            [  OK  ]
[root@localhost etc]# 

На компьютере node1 в файле fstab записывают команду монтирования сетевой папки /home/student/mympi с компьютера с ip-адресом 172.16.229.22 (node0) в одноименную папку с тем же местом расположения на компьютере node1. Для этого логинятся как суперюзер, переходят в папку /etc и загружают в текстовый редактор файл /fstab

[root@localhost ~]$su
пароль:
[root@localhost ~]# cd /etc
[root@localhost etc]# mcedit fstab

В файл fstab записывают строку
172.16.229.22:/home/student/mpi /home/student/mpi nfs rsize=8192,wsize=8192,rw,user,owner,auto 0 0
или
172.16.229.22:/home/student/mpi /home/student/mpi nfs rw 0 0
Обязательно нажать Enter в конце строки. В файле exports находится строка, открывающая доступ к домашней папке студент только для чтения — в начале этой строки нужно поставить знак диеза (шарп, решетка: #). Дело в том, что если в последующей строке стоит команда для монтировки сетевой папки, точнее ее расшаривания с разрешением записи в нее, то первая строка перекрывает право записи, разрешая только чтение с другого компьютера и никакие команды "chmod 777 -R имя папки" ни на том, ни на дргом компьютерах не открывают расшаренную папку для записи.

3. Освоение MPI

MPI — Message Passing Interface, открытый стандарт библиотеки, предназначенной для передачи сообщений внутри параллельного приложения. Реализации этого стандарта: mpich, lam, openmpi.

Как оказалось в исследуемом компьютерном классе оказалась предустановлена система mpich. По некоторым сведениям, она не развивается с 2005 года. Рекомендуется использовать openMPI, которая активно развивается (ссылка). Дальнейшее исследование показало, что в данный момент появляются нове версии пакетов mpich.

В файле конфигурации bash, который находится по адресу
/etc/bashrc
прописаны только следующие строки, указывающие, куда установлен

# MPI environment
MPIRUN_HOME=/usr/bin
export MPIRUN_HOME
При установке вручную, без использования команды urpmi для конфигурирования этого пакета следует набрать строку
./configure -with-arch=LINUX -with-device=ch_p4 -rsh=/usr/bin/ssh --prefix=/usr/bin

14.01.2011

Пакеты программ MPIch и OpenMPI установлены на компьютере с именем
linux-10.local
Справа находится машина linux-4.local, а слева
linux-7.local
Запускать программы можно из папки /root/mpich. Примеры компиляции программ в этой папке. Тестовая программа для расчета числа пи cpi.c
mpicc cpi.c -o cpi получаем исполняемый файл cpi, который запускаем с помощью команды
mpirun -np 4 cpi
запускается четыре процесса. Более расширенная форма команды
mpirun -np 4 -machine linux-10.local cpi
где после параметра -machine указывают имя узла кластера, хоста, на котором запускаются процессы. Вместо параметра -machine можно использовать параметр -machinefile, после которого указывают имя файла со списком узлов кластера. Указанные параметры используются в пакете mpich. В пакете openmpi вместо данных параметров используются параметры -host и -hostfile.

Получить доступ к папке /root можно с помощью файлового менеджера, нажав Alt+F2, набрав команду
gksu pcmanfm
и набрав пароль суперюзера.

Специалист утверждает, что для нормальной работы в кластере 4 и более машин требуется гигабитный свич (ориентировочная стоимость 500 р.), поскольку на компьютерах поставлены гигабитные сетевые карты а свич в настояещее время 100 мегабитный. Кроме этого, к интернету должен быть подключен только "master node", то есть сервер, главный узел кластера, который будет служить прокси-сервером для других узлов.

20.01.2011

Выяснилось, что при включении 5 компьютеров имя компьютера с ip-адресом 172.16.229.22 изменилось. Вместо имени linux.local действующим стало имя linux-3.local.

21.01.2011

Для того, чтобы исправить ошибку

No value for MPI_HOST!
MPI_HOST is set either from your environment or by
processing for an MPI machine type of ch_p4, ch_tcp, 
ch_nexus, or sgi_mp.  The machine type you used was student@172.16.229.22 .
Use the -machine <machinename> argument to select a 
specific machine type.
следует набрать команду
$ export MPI_HOST="student@172.16.229.22":$MPI_HOST тогда вывод значения этой константы дает следующее
$ echo $MPI_HOST
student@172.16.229.22

24.01.2011

Однако, после перезагрузки системы внесенные в значения константы MPI_HOST изменения теряются. Чтобы предотвратить эту потерю, значения в эту константу нужно записать в скрытый файл .bashrc, который находится в домашней папке пользователя. В этот файл, как правило, вносят конфигурацию командного интерпретатора bash, которые вступают в силу когда владелец домашней папки, в данном случае student, входит в систему. Аналогичный файл, принадлежащий суперпользователю, находится в папке /etc, здесь следует отметить, что по некторым сведениям (ссылка), вносить изменения в этот файл часто является дурным тоном. Итак в файл ~/.bashrc вносим следующие строчки
# Конфигурация MPICH
export MPI_HOST="student@172.16.229.22":$MPI_HOST

Чтобы изменить конфигурацию без перезагрузки bash набираем команду
$ source ~/.bashrc
Убедиться, что изменения вступили в силу можно если выполнить
$ echo $MPI_HOST

Следующая проблема: при выполнении приведенной ниже команды появлялось сообщение о соответствующей ошибки
[student@localhost mympi]$ mpirun -np 4 -all-local cpi
/home/student/mympi/cpi: error while loading shared libraries: libmpi.so.0: cannot open shared object file: No such file or directory

Видимо, следовало установть пакет программ, содержащий библиотеку
libmpi.so.0
В каком пакете присутствует указанная библиотека, узнают, исполняя на компьютере, настроенном на установку rpm-пакетов из интернет-источника, команду
$ urpmf libmpi.so.0
Вывод этой команды: следует установить пакет
libopenmpi.so.0
scp libibverbs1-1.1.3-1mdv2010.1.i586.rpm libtorque2-2.4.8-1mdv2010.1.i586.rpm libnuma1-2.0.3-2mdv2010.1.i586.rpm libopenmpi1.2-1.4.1-1mdv2010.1.i586.rpm

Could not find enough machines for architecture LINUX
Для исправления данной ошибк следует под рутом в файл
/usr/share/mpich/machines.LINUX.rpmsave
записать
172.16.229.22
либо
linux-2.local
Запись вида
student@172.16.229.22
приводит к указанной выше ошибке отсутствия машин с линукс-архитектурой.

[student@localhost mympi]$ mpirun -np 4 -all-local cpi
[localhost:13774] [[INVALID],INVALID] ORTE_ERROR_LOG: A system-required executable either could not be found or was not executable by this user in file ess_singleton_module.c at line 269
[localhost:13774] [[INVALID],INVALID] ORTE_ERROR_LOG: A system-required executable either could not be found or was not executable by this user in file ess_singleton_module.c at line 143
[localhost:13774] [[INVALID],INVALID] ORTE_ERROR_LOG: A system-required executable either could not be found or was not executable by this user in file runtime/orte_init.c at line 132
--------------------------------------------------------------------------
Sorry!  You were supposed to get help about:
    orte_init:startup:internal-failure
But I couldn't open the help file:
    /usr/share/openmpi/help-orte-runtime: No such file or directory.  Sorry!
--------------------------------------------------------------------------
--------------------------------------------------------------------------
Sorry!  You were supposed to get help about:
    mpi_init:startup:internal-failure
But I couldn't open the help file:
    /usr/share/openmpi/help-mpi-runtime: No such file or directory.  Sorry!
--------------------------------------------------------------------------
*** An error occurred in MPI_Init
*** before MPI was initialized
*** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
[localhost:13774] Abort before MPI_INIT completed successfully; not able to guarantee that all other processes were killed!

Гипотеза: указанная выше ошибка вызвана тем, что в системе не установлен пакет, содержащий компилятор программ на языке программирования C. Посылкой к этой гипотезе служит то, что программа cpi имеет исходный код на языке C и компилировалась с помощью соответствующего компилятора mpicc, установленного на другом компьютере linux-10.local с ip-адресом 172.16.229.34. Для проверки этой гипотезы была откомприлирована программа на языке C++, которая выводит сообщение "Hello, World!" с помощью указанного числа процессов. Для компиляции этой программы использовался компилятор mpiCC из пакета
mpic++-1.2.5.2-11mdv2008.1.i586.rpm Этот пакет был установлен ранее, до возникновения указанных двух предыдущих ошибок. Команда компиляции выглядит следующим образом:
mpiСС 111-001.cpp -o aa22 Здесь 111-001.cpp исходный текст программы, а имя aa22 после параметра -o — имя исполнимого файла.

Вот исходный текст программы 111-001.cpp

#include <iostream>
#include "mpi.h"
#include "mpi2c++/mpi++.h"
using namespace std;
int
main(int argc, char *argv[])
{
  MPI::Init(argc, argv);
  
  int rank = MPI::COMM_WORLD.Get_rank();
  int size = MPI::COMM_WORLD.Get_size();
  
  cout << "Hello World! I am " << rank << " of " << size << endl;
  
  MPI::Finalize();
}

В указанной программе следует обратить внимание на 2-ю и 3-ю строки, в которых указываются используемые заголовочне файлы:
#include "mpi.h"
#include "mpi2c++/mpi++.h"

Следует учесть, что файл mpi.h находится в папке /usr/include, а появился он там при установке пакета:
libmpich1-devel-1.2.5.2-11mdv2008.1.i586.rpm
А второй заголовочный файл расположен по адресу
/usr/include/mpi2c++/mpi++.h
Эта папка появилась там при установке пакета
mpic++-1.2.5.2-11mdv2008.1.i586.rpm

Запуск этой программы на локальной машине
mpirun -np 4 -all-local aa22
не приводит ни к каким видимым результатом, то есть как бы "зависает". Чтобы выяснить, в чем причина такого поведения системы, запускают вторую консоль, в которой выводят список процессов. Вот часть протокола:

[student@localhost ~]$ ps ax
  PID TTY      STAT   TIME COMMAND
 4031 pts/0    S+     0:00 /bin/sh /usr/bin/mpirun -np 4 -all-local aa22
 4157 ?        S      0:00 [flush-0:18]
 4158 pts/0    S+     0:00 /home/student/mympi/aa22 -p4pg /home/student/mympi/PI4031 -p4wd /home/student/mympi
 4186 pts/1    R+     0:00 ps ax

Здесь предпоследняя строка связана с файлом PI4031, который появляется в папке /home/student/mympi/ при запуске mpirun. В этом файле записан список процессов и хостов, на которых они запускаются. Этот факт был обнаружен при удалении файла PI4031, после чего в второй консоли был уничтожен процесс с pid 4158 командрой
$ kill 4158
В ответ на это действие в первой консоли, в которой запущена программа с помощю mpirun появилось сообщение:

[student@localhost mympi]$ mpirun -np 4 -all-local aa22
/usr/bin/mpirun.ch_p4: line 243:  4158 Завершено      /home/student/mympi/aa22 -p4pg /home/student/mympi/PI4031 -p4wd /home/student/mympi
/bin/rm: невозможно удалить : Нет такого файла или каталога
[student@localhost mympi]$ 

Вот содержимое файла PI4031

student@172.16.229.22:linux.local 0 /home/student/mympi/aa22
student@172.16.229.22:linux.local 1 /home/student/mympi/aa22
student@172.16.229.22:linux.local 1 /home/student/mympi/aa22
student@172.16.229.22:linux.local 1 /home/student/mympi/aa22

При следующем запуске программы, она снова "зависла". Завершение процесса, аналогичного в указанном здесь примере процессу с pid 4158 соответствующий файл вида PI4031 в папке mympi исчезал. При этом выводилось сообщение:

/usr/bin/mpirun.ch_p4: line 243:  7999 Завершено      /home/student/mympi/aa22 -p4pg /home/student/mympi/PI7872 -p4wd /home/student/mympi
При этом оба соответсвующих процесса из списка процессов исчезли.

В другом случае, когда завершался процесс запуска mpirun, аналогичный процессу с pid 4031, файл вида PI4031 оставался в папке mympi. В первой консоли, где был выполнен запуск программы выводилось только единственное слово
Завершено
А в списке процессов оставался висеть процесс aa22, аналогичный в приведенном примере процессу с номером 4158. Вот еще один интересный протокол

[student@localhost mympi]$ mpirun -np 4 -machine 172.16.229.22 aa22
p0_9243:  p4_error: Child process exited while making connection to remote process on linux-2.local: 0
[student@localhost mympi]$ p0_8532: (1082,225086) Procgroup:
p0_8532: (1082,225125)     entry 0: student@172.16.229.22:linux.local 0 0 /home/student/mympi/aa22 student 
p0_8532: (1082,225139)     entry 1: student@172.16.229.22:linux.local 1 1 /home/student/mympi/aa22 student 
p0_8532: (1082,225150)     entry 2: student@172.16.229.22:linux.local 1 2 /home/student/mympi/aa22 student 
p0_8532: (1082,225161)     entry 3: student@172.16.229.22:linux.local 1 3 /home/student/mympi/aa22 student 
p0_8532:  p4_error: Could not gethostbyname for host student@172.16.229.22:linux.local; may be invalid name
: 1083

Ему соответсвует файл PI9105

student@172.16.229.22:linux.local 0 /home/student/mympi/aa22
linux-2.local 1 /home/student/mympi/aa22
linux-2.local 1 /home/student/mympi/aa22
linux-2.local 1 /home/student/mympi/aa22

Список процессов, фрагмент:

[student@localhost ~]$ ps ax
  PID TTY      STAT   TIME COMMAND
 8532 pts/0    S      0:00 /home/student/mympi/aa22 -p4pg /home/student/mympi/P
 9105 pts/0    S+     0:00 /bin/sh /usr/bin/mpirun -np 4 -machine 172.16.229.22
 9243 pts/0    S+     0:00 /home/student/mympi/aa22 -p4pg /home/student/mympi/P
 9244 pts/0    S+     0:00 /home/student/mympi/aa22 -p4pg /home/student/mympi/P
 9245 pts/0    S+     0:00 rsh linux-2.local -l student -n /home/student/mympi/
 9252 ?        Ss     0:00 /home/student/mympi/aa22 student@172.16.229.22:linux
 9267 pts/1    R+     0:00 ps ax
[student@localhost ~]$ kill 9252

Следует отметить, что компьютер, на котором запускали программу
172.16.229.22 linux-2.local
А соседний компьютер
172.16.229.27
который прописан в файле со списком узлов кластера отключен.

Содержимое файла /usr/share/mpich/machines.LINUX.rpmsave

# Change this file to contain the machines that you want to use
# to run MPI jobs on.  The format is one host name per line, with either
#    hostname
# or 
#    hostname:n
# where n is the number of processors in an SMP.  The hostname should
# be the same as the result from the command "hostname"
linux-2.local
172.16.229.27
172.16.229.22

27.01.2011

Соседний компьютер 172.16.229.27 linux-3.local включен

[student@localhost mympi]$ mpirun -np 4 -machine linux-3.local aa33
p0_20817: (81,332796) Procgroup:
p0_20817: (81,332835)     entry 0: linux-3.local:student@172.16.229.22:linux-2.local 0 0 /home/student/mympi/aa33 student 
p0_20817: (81,332848)     entry 1: linux-2.local 1 1 /home/student/mympi/aa33 student 
p0_20817: (81,332858)     entry 2: student@172.16.229.22 1 2 /home/student/mympi/aa33 student 
p0_20817: (81,332868)     entry 3: student@172.16.229.27 1 3 /home/student/mympi/aa33 student 
p0_20817:  p4_error: Could not gethostbyname for host student@172.16.229.22; may be invalid name
: 81
[student@localhost mympi]$ 

Из папки /usr/share/mpich/ были удалены файлы
machines.LINUX
machines.sample

и удален файл
machines.LINUX.rpmsave
на исполнение запущен файл

[student@localhost mympi]$ mpirun -np 4 -all-local aa33
^C[student@localhost mympi]$ mpirun -np 4 -all-local aa33
Cannot read //usr/share/mpich//machines.LINUX.
Looked for files with extension LINUX in
directory //usr/share/mpich/ .
[student@localhost mympi]$ 

Результат предыдущего эксперимента означает, что список узлов кластера берется именно из файла
machines.LINUX
а выводы предыдущего аналогичного эксперимента с файлом machines.LINUX.rpmsave не совсем верны или, по меньшей мере, не учитывают последующих экспериментов с параметром конфигурации MPI_HOST в файле ~/.bashrc.

В списке процессов найдена интересная строка
9245 pts/0 S+ 0:00 rsh linux-2.local -l student -n /home/student/mympi/
Здесь rsh означает, что вместо протокола SSH, на который предполагалось настроить кластер используется протокол удаленного управелния компьютером Remote SHell (RSH), который как правило не одобряется администраторами публичных, не частных, сетей. Вопрос: как настроить mpich на SSH? Гипотеза: возможно в файле ~/.bashrc нужно присвоит значение SSH соответствующей переменной окружения пакета mpich.

29.01.2011

Обнаружен файл, который, по-видимому, должен служить для конфигурации пакета MPICH. Путь к этому файлу:
/usr/bin/mpireconfig.dat
В этом файле существует строка с константой, назначающей режим использования RSH, которой было присвоено следующее значение:
RSHCOMMAND='ssh'
Возможно, ssh следует записывать прописными буквами: SSH (требуется проверка).

01.02.2011

Соседний компьютер 172.16.229.27 вЫключен. Протокол запуска программы:

[student@localhost mympi]$ mpirun -np 4 -machine linux.local aa44
p0_4323: (1082,417904) Procgroup:
p0_4323: (1082,417944)     entry 0: linux-3.local:student@172.16.229.22:linux-2.local 0 0 /home/student/mympi/aa44 student 
p0_4323: (1082,417959)     entry 1: linux-2.local 1 1 /home/student/mympi/aa44 student 
p0_4323: (1082,417970)     entry 2: student@172.16.229.22 1 2 /home/student/mympi/aa44 student 
p0_4323: (1082,417981)     entry 3: student@172.16.229.27 1 3 /home/student/mympi/aa44 student 
p0_4323:  p4_error: Could not gethostbyname for host linux-2.local; may be invalid name
: 1083
[student@localhost mympi]$ echo $MPI_HOST
linux-3.local:student@172.16.229.22:linux-2.local

Соседний компьютер 172.16.229.27 включЁн. Из файла ~/.bashrc удалена строка Протокол запуска программы:

[student@localhost mympi]$ mpirun -np 4 -machine linux.local aa44
p0_5290: (81,308951) Procgroup:
p0_5290: (81,308988)     entry 0: linux-3.local:student@172.16.229.22:linux-2.local 0 0 /home/student/mympi/aa44 student 
p0_5290: (81,309002)     entry 1: linux-2.local 1 1 /home/student/mympi/aa44 student 
p0_5290: (81,309013)     entry 2: student@172.16.229.22 1 2 /home/student/mympi/aa44 student 
p0_5290: (81,309024)     entry 3: student@172.16.229.27 1 3 /home/student/mympi/aa44 student 
p0_5290:  p4_error: Could not gethostbyname for host student@172.16.229.22; may be invalid name
: 81
[student@localhost mympi]$

Соседний компьютер 172.16.229.27 включЁн. Из файла ~/.bashrc удалена строка student@172.16.229.22. Протокол запуска программы:

[student@localhost mympi]$ source ~/.bashrc
bash: TMOUT: readonly variable
Identity added: /home/student/.ssh/id_rsa (/home/student/.ssh/id_rsa)
[student@localhost mympi]$ echo $MPI_HOST
linux-3.local:linux.local:linux-2.local
[student@localhost mympi]$ mpirun -np 4 -machine linux.local aa44
p0_8511: (81,328901) Procgroup:
p0_8511: (81,328938)     entry 0: linux-3.local:linux.local:linux-2.local 0 0 /home/student/mympi/aa44 student 
p0_8511: (81,328953)     entry 1: linux-2.local 1 1 /home/student/mympi/aa44 student 
p0_8511: (81,328964)     entry 2: student@172.16.229.22 1 2 /home/student/mympi/aa44 student 
p0_8511: (81,328974)     entry 3: student@172.16.229.27 1 3 /home/student/mympi/aa44 student 
p0_8511:  p4_error: Could not gethostbyname for host student@172.16.229.22; may be invalid name
: 81
[student@localhost mympi]$

Соседний компьютер 172.16.229.27 включЁн. В файле /usr/chare/mpich/machines.LINUX строк вида
student@172.16.229.22 student@172.16.229.27
заменены на строки
172.16.229.22 172.16.229.27
Кроме того, перед указанными выше строками добавлено
linux.local
Протокол запуска программы:

[student@localhost mympi]$ echo $MPI_HOST
linux-3.local:linux.local:linux-2.local
[student@localhost mympi]$ mpirun -np 4 -machine linux.local aa44
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for linux-2.local has changed,
and the key for the corresponding IP address 172.16.229.27
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/student/.ssh/known_hosts:1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
f0:17:17:27:22:61:6f:5f:02:99:b3:9a:83:8a:23:2d.
Please contact your system administrator.
Add correct host key in /home/student/.ssh/known_hosts to get rid of this message.
Offending key in /home/student/.ssh/known_hosts:3
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
X11 forwarding is disabled to avoid man-in-the-middle attacks.
Permission denied (publickey,password,keyboard-interactive).
p0_8909:  p4_error: Child process exited while making connection to remote process on linux-2.local: 0
[student@localhost mympi]$ mpirun -np 4 -machine linux.local aa44
student@172.16.229.22's password: 
p0_9076:  p4_error: Timeout in making connection to remote process on 172.16.229.22: 0
Killed by signal 2.
[student@localhost mympi]$

02.02.2011

Сегодня впервые удалось локально запустить на компьютере с ip 172.16.229.22 две программы на языке C++. Первая программа выводит из отдельных процессов слова "Hello, World!". Вторая программа вычисляет интеграл, однако результат при каждом запуске был равен inf, предположительно inf от infinity, то есть бесконечность. Интеграл вычислялся либо от кубической, либо от квадратической функций в пределах от нуля до единицы. Возможно, причиной этого является то, что для каждого процесса приходится вводить пароль для доступа к данному узлу через SSH.

Это положительный момент: значит, удалось настроить работу mpich через SSH с помощью правки файла /usr/bin/mpireconfig.dat.

Для достижения полжительных результатов сегодняшнего дня выполнено следующее. В файле
~/.bashrc
сделаны изменения, показанные ниже, обратить внимание на закоментированные строки символом диез (шарп, решетка) # и учесть, что соседний компьютер 172.16.229.27 выключен

#ssh-add
# mpich
MPI_HOST="linux.local"
#export MPI_HOST="linux.local":$MPI_HOST
#export MPI_HOST="linux-3.local":$MPI_HOST
#RSH=SSH

Из локального пакета MPICH2 взят пример расчета числа Пи на языке программирования C++ из файла
mpich2-1.3.1/examples/cxx/cxxpi.cxx
При компиляции непосредственно этого примера возникли ошибки:

[student@localhost mympi]$ mpiCC cxxpi.cxx -o cxxpi
cxxpi.cxx:18:22: error: iostream.h: Нет такого файла или каталога
cxxpi.cxx: In function 'int main(int, char**)':
cxxpi.cxx:45: ошибка: некорректная инициализация неконстантной ссылки типа 'char*&' из временного выражения типа 'char*'
/usr/include/mpi2c++/functions.h:52: ошибка: in passing argument 1 of 'void MPI::Get_processor_name(char*&, int&)'
cxxpi.cxx:47: ошибка: нет декларации 'cout' в этой области видимости
cxxpi.cxx:48: ошибка: нет декларации 'endl' в этой области видимости
Эту программу пришлось несколько изменить, получился следующий исходный код, компиляция которого прошла успешно.
/* -*- Mode: C++; c-basic-offset:4 ; -*- */
/*  
 *  (C) 2004 by Argonne National Laboratory.
 *      See COPYRIGHT in top-level directory.
 */

//#include "mpi.h"
/* Support both new (e.g., has iostream) and old (requires iostream.h) 
   C++ compilers */
//#ifdef HAVE_CXX_IOSTREAM
//#include <iostream>
//#ifdef HAVE_NAMESPACE_STD
// Those that do often need the std namespace; otherwise, a bare "cout"
// is likely to fail to compile
//using namespace std;
//#endif
//#else
//#include <iostream.h>
//#endif
//#ifdef HAVE_CXX_MATH
//#include <math>
//#else
//#include <math.h>
//#endif

#include <iostream>
#include "mpi.h"
#include "mpi2c++/mpi++.h"
#include <math.h>
using namespace std;

 //double f(double);

double f(double a)
{
    return (4.0 / (1.0 + a*a));
}

int main(int argc,char **argv)
{
    int n, myid, numprocs, i;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime = 0.0, endwtime;
 //   int  namelen;
    char processor_name;//[MPI_MAX_PROCESSOR_NAME];
//    int ierror;
  //  ierror = MPI_Init (&argc, &argv);
    MPI::Init(argc,argv);
    numprocs = MPI::COMM_WORLD.Get_size();
    myid     = MPI::COMM_WORLD.Get_rank();
 //   MPI::Get_processor_name(processor_name,namelen);

    cout << "Process " << myid << " of " << numprocs << " is on " <<
	processor_name << endl;

    n = 10000;			/* default # of rectangles */
    if (myid == 0)
	startwtime = MPI::Wtime();

    MPI::COMM_WORLD.Bcast(&n, 1, MPI_INT, 0);

    h   = 1.0 / (double) n;
    sum = 0.0;
    /* A slightly better approach starts from large i and works back */
    for (i = myid + 1; i <= n; i += numprocs)
    {
	x = h * ((double)i - 0.5);
	sum += f(x);
    }
    mypi = h * sum;

    MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0);

    if (myid == 0) {
	endwtime = MPI::Wtime();
	cout << "pi is approximately " << pi << " Error is " <<
	    fabs(pi - PI25DT) << endl;
	cout << "wall clock time = " << endwtime-startwtime << endl;
    }

    MPI::Finalize();
    return 0;
}

Протокол выполнения приведенной выше программы:

[student@localhost mympi]$ mpirun -np 3 -all-local aa11
student@linux.local's password: 
student@linux.local's password: 
Process 1 of 3 is on ?
Process 0 of 3 is on ?
Process 2 of 3 is on ?
pi is approximately 3.14159 Error is 8.33339e-10
wall clock time = 0.000226
[student@localhost mympi]$

3. Освоение PVM

PVM — Parallel Virtual Machine, среда программирования.

25.01.2011

Для запуска установленного в папку /pvm3 сервера pvm следует набрать следующие команды

$ ssh-agent bash
$ ssh-add
$ pvm
pvm> add 172.16.229.27
pvm> halt
$

Предпоследняя строчка добавляет указанный хост в качестве узла кластера, а последняя строчка позволяет завершить работу с сервером pvm и вернуться в оболочку bash.

MPI — Message Passing Interface, среда программирования. Открытый стандарт библиотеки, предназначенной для передачи сообщений внутри параллельного приложения. Реализации этого стандарта: mpich, lam, openmpi.

1. Установка Ubuntu и настройка локальной сети

cluster0

  1. CPU: Intel Atom N270 1,60 GHz
  2. Memory: DDR3 3 GiB
  3. OS: Linux Ubuntu 10.04 LTS "Lucid Lynx"
  4. eth0: ip 192.168.251.1

cluster1

  1. CPU: AMD Duron 850 MHz
  2. Memory: SDRAM 256 MiB
  3. OS: Linux Ubuntu 10.04 LTS "Lucid Lynx"
  4. eth0: ip 192.168.251.2

Проблемы:

  1. [РЕШЕНО-1] При включенном GSM соединении на cluster0
    не проходит ping в обоих направлениях сети
    cluster0 — cluster1. Такой проблемы нет
    на другой установке Ubuntu на внешнем диске.

  2. [РЕШЕНО-2] Невозможно получить доступ через
    протокол SSH: не удается залогинится и копировать файлы.
    При выполнении команд
        ssh cluster1@cluster1-desktop
        scp ./file1 cluster1@cluster1-desktop:~/.ssh
      
    выдается сообщение
        ssh: Could not resolve hostname cluster1-desktop: Name or service not known
        lost connection
      
    С клинета cluster0 не видно
    имя хоста, находящегося на узле cluster1.

Решения проблем:

  1. [РЕШЕНО-1]http://forum.ubuntu.ru/index.php?topic=25514.0

    На cluster0 выполнен скрипт
      sudo iptables.sh
      
    следующего содержания для разблокировки исходящего трафика
      #!/bin/sh
    
     iptables -P INPUT ACCEPT
     iptables -P FORWARD ACCEPT
     iptables -P OUTPUT ACCEPT
    
     iptables -t nat -P PREROUTING ACCEPT
     iptables -t nat -P POSTROUTING ACCEPT
     iptables -t nat -P OUTPUT ACCEPT
    
     iptables -t mangle -P PREROUTING ACCEPT
     iptables -t mangle -P OUTPUT ACCEPT
    
     iptables -F
     iptables -t nat -F
     iptables -t mangle -F
    
     iptables -X
     iptables -t nat -X
     iptables -t mangle -X
      
    Теперь ping проходит в обоих направлениях сети
    cluster0 — cluster1.

  2. [РЕШЕНО-2]http://forum.ubuntu.ru/index.php?topic=47437.msg772515#msg772515

    Если возникает ошибка
        ssh: Could not resolve hostname cluster1-desktop: Name or service not known
        lost connection
      
    при работе с протоколом SSH, то вместо имени хоста можно
    использовать соответствующий ip-адрес. Так, чтобы залогинится
    на удаленном компьютере, имеющем ip 192.168.251.2,
    или скопировать на него файл, выполняют команды
        ssh cluster1@192.168.251.2
        scp ./file1 cluster1@192.168.251.2:~/.ssh
      
    Другое решение: прописать имя хоста и соответствующий ip
    в файл /etc/hosts.

2. Установка пакета apt-cacher-ng на cluster0

На cluster0 выполнены команды

sudo aptitude apdate
sudo aptitude install apt-cacher-ng

В итоге
apt-cacher-ng
296 kb архивов
799 kb после распаковки

3. Настройка менеджера пакетов apt-get на cluster1

На cluster1 выполнены команды

sudo sh -c "echo \"Acquire::http { Proxy \\\"http://192.168.251.1:3142\\\"; }; \"> /etc/apt/apt.conf.d/01proxy"
sudo apt-get update
После этого вычислительный узел cluster1 получил возможность скачивать программные пакеты через прокси, в качестве которого выступает cluster0.

4. Установка пакета openssh-server на cluster0 (и на cluster1)

На cluster0 выполнены команды

sudo aptitude apdate
sudo aptitude install openssh-server

В итоге
openssh-server
285 kb архивов
778 kb после распаковки

5. Беспарольный доступ в кластере

С помощью протокола SSH (Secure SHell, сетевой протокол сеансового уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений) обеспечивают беспарольный доступ с cluster0 на cluster1. Нужно копировать исполняемые модули на другие узлы кластера: как правило, это требует вводить пароль доступа. При добавлении нового узла в кластер тоже требуется вводить пароль доступа.
  1. Осуществляют вход в cluster0


    ssh netbook@ubuntu-netbook

  2. Переходят в скрытую папку ssh, которая находится в домашней папке


    cd ~/.ssh

  3. Генерируют rsa-ключ


    ssh-keygen -t rsa


    При этом оставляют предложенное имя файла id_rsa,
    нажимая клавишу Enter. Не задают никакого пароля,
    нажимая снова клавишу Enter. Подтверждают пустой
    пароль,
    “вдругоряд”
    нажимая клавишу Enter.
  4. Копируют открытый rsa-ключ, созданный в папке ~/.ssh
    на узел cluster1, которому назначен ip-адрес
    192.168.251.2


    scp id_rsa.pub cluster1@192.168.251.2:~/.ssh

  5. Входят на узел cluster1 с консоли cluster0, при этом требуется
    ввести пароль для супер-пользователя узла cluster1:

    ssh cluster1@192.168.251.2
  6. С консоли cluster0 переходят в скрытую папку ssh,
    которая принадлежит узлу cluster1:

    cd ~/.ssh
  7. С консоли cluster0 создают копию открытого rsa-ключа
    в скрытой папке ~/.ssh узла cluster1:

    cat id_rsa.pub >> authorized_keys2
  8. Отключаются от узла cluster1:

    logout
  9. Проверяют, получается ли вход на узел cluster1 с консоли cluster0
    без пароля:

    ssh cluster1@192.168.251.2
  10. Повторяют шаги 4 — 9 для остальных узлов:
    cluster2, cluster3…
  11. Что дальше?!
  12. А дальше — вот что!
  13. Читайте!

6. Настройка сетевой файловой системы NFS

Задача: все узлы кластера должны иметь доступ к одному и тому же программному модулю и одним и тем же файлам с данными, используемыми этим модулем. Суть решения задачи: программный модуль с файлами данных располагается в папке на консоли кластера, а эта папка монтируется в одноименные папки на узлах кластера через сетевую файловую систему NFS. Вводные: будем предполагать, что узлы кластера имеют ip-адреса в диапазоне 192.168.1.2-192.168.1.254. Консоль кластера, к каталогам файловой системы которой мы будем подключаться через NFS, имеет ip-адрес 192.168.1.1. 0.sudo apt-get install nfs-kernel-server 492 kB архивов 1 524 kB будет занято 1. Конфигурация сервера 1.1.разрешить подключение nfs-клиентам к nfs-серверу. в файле /etc/hosts.allow прописываем следующую строчку: portmap: 192.168.1. Точка в конце строки обязательна! 1.2.Расшарить папку К примеру, мы хотим обеспечить узлам кластера доступ в каталог /home/mpiuser/data-and-progs. Для этого в файле /etc/exports прописываем строку: /home/mpiuser/data-and-progs 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash) На этом настройка серверной части закончена. Чтобы изменения вступили в силу необходимо перезапустить службу NFS с помощью команды "service portmap restart". ----- Ubuntu ----- http://cluster.linux-ekb.info/ubuntu.php На консоли кластера добавляем строчку в файл /etc/exports для создания сетевого ресурса: sudo sh -c "echo \"$HOME/mpi 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)\" >> /etc/exports" sudo sh -c "echo \"/tmp/my-mpi 192.168.251.0/24(rw,async,no_subtree_check,no_root_squash)\" >> /etc/exports" После этого необходимо перезапустить сервис NFS: sudo /etc/init.d/nfs-kernel-server restart ----- /Ubuntu ----- 2. Конфигурация клиентов Все что будет описано ниже необходимо выполнить на каждом компьютере кластера кроме консольного. 2.1. Создать одноименного с консолью пользователя на каждом клиенте и загружаться с него (под ним же должен быть настроен ssh и apt-get-прокси) Либо располагать папку в корне или другой не домашней папке. 2.2. в домашнем каталоге пользователь mpiuser (/home/mpiuser) создать пустой каталог data-and-progs. 2.3. прописать в файле /etc/fstab следующую строку: 192.168.1.1:/home/mpiuser/data-and-progs /home/mpiuser/data-and-progs nfs rw 0 0 2.4. Чтобы удаленный (сетевой) каталог монтировался автоматически при загрузке узла кластера, сервис клиента NFS должен запускаться в процедуре начальной загрузки. 2.5. При включении кластера, консоль кластера должна быть загружена до того, как вы начнете включать остальные узлы. ----- Ubuntu ----- http://cluster.linux-ekb.info/ubuntu.php На всех остальных узлах кластера мы должны будем поправить файл /etc/fstab , добавив туда запись для автоматического монтирования сетевого ресурса: sudo sh -c "echo \"192.168.1.1:$HOME/mpi $HOME/mpi nfs rsize=8192,wsize=8192,rw,user,owner,auto 0 0\" >> /etc/fstab" Теперь для проверки перезагрузим вычислительные узлы кластера. После перезагрузки каталог mpi в домашней директории пользователя должен быть смонтирован и его содержимое должно быть эквивалентно содержимому такого же каталога на консоли кластера. ----- /Ubuntu ----- =================== Подробно для hitech ===================

Установка Ubuntu и настройка локальной сети

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

Характеристики cluster0:

    На нетбуке Compaq mini 311c подключен внешний диск Western Digital 5000BEKT 8 MiB 7200 rpm SATA2 2,5" 500 GiB с помощью контейнера AGESTAR External Enclosure for 2,5" Serial ATA HDD.

apt-cacher-ng 296 kb архивов
799 kb после распаковки

http://www.goodroid.ru/articles/programmirovanie/opengl-es-for-android/draw-triangle-opengl-es.html
Цитата:
"Просто добавьте android.opengl.GLSurfaceView в импорт."

1. Если выполнено указанное в цитате, то нужно ли тогда это:
"Создадим в нашем проекте пакет с именем
com.example.android.apis.graphics и скопируем
в него GLSufaceView.java."?

2. Если ответ на первый вопрос отрицательный, то
в классе Renderer как должен измениться заголовок класса
public class Renderer implements
com.example.android.apis.graphics.GLSurfaceView.Renderer?
Откуда нужно имплементировать интерфейс GLSurfaceView.Renderer?
Неужели вместо
"implements
com.example.android.apis.graphics.GLSurfaceView.Renderer"
нужно написать
"implements
android.opengl.GLSurfaceView"?

3. Если ответ на первый вопрос положительный, то объясните,
пожалуйста,то для чего это действие нужно?

4. И если для чего-то нужно, то где можно достать
файл GLSufaceView.java?

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

Дело в том, что после установки на компьютер SDK Android
вытянул из Интернета пакеты примеров для Android версий
7, 8 и 9. Но по указанному в статье пути
"samples\ApiDemos\src\com\example\android\apis\graphics"
я не нашел файл GLSufaceView.java. Существует лишь файл
с похожим названием GLSufaceViewActivity.java.

Комментариев нет:

Отправить комментарий