SharePoint Server 2013 - Перезапуск пулов IIS и прогревочный скрипт

imageВ разных источниках информации о веб-сервере IIS можно встретить рекомендации касающиеся выполнения периодических перезапусков пулов приложений - Application Pools Recycling. Очевидно, что это имеет непосредственное отношение и к пулам приложений IIS, используемых в SharePoint Server 2013. Как я понял, большинство пулов, связанных с SharePoint, уже настроены на автоматический перезапуск (в основном раз в сутки в ночное время).

Это можно увидеть, если открыть свойства Recycling любого из пулов

image

Например, пул приложений, отвечающий за сайт Центра администрирования SharePoint, у меня уже настроен на автоматический перезапуск ежедневно в 02:11, хотя специально такой настройки я не производил.  

image

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

Чтобы решить эту проблему, можно создать так называемый “прогревочный” (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"

image

image

 

Какой из двух представленных вариантов warm-up скрипта наиболее праведный, мне судить сложно, но в силу своей простоты, второй мне кажется более интересным. К тому же, есть информация о том, что при использовании Get-SPSite желательно выполнять в конце Dispose(), чтобы не провоцировать утечку ресурсов сервера.

Если вы будете использовать второй вариант, и вам не нужен “прогрев” сайта администрирования SharePoint, то из второй команды достаточно убрать ключ -IncludeCentralAdministration

PS: Нашёл тут ещё информацию о том, что начиная с IIS 8 есть некая встроенная фича Application Initialization, но, как я понял, её имеет смысл использовать для приложений, которые по определению работают с большим количеством перезапусков.

Всего комментариев: 6 Комментировать

  1. Pavlikov Eugene /

    Использую spbestwarmup.codeplex.com
    Он куда "умнее" прогревает.
    Я еще для себя внес правки для прогрева PWA.

    1. Алексей Максимов / Автор записи

      Круто намешано :)

  2. Сергей /

    Сколько по времени происходит перезапуск пула? Хочу понять на какое минимальное время выставлять шедулер.

    1. Алексей Максимов / Автор записи

      Обычно перезапуск пулов происходит быстро. Чтобы точно понять, какое время уходит на перезапуск, нужно либо колупаться в логах на предмет поиска событий ресайкла пула, либо вручную самому перезапустить пул и оценить время выполнения. Вот простой пример PS-кода для ресайкла пула с помощью Restart-WebAppPool:

      Import-Module WebAdministration
      Add-PSSnapin "Microsoft.SharePoint.PowerShell"
      $app = Get-SPWebApplication http://site.holding.com/
      $poolName = $app.ApplicationPool.Name
      Restart-WebAppPool $poolName
      1. Сергей /

        Померил. 2-3 секунды вышло.

  3. Алексей Максимов / Автор записи

    Проверена работа Варианта #2 на SharePoint Server 2016/2019

Добавить комментарий