В разных источниках информации о веб-сервере IIS можно встретить рекомендации касающиеся выполнения периодических перезапусков пулов приложений - Application Pools Recycling. Очевидно, что это имеет непосредственное отношение и к пулам приложений IIS, используемых в SharePoint Server 2013. Как я понял, большинство пулов, связанных с SharePoint, уже настроены на автоматический перезапуск (в основном раз в сутки в ночное время).
Это можно увидеть, если открыть свойства Recycling любого из пулов
Например, пул приложений, отвечающий за сайт Центра администрирования SharePoint, у меня уже настроен на автоматический перезапуск ежедневно в 02:11, хотя специально такой настройки я не производил.
Следовательно, по утрам возникает ситуация, когда первый пользователь, обратившийся к веб-узлу, пул которого перезапускался ночью, может получить задержку открытия веб-страниц.
Чтобы решить эту проблему, можно создать так называемый “прогревочный” (warm-up) скрипт, который будет выполняться после перезапусков пулов IIS. Задача у такого скрипта одна – выполнить простейший запрос ко всем используемым веб-узлам SharePoint, заставив тем самым IIS выполнить запуск соответствующих экземпляров приложений с последующим рендерингом страниц возвращаемых по запросу. На глаза попались два варианта подобных скриптов:
Вариант #1. Источник: TechDays.ru - ИТ-Альманах. (Lync\Exchange\SharePoint) Выпуск 1
Add-PSSnapin Microsoft.SharePoint.PowerShell $wc = New-Object net.WebClient $wc.Credentials = [System.Net.CredentialCache]::DefaultCredentials Get-SPSite | ForEach {$wc.DownloadString($_.url)} $caUrl = "http://sharepoint:8000" # URL центра администрирования $wc.DownloadString($caUrl)
Вариант #2. Источник: Todd Klindt's SharePoint Admin Blog - Using PowerShell to warm up SharePoint 2013
Add-PSSnapin Microsoft.SharePoint.PowerShell Get-SPWebApplication -IncludeCentralAdministration | ForEach-Object { Invoke-WebRequest $_.url -UseDefaultCredentials -UseBasicParsing }
Такой скрипт нужно выполнять после регламентных периодических перезапусков пулов и перед началом активности пользователей, чтобы свести к минимуму ситуации с долгим открытием страниц у первых пользователей. Для этого сохраним его на WFE-сервере, например с именем SP2013-Warm-Up.ps1, и создадим в планировщике заданий Windows периодическое задание, которое будет выполняться например каждое утро в 06:30 от имени учётной записи фермы с командой запуска:
powershell.exe -NoProfile -command "C:\Tools\ScheduledScripts\SP2013-Warm-Up.ps1"
Какой из двух представленных вариантов warm-up скрипта наиболее праведный, мне судить сложно, но в силу своей простоты, второй мне кажется более интересным. К тому же, есть информация о том, что при использовании Get-SPSite желательно выполнять в конце Dispose(), чтобы не провоцировать утечку ресурсов сервера.
Если вы будете использовать второй вариант, и вам не нужен “прогрев” сайта администрирования SharePoint, то из второй команды достаточно убрать ключ -IncludeCentralAdministration.
PS: Нашёл тут ещё информацию о том, что начиная с IIS 8 есть некая встроенная фича Application Initialization, но, как я понял, её имеет смысл использовать для приложений, которые по определению работают с большим количеством перезапусков.
Использую spbestwarmup.codeplex.com
Он куда "умнее" прогревает.
Я еще для себя внес правки для прогрева PWA.
Круто намешано :)
Сколько по времени происходит перезапуск пула? Хочу понять на какое минимальное время выставлять шедулер.
Обычно перезапуск пулов происходит быстро. Чтобы точно понять, какое время уходит на перезапуск, нужно либо колупаться в логах на предмет поиска событий ресайкла пула, либо вручную самому перезапустить пул и оценить время выполнения. Вот простой пример PS-кода для ресайкла пула с помощью Restart-WebAppPool:
Померил. 2-3 секунды вышло.
Проверена работа Варианта #2 на SharePoint Server 2016/2019