[Примечание редактора: диаграммы, используемые в этой статье, изначально опубликованы в руководстве IBM Redbook Разработка и перенос приложений С и С++ на AIX. .]
Платформа IBM AIX управляет памятью не так, как другие платформы, на которых работает Lotus Domino. AIX использует сегментную архитектуру, у которой есть свои плюсы и минусы. Основное преимущество - это увеличение быстродействия. Среди недостатков - то, что 32-разрядные программы должны поддерживать сегментную архитектуру для использования всех возможностей 32-разрядной адресации. В данной статье описаны возможные варианты распределения сегментов для 32-разрядного приложения на платформе AIX, а также рассказано о распределении, которое в настоящее время используется в Lotus Domino. Показано, что происходит с распределением сегментов, если использовать различные опции Domino для работы с памятью.
Эта статья предназначена для опытных системных администраторов Lotus Domino, работающих с платформой AIX.
По умолчанию 32-разрядное виртуальное адресное пространство в AIX состоит из 16 сегментов, по 256 МБ в каждом. Для любого приложения, которое использует распределение сегментов по умолчанию, виртуальное адресное пространство выглядит так, как показано на рисунке 1:
- Первый сегмент (0х0) используется для текста и данных ядра
- Второй сегмент (0х1) используется для текста пользователя.
- Третий сегмент (0х2) используется для стека и данных пользователя.
- Сегменты с четвертого по тринадцатый (от 0х3 до 0хС) доступны для процесса пользователя, если вызваны функции shmat() или mmap().
- Четырнадцатый сегмент (0xD) зарезервирован для текста общих библиотек.
- Пятнадцатый сегмент (0xE) доступен для процесса пользователя.
- Последний сегмент (0xF) используется для предварительной обработки данных общих библиотек.
Для тех, кто не знаком с терминами, использованными на рисунке 1, приведем пояснения:
- Текст. Исполняемый код, доступный только для чтения и выполнения. Он может быть одним из трех типов: код ядра, код пользователя и код общих библиотек.
- Данные. Пространство для чтения/записи данных, которое может быть одним из трех типов: данные ядра, данные пользователя и данные общих библиотек.
Примечание: Shmat() и mmap() используются в Lotus Domino для доступа к общей памяти.
Рисунок 1. Пример виртуального адресного пространства
Программы, которые используют модель большой памяти AIX (large memory model), имеют следующее распределение памяти, показанное на рисунке 2:
- Первый сегмент (0x0) используется для текста и данных ядра
- Второй сегмент (0х1) используется для текста пользователя.
- Третий сегмент (0х2) используется для стека пользователя и данных.
- Сегменты с четвертого по седьмой (0x3 до 0x6) зарезервированы динамической памятью процесса.
- Сегменты с восьмого по тринадцатый (0x7 до 0xC) доступны для процесса пользователя, если вызваны shmat() или mmap().
- Четырнадцатый сегмент (0xD) зарезервирован для общих библиотек.
- Пятнадцатый сегмент (0xE) доступен для процесса пользователя.
- Последний сегмент (0xF) используется для предварительной обработки данных общих библиотек.
Текущая версия Lotus Domino использует модель большой памяти AIX.
Рисунок 2. Модель большой памяти AIX
В AIX 5L версии 5.2 и более поздних имеется модель очень большой памяти (very large memory model). Эта модель, которую мы надеемся использовать в будущем с Lotus Domino, сейчас не используется. Эта модель имеет три формы: первая форма для программ, которые имеют динамическую память процесса (данные пользователя) меньше 2,5 ГБ и больше 256 МБ (см. рисунок 3). Эта модель выглядит похоже на распределение сегментов в AIX по умолчанию, но сегменты с четвертого по восьмой (0x3 по 0x7) доступны для динамической памяти пользователя (heap), если используется динамическое распределение сегментов (dynamic segment allocation - DSA). Также сегменты с 0xA по 0xE доступны для процесса пользователя, если вызваны shmat() или mmap() при помощи динамического распределения сегментов.
Рисунок 3. Модель очень большой памяти AIX: первая форма.
Вторая форма модели очень большой памяти предназначена для программ, у которых динамическая память (heap) процесса больше, чем 2,5 ГБ, как показано на рисунке 4, в котором:
- Первый сегмент (0x0) зарезервирован для текста и данных ядра.
- Второй сегмент (0х1) зарезервирован для текста пользователя.
- Третий сегмент (0x2) используется для стека пользователя. Однако общие библиотеки и данные также используются в этом сегменте (0x2).
- Сегменты с четвертого по шестнадцатый (0x3 по 0xF) доступны для динамической памяти пользователя (heap), если используется динамическое распределение сегментов.
- Сегменты с 0xB по 0xF доступны для процесса пользователя, если вызваны shmat() или mmap() при помощи динамического распределения сегментов.
Рисунок 4. Модель очень большой памяти AIX: вторая форма.
Третья форма предназначена для программ, у которых динамическая память процесса (heap) меньше, чем 256 МБ (см. рисунок 5). В этой форме:
- Первый сегмент (0x0) используется для текста и ядра данных.
- Второй сегмент (0х1) используется для текста пользователя.
- Третий сегмент (0x2) используется для стека и данных пользователя. Однако общие библиотеки и данные также могут храниться в этом сегменте.
- Остальные сегменты (0x3 по 0xF) доступны для процесса пользователя, если вызваны shmat() или mmap() при помощи динамического распределения сегментов.
Рисунок 5. Модель очень большой памяти AIX: третья форма.
Опции управления памятью Lotus Domino
Теперь, когда у вас есть общее представление о моделях памяти AIX, давайте рассмотрим модель, которую использует Lotus Domino, и узнаем, как опции управления памятью Domino изменяют виртуальное адресное пространство.
В оставшейся части статьи мы расскажем, как изменять разметку сегментов с помощью настроек конфигурации сервера Domino в файле Notes.ini. Перед тем как вы продолжите, прочитайте термины, которые помогут вам лучше понять таблицы.
- Название программы. Пример типового приложения Domino.
- Текст и данные ядра. Общая память.
- Текст пользователя. Общая память для всех программ с одним и тем же исполняемым файлом (например, три задачи обновления используют один участок памяти, общий для всех трех задач).
- Стек пользователя. Это сегмент уникален для каждого процесса.
- Динамическая память процесса. Этот сегмент уникален для каждого процесса.
- Общая память. Этот сегмент общий для всех процессов Domino.
- Текст общей библиотеки. Этот сегмент общий для всех процессов в системе.
- Недоступный сегмент. Пока этот сегмент не используется в Lotus Domino.
- Данные общей библиотеки. Этот сегмент уникален для каждого процесса.
- Не-Domino. . Этот общий сегмент, который используется независимыми приложениями.
Общие данные программы, доступные для всех приложений Domino, начинаются с 256 МБ и растут сегментами по 256 МБ до тех пор, пока не будет достигнуто максимальное число свободных сегментов.
Первая таблица показывает результаты без использования настроек памяти в Domino.
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 512 МБ | Общая память 2 ГБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | |||||
| 256 МБ | 512 МБ | 2048 МБ | 0 МБ | |||||
Ниже приведено распределение общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 750 МБ
- Другая общая память Domino = 1250 МБ
Изменение настроек ConstrainedSHMSizeMB
Параметр ConstrainedSHMSizeMB из файла Notes.ini сервера Dominoограничивает общую память. Эти параметры настройки можно использовать двумя способами. Если ConstrainedSHMSizeMB=1, тогда общая память ограничена размером по умолчанию. В AIX этот размер составляет 2,25 ГБ. Кроме того, для этого параметра настройки можно указать размер в мегабайтах, что мы и сделали в данной статье для демонстрации. Например, если вы выставите такой параметр настройки:
ConstrainedSHMSizeMB = 1744
то получите результаты, приведенные в таблице.
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 512 МБ | Общая память 1.744 ГБ | Не-Domino 256 МБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 и 5 | 6 по 12 | 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 и 5 | 6 по 12 | 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 и 5 | 6 по 12 | 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 и 5 | 6 по 12 | 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | ||||||
| 256 МБ | 512 МБ | 1744 МБ | 256 МБ | ||||||
Такова схема распределения общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 654 МБ
- Другая общая память Domino = 1099 МБ
Если вы задали в файле Notes.ini конфигурацию ConstrainedSHMSizeMB= 1744 и установили значение 3 для dataseg (количество используемых сегментов данных), то получите следующие результаты:
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 768 МБ | Не-Domino 1.744 ГБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 по 6 | 7 по 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 по 6 | 7 по 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 по 6 | 7 по 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 по 6 | 7 по 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | |||||
| 256 МБ | 768 МБ | 1744 МБ | 0 МБ | |||||
Ниже приведена схема распределения общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 654 МБ
- Другая общая память Domino = 1099 МБ
В следующей таблице ConstrainedSHMSizeMB равен 1024.
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 512 МБ | Общая память 1024 МБ | Не-Domino 1024 МБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 и 5 | 6 по 9 | 10 по 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 и 5 | 6 по 9 | 10 по 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 и 5 | 6 по 9 | 10 по 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 и 5 | 6 по 9 | 10 по 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | ||||||
| 256 МБ | 512 МБ | 1024 МБ | 1024 МБ | ||||||
Ниже приведена схема распределения общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 384 МБ
- Другая общая память Domino = 640 МБ
Изменение настроек PercentAvailSysResources
Параметр PercentAvailSysResources из файла Notes.ini сервера Domino позволяет управлять распределением памяти на своем сервере. Допустимые значения для настройки лежат в диапазоне от 2 до 100 процентов. В следующей таблице PercentAvailSysResources установлено на 25 % для системы с 4 ГБ памяти. Другими словами, 1 ГБ памяти был выделен под сервер Domino.
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 512 МБ | Общая память 2048 МБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | |||||
| 256 МБ | 512 МБ | 2028 МБ | 0 МБ | |||||
Ниже приведена схема распределения общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 384 МБ
- Другая общая память Domino = 1664 МБ
В этой конфигурации в настройках буферного пула NSF используется 3/8* (ОЗУ * ,25). Не определено ограничение для увеличения совместно используемой памяти Domino, кроме ограничений на сегменты, задаваемых операционной системой.
Следующая таблица покажет результаты настроек NSF_BUFFER_POOL_SIZE_MB = 512 и PercentAvailSysResources=25 в файле Notes.ini.
| Название программы | Текст/данные ядра 256 МБ | Текст пользователя 256 МБ | Стек пользователя 256 МБ | Динамическая память процесса (heap) 512 МБ | Общая память 2048 МБ | Текст общих библиотек | Недоступный сегмент | Данные общих библиотек |
|---|---|---|---|---|---|---|---|---|
| Сервер | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| HTTP | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обновления | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| N/A | 1 | 2 | 3 | 4 и 5 | 6 по 13 | 14 | 15 | 16 |
| Обработка стека | Обработка пользовательских данных | Общая память Domino | Использование общей памяти сторонним API | |||||
| 256 МБ | 512 МБ | 2028 МБ | 0 МБ | |||||
Ниже приведена схема распределения общей памяти:
- Буферный пул NSF (UBM=3/8 shm) = 512 МБ
- Другая общая память Domino = 1536 МБ
В этой конфигурации параметры настройки буферного пула NSF заданы явным образом, и параметр PercentAvailSysResources игнорируется. Не определено ограничение для увеличения общей памяти Domino, кроме ограничений на сегменты, задаваемых операционной системой.
Мы не советуем вам использовать параметр ConstrainedSHMSizeMB. В используемый в данный момент модели большой памяти AIX ConstrainedSHMSizeMB следует использовать только для поддержки приложений сторонних разработчиков, которым необходима общая память. Если вы используете эту настройку, то Lotus Domino получает меньше виртуального адресного пространства для работы. Это отличается от других платформ, на которых работает Domino. На других платформах, при использовании ConstrainedSHMSizeMB для сокращения общей памяти автоматически увеличивается пространство для данных приложения.
Для демонстрации приведем пример: На сервере Domino запущен сильно загруженный сервер Lotus Domino Web Access HTTP, которому необходимо 1024 МБ пространства для данных. В AIX установим dataseg –f 4* в программном каталоге Domino, чтобы разрешить всем программным файлам Domino использовать четыре сегмента собственной памяти. На других платформах необходимо использовать размер виртуального адресного пространства, заданный операционной системой. Затем вычитаем пространство, используемое текстом программы и текстом общих библиотек. Таким образом мы получаем размер виртуального пространства данных, доступного для Lotus Domino. В этом примере мы вычитаем 1024 МБ из виртуального пространства данных, доступного для Lotus Domino и используем это значение для установки значения ConstrainedSHMSizeMB.
Научиться
- Оригинал статьи
"Lotus Domino on AIX memory usage explained" (EN).
- Статьи developerWorks Lotus "Спросите профессора INI: Управление распределением памяти посредством переменных NOTES.INI" (EN).
- Статьи developerWorks Lotus "Спросите профессора INI: Больше об управлении памятью и другие вопросы" (EN).
Получить продукты и технологии
-
Загрузите пробную версию Lotus Notes 7 с сайта developerWorks.
-
Загрузите пробную версию Lotus Domino 7 с сайта developerWorks.
Обсудить
- Примите участие в обсуждении материала на форуме.
-
Примите участие в блогах developerWorks.
В 1994 г. Эдди Белл (Eddy Bell) ушел из Sun Microsystems, где он работал над эмуляцией на ПК продуктов 386i, SunPC и WABI, и перешел на Lotus. Эдди был архитектором/руководителем проекта Lotus по переносу Lotus Notes/Domino с платформы Windows на UNIX. В настоящее время он является архитектором сервисов Lotus Domino, связанных с различными платформами и ОС .