1. Сервер NetWare


Сервер NetWare представляет собой компьютер, на котором программой SERVER.EXE загружена сетевая операционная система. Сервер служит основным средством удовлетворения сетевых запросов пользователей, большинство из которых реализуется ядром ОС по протоколу NCP. Сервер может являться и платформой для запуска серверных приложений - модулей NLM. Количество пользователей, одновременно подключенных к серверу, ограничено его лицензионным параметром, влияющем на цену ОС. В качестве сервера приложений может использоваться ОС NetWare Runtime - однопользовательская сетевая ОС, которая существенно дешевле обычной многопользовательской.
Сервер NetWare-386 спроектирован как многозадачная ОС и рассчитан на динамическое изменение нагрузки на различные предоставляемые ресурсы. Система является адаптивной, ее поведение определяется набором стратегических параметров, определяющих желательные и граничные значения распределяемых ресурсов, и тактических параметров, определяющих скорость и диапазон отработки всплесков нагрузки. Стратегические параметры определяют средние показатели производительности сервера. Корректный выбор тактических параметров особенно важен для необратимо выделяемых ресурсов, которые, будучи однажды выделены, не могут после освобождения возвратиться системе для использования в других целях до перезагрузки сервера. Параметры сервера определяются командами SET, вводимыми с консоли сервера или из .NCF-файлов.

1.1 Распределение памяти

Основным ресурсом платформы сервера является оперативная память. В NetWare-386 ее использование основано на 32-битных регистрах, позволяющих адресовать до 4 Гбайт в одном непрерывном сегменте. Объем реально устанавливаемой памяти ограничивается возможностями системной платы и разрядностью контроллеров DMA и Bus-Master дисковых (и, возможно, сетевых) адаптеров. При установке памяти свыше 16 Мбайт обычно требуется выполнение команды REGISTER MEMORY beg size из файла AUTOEXEC.NCF сразу же после задания номера внутренней сети. Здесь beg и size - шестнадцатеричные значения начала (обычно 1000000) и размера области памяти свыше 16 Мбайт.

В системах с шиной EISA автоматическая регистрация памяти выше 16 Мбайт разрешается командой
SET AUTO REGISTER MEMORY ABOVE 16 MEGABYTES = ON (OFF) в файле STARTUP.NCF.

Логически память организована в виде пулов и выделяется для различных нужд динамически, по мере необходимости и возможности. Параметры, регулирующие выделение памяти, рекомендуется изменять не ранее, чем через 15 минут функционирования сервера при рабочей нагрузке. Распределение памяти в NetWare 3.x и 4.x существенно различается.
В NetWare 3.x память разделяется на три пула:

Главным пулом (первичным сегментом памяти) является пул кэш-буферов файлов, используемых при чтении и записи.

Из этого сегмента память выделяется в пулы постоянной и кратковременной памяти безвозвратно до перезагрузки сервера.

Размер пула в установившемся режиме должен составлять не менее 20% от общего объема памяти, рекомендуется 40-60%.
Кэш-буфер файлов имеет подпулы динамического и статического кэша.
Динамический кэш является подпулом, используемым для внутренних системных таблиц с изменяющимся размером (хеш-таблиц, таблиц размещения файлов и каталогов). Подпул нефрагментируемый, расширяемый. Освободившаяся область может возвращаться в кэш-буфер файлов непрерывными блоками.
Статический кэш - фрагментируемый, расширяемый подпул, используемый для загрузки NLM. Освободившаяся область может возвращаться в кэш-буфер файлов несмежными блоками.

Частая загрузка и выгрузка модулей может приводить к фрагментации памяти и невозможности удовлетворения запроса на непрерывную область памяти.

Пул постоянной памяти выделяется для долговременного использования коммуникационными буферами и кэш-буферами каталогов.
Подпул полупостоянной памяти используется дисковыми и сетевыми драйверами и может возвращаться в постоянную память.

Пул кратковременно выделяемой памяти (Alloc Short Term Memory) используется планами драйвов (drive maps), таблицами SAP, RIP, управления очередями, соединений пользователей. Неиспользуемая память остается в пуле для повторного применения.

Максимальный размер пула кратковременно выделяемой памяти (только в NetWare 3.x) задается командой
SET MAXIMUM ALLOC SHORT TERM MEMORY = 8388608 (50000-33554432 байт).

В NetWare 4.x память разделяется на пять пулов:
Пул выделенных блоков (allocated blocks pool) - область буферов размером 4 Кбайт, выделенных из пула кэш-буферов для загрузки NLM. Освободившиеся блоки возвращаются обратно в пул кэш-буферов.
Пул кэш-буферов (cache buffers pool) - в него собирается вся свободная память сервера. Используется для кэширования чтения и записи файлов, из него память обратимо выделяется в пул выделенных блоков.
Пул перемещаемой кэш-памяти (cache movable memory pool) - память для внутренних системных таблиц с изменяющимся размером (хеш-таблиц, таблиц размещения файлов и каталогов).
Пул фиксированной кэш-памяти (cache non-movable memory pool) - небольшая область для хранения системной информации и работы компрессора файлов.
Операционная система (operating system) - 3-4 Мбайт памяти для кода и данных ОС (Code and Data Memory).

Управление проверкой повреждений памяти при выделении блоков:
SET ALLOC MEMORY CHECK FLAG=OFF (ON)

В NetWare 4.x решена проблема фрагментации памяти. Для этого периодически запускается процесс "сборки мусора" (garbage collection), который при наличии достаточного количества и объема освободившихся блоков производит дефрагменацию памяти пула кэш-буферов, собирая всю свободную память в одну непрерывную область.

Управление процессом сборки мусора (доступно и из STARTUP.NCF)
SET GARBAGE COLLECTION INTERVAL=15 (1-60 минут) - периодичность инициирования "сборки мусора"
SET NUMBER OF FREES FOR GARBAGE COLLECTION=5000 (100-100000) - количество освободившихся областей, при которых запускается сборка мусора
SET MINIMUM FREE MEMORY FOR GARBAGE COLLECTION=8000 (1000-1000000) - суммарный объем освободившихся областей, при которых запускается сборка мусора

Процессор сервера работает в защищенном режиме, что, однако, не гарантирует устойчивости работы системы при неполадках в отдельных модулях, поскольку и они, и само ядро ОС NetWare работают в нулевом кольце защиты памяти (аппаратный супервизор процессора 80386 и старше), чем объясняется высокая скорость их работы. При этом защиты памяти как таковой нет, и любой модуль может обращаться ко всему объему памяти даже по записи, что может приводить к краху системы. В других ОС защищенного режима пользовательские задачи работают в кольце 3 - медленно, но надежно.
В NetWare 4.x по умолчанию все модули так же загружаются в нулевое кольцо,но существует возможность создания "карантинной зоны" для загрузки модулей, которые подозреваются в залезании в чужие области памяти. Такая зона создается загрузкой модуля DOMAIN.NLM. Этот модуль помещается в каталог DOS и может запускаться раньше всех из первой строки файла STARTUP.NCF, разделяя память на два домена: "OS"- привелигированный домен (кольцо 0), служащий для загрузки ядра ОС и "верных" модулей, "OS_PROTECTED" - защищенный (точнее, изолированный) домен кольца 3. Загрузка модулей происходит в текущий домен, по умолчанию - "OS". Смена текущего домена для загрузчика выполняется командами

DOMAIN=OS_PROTECTED и DOMAIN=OS

Просмотр содержимого доменов обеспечивает команда DOMAIN, при этом первым выводится список модулей, загруженнных в текущий домен.

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

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



1.2 Использование процессора

Все загруженные модули системы используют процессор в режиме разделения времени с задачами ОС.

Величина кванта времени, отводимого процессу загружаемого модуля в NetWare 3.x задается командой
SET PSEUDO PREEMPTION TIME = 2000 (1000 - 10000 интервалов по 0.84 мкс).
Для проверки новых NLM полезно разрешать сообщения о модулях, не отдававших управление другим процессам более 4 мс, командой
SET DISPLAY RELINQUISH CONTROL ALERTS = ON, по умолчанию OFF, доступной и из STARTUP.NCF.

В NetWare 4.x возможно предотвращение монопольной работы потока путем ограничения количества выполняемых запросов чтения-записи диска за один квант времени.

В NetWare 4.x принудительное переключение потоков управляется командами:
SET GLOBAL PSEUDO PREEMPTION=OFF (ON) - разрешение принудительного переключения потоков после заданного количества операций чтения-записи файла.
SET PSEUDO PREEMPTION COUNT=10 (1-4294967295) - количество операций чтения-записи, после которого производится принудительное переключение потоков (если оно разрешено)

Каждый приходящий к серверу запрос обслуживается сервисным процессом, который принимает его из буфера приема пакетов, передает ядру ОС, и отправляет пакеты с полученным ответом источнику запроса. Число одновременно работающих сервисных процессов зависит от нагрузки на сервер.

Максимальное число сервисных процессов в системе задается командой
SET MAXIMUM SERVICE PROCESSES = 20 (5 - 40), по умолчанию 20. В NetWare 4.x по умолчанию 40, допустимо 100
Время задержки выделения системой нового сервисного процесса задается командой
SET NEW SERVICE PROCESS WAIT TIME = 2.2 (0.3-20 с).

В NetWare 4.x выполняемые задачи имеют различные приоритеты. Высший приоритет (1) имеют прерывания (Interrupt events) - задачи, которые не могут ждать. Они выполняются в моменты переключения потоков - задач, имеющих меньшие приоритеты.
В NetWare 4.x рабочие потоки (Work threads) имеют приоритет 2, просто потоки (Threads) имеют приоритет 3, низкоприоритетные потоки (Low priority threads) - 4.

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

SET MAXIMUM INTERRUPT EVENTS=10 (1-100000) - максимальное количество прерываний (задач с высшим приоритетом), выполняемых в процессе переключения потоков
SET WORKER THREAD EXECUTE IN A ROW COUNT=10 (1-20)- количество рабочих потоков (задач со вторым приоритетом), которое может быть запущено до запуска обычного потока (задачи с третьим приоритетом)
SET UPGRADE LOW PRIORITY THREADS=OFF (ON) - разрешение повышения приоритета низкоприоритетных
потоков (задач с четвертым приоритетом) до уровня обычного потока (3)

В пределах одного класса потоков возможно изменение (понижение относительно умолчания) приоритета любого процесса за счет изменения задержки планировщика (Scheduler delay), которая по умолчанию нулевая у всех процессов. Этим можно сдерживать "монопольные наклонности" некоторых модулей.
Изменение задержки планировщика возможно из меню Sheduling Information утилиты MONITOR или консольной командой

LOAD SCHDELAY [proc_name [=n]]

proc_name - имя интересующего процесса (ALL PROCESSES - все процессы), n - его задержка (четное число). Команда, введенная без параметров, выводит список процессов и их задержек.


Вопросы и ответы (глава 1) | Глава 2 | Содержание

Михаил Гук (Mgook@stu.neva.ru, Сайт автора)

Используются технологии uCoz