Ограничение памяти сервера
Статья описывает, как ограничить объём памяти, который занимает сервер ТехноДок. Ограничение нужно, когда памяти на сервере мало или на том же сервере работают другие программы. По умолчанию память сервера не ограничена.
Память ограничивают на одном из двух уровней:
- Среда выполнения — ограничена память под данные, с которыми работает сервер. Когда она исчерпана, операции, которым не хватило памяти, завершаются ошибкой, при этом процесс сервера продолжает работать. Способ доступен в Linux и в Windows.
- Операционная система — ограничена вся память процесса сервера. Когда она исчерпана, операционная система завершает процесс сервера, и служба запускает его заново. Способ доступен в Linux. В Windows встроенной возможности ограничить память службы нет.
Ограничение на уровне среды выполнения
Предел на уровне среды выполнения задаёт ключ System.GC.HeapHardLimit. Значение ключа — наибольший объём памяти под данные сервера в байтах. Память под служебные нужды среды выполнения в предел не входит, поэтому процесс сервера занимает больше памяти, чем задано в ключе.
Чтобы задать предел:
- Остановите сервер ТехноДок.
- Откройте файл
bin/Sms.TechnoDoc.runtimeconfig.jsonи добавьте ключSystem.GC.HeapHardLimitв секциюconfigPropertiesвнутри секцииruntimeOptions. - Запустите сервер ТехноДок.
Пример секции с пределом 2 ГБ:
"configProperties": {
"System.GC.DynamicAdaptationMode": 1,
"System.GC.Server": true,
"System.GC.HeapHardLimit": 2147483648,
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
Вместо предела в байтах можно задать ключ System.GC.HeapHardLimitPercent — предел в процентах от физической памяти сервера. Если заданы оба ключа, действует System.GC.HeapHardLimit.
Пример строки для предела в половину физической памяти:
"System.GC.HeapHardLimitPercent": 50
При обновлении ТехноДок файл заменяется файлом новой версии. После обновления задайте предел заново.
Ограничение на уровне операционной системы
Предел на уровне операционной системы в Linux задаёт параметр MemoryMax службы technodoc. Операционная система не даёт серверу занять больше заданного объёма памяти. Среда выполнения учитывает этот предел: если ключ System.GC.HeapHardLimit не задан, память под данные сервера занимает не больше 75% от него.
Когда предел достигнут, операционная система завершает процесс сервера. Служба technodoc запускает сервер заново, а операции, которые выполнялись в этот момент, прерываются.
Чтобы задать предел:
- Откройте файл службы
/etc/systemd/system/technodoc.serviceи добавьте в секцию[Service]строку с пределом. Остальные строки файла не изменяйте. - Примените изменения и перезапустите службу:
sudo systemctl daemon-reload && sudo systemctl restart technodoc
Пример секции с пределом 2 ГБ:
[Service]
MemoryMax=2G
Скрипт create.sh создаёт файл службы без параметра MemoryMax. Если службу удалили и создали заново, добавьте параметр снова.