12. Прозрачная
распределенная обработка с помощью протокола Qnet
Что такое Qnet?
Собственная сеть QNX
Neutrino представляет собой группу соединенных между собой
рабочих станций, каждая из которых работает под управлением
операционной системы QNX Neutrino. В этой сети программа
имеет прозрачный доступ к любому ресурсу, который расположен
на любом другом узле (компьютере или рабочей станции)
локальной подсети, будь то файл, устройство или процесс.
Собственная сеть QNX Neutrino даже позволяет запускать
программы на других узлах.
Примечание. Протокол,
который используется в собственной сети ОС QNX 4, называется
FLEET. Он несовместим с протоколом Qnet операционной системы
QNX Neutrino.
В сущности, протокол Qnet прозрачно
распространяет действие механизма межзадачного
взаимодействия (IPC) на сеть микроядер, используя принцип
передачи сообщений ОС QNX Neutrino для реализации
собственной сети.
Записи всех узлов
локальной подсети, на которых работает протокол
Qnet, расположены в пространстве имен /net (в операционной
системе QNX 4 для обращения к другому узлу
применяется двойная косая черта, за которой следует
номер узла).
Более
подробные сведения о протоколе Qnet см. в главе 13
руководства "Описание применения. Часть 1. Системная
архитектура" КПДА.10964-01 31 01". Программирование с
использованием протокола Qnet рассмотрено в разделе
"Transparent Distributed Networking via Qnet" руководства
"Programmer’s Guide".
Когда использовать протокол Qnet?
Когда следует
использовать протокол Qnet, а когда — TCP или
какой-либо другой протокол? Все зависит от того, какие
компьютеры требуется объединить в сеть.
Протокол Qnet
предназначен для сети доверенных компьютеров,
которые работают под управлением операционной
системы QNX Neutrino и имеют один и тот же порядок
следования байтов. В этих условиях компьютеры могут
совместно использовать ресурсы с небольшими
накладными расходами. Протокол Qnet дает возможность
пользоваться утилитами операционной системы QNX
Neutrino (cp, mv и т. д.) для
работы с файлами, которые находятся в любом месте
сети Qnet так же, как если бы они находились на
локальном компьютере.
Поскольку протокол Qnet
предназначен для группы доверенных компьютеров (например,
входящих в состав встроенной системы), он не выполняет
аутентификацию запросов. Защита файлов осуществляется с
помощью обычных прав доступа, которые применяются к
пользователям и группам (см. подразд. "Владение
файлами и права доступа" раздела 6), однако ключи maproot и mapany позволяют в некоторых
пределах управлять действиями удаленных пользователей на
компьютере. В отличие от NFS, протокол Qnet является
протоколом с установлением соединения; сообщения о сетевых
ошибках передаются клиентскому процессу.
Протокол TCP/IP предназначен
для компьютеров, которые связаны между собой не столь тесно
и могут работать под управлением разных операционных систем.
Для управления доступом к компьютеру протокол TCP/IP
выполняет процедуру аутентификации; он полезен для
соединения с компьютерами, которые не обязательно являются
доверенными. Протокол TCP/IP используется как основа для
специализированных протоколов, например FTP и Telnet, и
обеспечивает высокую производительность потоковой передачи
данных. Более подробные сведения см. в разделе 13.
Протокол NFS предназначен
для выполнения операций над файловыми системами на любых
хостах с любым порядком следования байтов и пользуется
широкой поддержкой. NFS является протоколом без установления
соединения; сервер можно остановить и перезапустить, а
клиент автоматически возобновляет взаимодействие с сервером.
Кроме того, протокол NFS использует аутентификацию и
управляет доступом к каталогам. Более подробные сведения см.
в подразд. "Файловая система NFS" раздела 11.
Правила именования узлов
Для разрешения имен узлов
протокол Qnet использует следующие правила.
По умолчанию
именем узла является значение конфигурационной строки _CS_HOSTNAME. Если хост имеет имя localhost, которое назначается по
умолчанию при первой загрузке, то протокол Qnet обеспечивает
связь между узлами, используя имя хоста на основе MAC-адреса
сетевого адаптера.
-
Домен узла (node domain) —
символьная строка, которая добавляется в конец имени
узла библиотекой npm-qnet.so. Имя и домен узла в
совокупности должны составлять строку, которая является
уникальной для всех узлов, взаимодействующих друг с
другом по сети. По умолчанию домен узла задается
значением конфигурационной строки _CS_DOMAIN.
-
Полностью определенное имя узла (fully qualified node
name, FQNN) — строка, которая формируется путем
объединения имени и домена узла. Например, если узел
имеет имя karl и доменное имя qnx.com, то полностью
определенным именем узла является karl.qnx.com.
-
Сетевой каталог (network
directory) — каталог в пространстве путевых имен,
который создается библиотекой npm-qnet.so. С каждым сетевым
каталогом (их может быть несколько на одном узле) связан
домен узла. Сетевым каталогом по умолчанию является /net; он используется в
примерах, которые приведены в этом разделе.
Примечание. Элементы каталога /net, которые соответствуют
узлам, расположенным в том же домене, что и локальный
компьютер, не включают в себя доменное имя. Например, если
локальный компьютер находится в домене qnx.com, то элемент узла karl имеет вид /net/karl. Если компьютер находится в
другом домене, то этот элемент имеет вид /net/karl.qnx.com.
-
Разрешение имени (name
resolution) — процесс, с помощью которого модуль lsm-qnet.so преобразует полностью
определенное имя узла в список адресов назначения,
доступных транспортному уровню.
-
Разрешитель имени (name resolver) —
элемент кода, который реализует конкретный метод
преобразования полностью определенного имени узла в
список адресов назначения. Каждый сетевой каталог имеет
список разрешителей имен, которые по очереди
используются для разрешения полностью определенного
имени узла. Разрешителем имени по умолчанию является
протокол обнаружения узлов (Node Discovery Protocol,
NDP).
Программные компоненты сети
Qnet
Для функционирования сети
Qnet наряду с оборудованием требуются следующие программные
компоненты (рис. 12.1):
Рис. 12.1.
Компоненты сети Qnet
Запуск Qnet
Протокол Qnet можно
запустить одним из следующих способов:
или:
Примечание.
Если протокол Qnet работает на локальном компьютере, то
пользователь любого компьютера сети с работающим протоколом
Qnet может просматривать файлы и процессы локального
компьютера при наличии прав доступа к ним. Более подробные
сведения см. в следующих источниках:
-
подразд. "Владение
файлами и права доступа" раздела 6;
-
подразд. "Qnet"
раздела 19;
-
разделе
"Autodiscovery vs static" главы "Transparent Distributed
Processing Using Qnet" в руководстве "Neutrino
Programmer’s Guide".
Создание файла useqnet
Чтобы автоматически
запускать протокол Qnet при загрузке системы, следует войти
в нее как пользователь root и создать пустой файл useqnet следующим образом:
touch
/etc/system/config/useqnet
Если этот файл
существует, сценарий /etc/system/sysinit запускает протокол Qnet при
загрузке компьютера. Чтобы передать протоколу Qnet
какие-либо параметры, следует отредактировать файл sysinit,
изменив следующие его строки:
# Запустить протокол qnet, если пользователь включил
его.
if test -r
/etc/system/config/useqnet -a -d /dev/io-net; then
mount -Tio-pkt lsm-qnet.so
fi
Например, при
работе с ненадежным оборудованием целесообразно включить
проверку циклического избыточного кода пакетов. Для этого
приведенные выше строки необходимо изменить следующим
образом:
# Запустить протокол qnet, если пользователь включил
его.
if test -r
/etc/system/config/useqnet -a -d /dev/io-net; then
mount -Tio-pkt -o
do_crc=1 lsm-qnet.so
fi
Более подробные сведения о том, что происходит при загрузке
системы, см. в разделе 8.
Запуск сетевого администратора,
протоколов и драйверов
Администратор io-pkt* — это процесс, который
выполняет ключевую функцию загрузки набора разделяемых
объектов. Он является основой всего стека протоколов и
обеспечивает передачу данных между модулями. Множество
разделяемых объектов собственной сети QNX Neutrino включает
в себя библиотеку lsm-qnet.so и сетевые драйверы,
например devn-ppc800-ads.so. Разделяемые объекты
организованы в виде иерархии, где вершиной является конечный
пользователь, а нижним уровнем — оборудование.
Предупреждение.
Программа распознавания
устройств автоматически запускает процесс io-pkt* при загрузке компьютера и
загружает драйверы обнаруженных устройств. Можно запустить
несколько экземпляров администратора io-pkt*, однако для этого
необходима специальная настройка. Если требуется запустить
процесс io-pkt* вручную, то сначала следует
завершить работающий процесс io-pkt* с помощью команды slay.
Процесс io-pkt* можно запустить из
командной строки, указав ему, какие драйверы и протоколы
следует загрузить:
$ io-pkt* -del900 -p npm-qnet &
В этом примере
администратор io-pkt-v4 загружает Ethernet-драйвер
devn-el900.so и стек протоколов Qnet.
Модули можно запускать и
останавливать динамически при помощи команд mount и umount следующим образом:
$ io-pkt-v6-hc &
$ mount -Tio-pkt devn-el900.so
$ mount -Tio-pkt lsm-qnet.so
Чтобы выгрузить драйвер,
следует ввести команду:
umount
/dev/io-net/en0
Примечание.
Демонтировать стеки протоколов, такие как TCP/IP и Qnet,
нельзя.
Просмотр сетевого окружения
После запуска протокола Qnet
каталог /net содержит элементы для всех
других узлов локальной подсети, на которых работает протокол
Qnet. Доступ к файлам и процессам, которые расположены на
других компьютерах, можно осуществлять так, как будто эти
файлы и процессы находятся на локальном компьютере (по крайней
мере, в той степени, в которой позволяют права доступа).
Например, чтобы отобразить
содержимое файла, который находится на другом компьютере,
можно воспользоваться утилитой less, указав путь с префиксом /net:
less
/net/alonzo/etc/TIMEZONE
Чтобы считать системную
информацию обо всех удаленных узлах, которые перечислены в
каталоге /net, следует воспользоваться
утилитой pidin с аргументом net:
$ pidin net
Можно вызвать утилиту pidin с параметром -n, чтобы получить информацию о
процессах на другом компьютере:
pidin
-n alonzo | less
Можно даже запустить процесс на другом компьютере, используя
собственную консоль для ввода и вывода, с помощью команды on с параметром -f:
on
-f alonzo date
Заполнение
каталога /net
После загрузки и запуска
Qnet вместе с сетевым драйвером, если приложения на узле не
пытаются взаимодействовать с другими приложениями через Qnte, то каталог /net будет медленно
заполняться остальными узлами по мере получения от них
сведений, отправленных ими в широковещательном режиме.
По умолчанию для этого задан
интервал 30 секунд, и он может изменяться с помощью опции
auto_add=X модуля lsm-qnet.so. Другими словами, через 30
секунд после загрузки каталог /net, возможно, будет заполнен
настолько, насколько это возможно.
Примечание. Для
взаимодействия с удаленным узлом не требуется ждать 30
секунд; приложения могут обращаться через Qnet к удаленным узлам сразу после
инициализации Qnet и сетевого драйвера.
Если существует некоторый
элемент каталога /net, то это значит только то, что Qnet отображает представленное в
ASCII-символах текстовое имя узла на MAC-адрес
Ethernet. Это лишь немного замедляет процесс распознавания
имен, но это позволяет пользователям увидеть, какие еще узлы
доступны в данной сети.
Элементы каталога /net не
удаляются пока кто-либо пытается их использовать, поэтому
они могут быть некорректными.
Например, какой-либо узел
мог загрузиться час назад, проработать одну минуты и
завершить работу. Он будет по-прежнему иметь запись в
каталогах тех узлов Qnet, которые
не взаимодействовали с ним. На тех узлах, которые
взаимодействовали с ним установив соединение, записи будут
удаляться после истечения таймаутов сесий.
Для удаления неправильных
элементов из /net можно воспользоваться командой:
ls
-l /net &
Для полной очистки /net необходимо выполнить команду:
rmdir
/net/*
Устранение неполадок
Для того чтобы собственная
сеть операционной системы QNX Neutrino функционировала, все
программные компоненты протокола Qnet должны корректно
взаимодействовать с оборудованием. Если сеть Qnet не
работает, то при поиске проблем с оборудованием и сетью
можно воспользоваться различными Qnet-утилитами для
получения диагностической информации.
Протокол Qnet создает каталог
/net. Чтобы убедиться в том, что
этот каталог существует, следует воспользоваться командой
$ ls /net
Если каталог /net не содержит ни одного
подкаталога, то протокол Qnet не работает. Этот каталог
должен содержать как минимум один элемент с именем
локального компьютера, которое выводит команда hostname. Если используется привязка
протокола Ethernet, то все остальные доступные компьютеры
также отображаются в каталоге /net. Пример:
joseph/ eileen/
Как было
отмечено ранее, процесс io-pkt* является связующим звеном
между драйверами и протоколами. Чтобы проверить наличие
неполадок в нем, следует воспользоваться командой pidin:
$ pidin -P io-pkt-v4-hc mem
Затем следует выполнить поиск разделяемого объекта протокола
Qnet в полученном выводе:
pid tid name prio
STATE code data stack
118802 1 sbin/io-pkt-v4-hc 21o SIGWAITINFO 876K 672K
4096(516K)*
118802 2 sbin/io-pkt-v4-hc 21o RECEIVE 876K 672K
8192(132K)
118802 3 sbin/io-pkt-v4-hc 21r RECEIVE 876K 672K
4096(132K)
118802 4 sbin/io-pkt-v4-hc 21o RECEIVE 876K 672K
4096(132K)
118802 5 sbin/io-pkt-v4-hc 20o RECEIVE 876K 672K
4096(132K)
118802 6 sbin/io-pkt-v4-hc 10o RECEIVE 876K 672K
4096(132K)
libc.so.2 @b0300000 436K 12K
devnp-shim.so @b8200000 28K 4096
devn-pcnet.so @b8208000 40K 4096
lsm-qnet.so
@b8213000 168K 36K
Если в выводе присутствует
разделяемый объект lsm-qnet.so, то протокол Qnet работает.
Чтобы
определить, работает ли сетевая плата (другими словами,
выполняет ли она прием и передачу пакетов), следует
воспользоваться командой nicinfo. Переменная окружения PATH пользователя root включает в себя каталог, в
котором находится исполняемый файл nicinfo; всем остальным
пользователям необходимо указывать полный путь к этому
файлу:
$ /usr/sbin/nicinfo
Теперь можно извлечь
диагностическую информацию из следующего вывода:
en0:
AMD PCNET-32 Ethernet
Controller
Physical Node ID
...........................000C29 DD3528
Current Physical Node ID
...................000C29 DD3528
Current Operation Rate
.....................10.00 Mb/s
Active Interface Type
......................UTP
Maximum Transmittable data
Unit ............1514
Maximum Receivable data Unit
...............1514
Hardware Interrupt
.........................0x9
I/O Aperture
...............................0x1080 - 0x10ff
Memory Aperture
............................0x0
Promiscuous Mode
...........................Off
Multicast Support
..........................Enabled
Packets Transmitted OK
..................... 588
Bytes Transmitted OK
....................... 103721
Memory Allocation Failures
on Transmit ..... 0
Packets Received OK
........................ 11639
Bytes Received OK
.......................... 934712
Memory Allocation Failures
on Receive ...... 0
Single Collisions on
Transmit ...............0
Deferred Transmits
..........................0
Late Collision on Transmit
errors ...........0
Transmits aborted (excessive
collisions) ....0
Transmit Underruns
..........................0
No Carrier on Transmit
......................0
Receive Alignment errors
....................0
Received packets with CRC
errors ............0
Packets Dropped on receive ..................0
Следует
обратить особое внимание на значения счетчиков Total Packets Txd OK и Total Packets Rxd OK. Если они равны нулю, то,
возможно, драйвер не работает или отсутствует подключение к
сети. Следует проверить запись Current Operation Rate и
убедиться в том, что драйвер корректно автоматически
определил скорость передачи данных.
Диагностическая
информация находится в файле /proc/qnetstats. Если этот файл не
существует, протокол Qnet не работает.
Файл qnetstats содержит много
диагностической информации, которая имеет смысл для
разработчиков, использующих протокол Qnet, но бесполезна
для других пользователей. Тем не менее, можно
воспользоваться утилитой grep, чтобы извлечь
определенные поля из файла /proc/qnetstats:
# cat /proc/qnetstats | grep "compiled"
**** Qnet compiled on Jun 3 2008 at 14:08:23 running on
EAdd3528
Еще один пример:
# cat /proc/qnetstats | grep -e "ok" -e "bad"
txd ok
930
txd
bad 0
rxd ok
2027
rxd
bad dr 0
rxd
bad L4 0
Если для запуска протокола Qnet требуется помощь, отдел
технической поддержки компании QNX Software Systems может
попросить предоставить эту информацию.
Чтобы узнать имя хоста,
следует воспользоваться утилитой hostname. Сеть Qnet работает только в
случае, если имя хоста является уникальным.
Если узлы находятся в разных
доменах, то для доступа к узлу необходимо указывать домен.
Пример:
ls
/net/kenneth.qnx.com