Ms sql server как разделить tempdb на несколько файлов
Этот блог http : //blogs.msdn.com/sqlserverstorageengine/archive/2009/01/04/managing-tempdb-in-sql-server-tempdb-configuration.aspx заявляет, что "Распространение TempDB на по крайней мере столько же файлов одинакового размера, сколько CORE или процессоров ».
Итак, мой основной вопрос заключается в том, как мне на самом деле настроить мой SQL-сервер для этого. Итак, я щелкаю правой кнопкой мыши базу данных tempdb, выбираю свойства, файлы и затем добавляю файл для каждого процессора? Как он узнает, что он должен распространять базу данных tempdb по этим файлам? есть ли флаг, который я должен установить?
Я неправильно понял статью?
2 ответа
Этот совет лучше всего, если вы можете распределять дополнительные файлы TempDB по разным жестким дискам. В противном случае разные потоки, которые создают разные временные таблицы, будут конкурировать за один и тот же физический диск.
Вы действительно можете делать именно то, что говорите, и работа будет автоматически распределяться по файлам данных TempDB. Это также можно записать как таковой:
Чтобы получить три дополнительных файла (т. е. 4 ядра ЦП и 4 физических диска).
Спасибо, Джесси. Так что, я полагаю, я также могу выполнить эту инструкцию alter через графический интерфейс. Это то же самое для каждого файла db. Если я добавлю дополнительный файл в другую базу данных, SQL-сервер автоматически распределяет нагрузку по этим файлам? Я так понимаю, да. Конечно, если вы сделаете это для большего количества процессоров / дисков, чем у вас есть, отдача несколько уменьшится. Это определенно одна из тех ситуаций, в которых ваш пробег может отличаться. Измеряйте свою эффективность как можно раньше и чаще! Нет - файлы журналов не следует добавлять, а дополнительные файлы данных tempdb могут оказаться полезными, даже если они не могут находиться на отдельных дисках. Процитирую Пола Рэндала: «Если все, что вы видите, это конкуренция PAGELATCH_XX, отдельное хранилище не имеет значения, поскольку конкуренция происходит на страницах в памяти. Для PAGEIOLATCH_XX ожидания вам, скорее всего, придется использовать отдельное хранилище, но не обязательно - оно может оказаться, что вам нужно переместить саму базу данных tempdb в другое хранилище из других баз данных, а не просто добавлять дополнительные файлы данных базы данных tempdb. Для выбора правильного пути потребуется анализ того, что там хранится. " Кроме того, вам не нужно разбивать на 3 задачи ALTER DATABASE tempdb ДОБАВИТЬ ФАЙЛ (NAME = tempdev2, FILENAME = 'W: \ tempdb2.mdf', SIZE = 256), (NAME = tempdev3, FILENAME = 'X: \ tempdb3 .mdf ', SIZE = 256), (NAME = tempdev4, FILENAME =' Y: \ tempdb4.mdf ', SIZE = 256); ИДТИ Итак, многие из этих советов уже устарели. Если ваша система действительно записывает то, что находится в TempDB, на физический носитель, у вас есть более серьезная проблема. Этот материал никогда не сохраняется на диске - единственный раз, когда вы полностью исчерпали буферный пул. Однако у вас должно быть 4 файла подходящего (одинакового) размера, чтобы иметь дело с очень странным низкоуровневым защелкиванием при распределении пространства.Я знаю, что это уже довольно поздно, но совет создавать по одному файлу для каждого процессора на самом деле является мифом, который Пол Рэндал развенчивает в своем блоге:
Основной совет из статьи: If you have > 8 cores, use 8 files and if you're seeing in-memory contention, add 4 more files at a time.
Системная база данных tempdb — это глобальный ресурс, доступный всем пользователям, подключенным к экземпляру SQL Server или Базе данных SQL Azure. tempdb содержит:
Временные пользовательские объекты, созданные явно. К ним относятся глобальные или локальные временные таблицы и индексы, временные хранимые процедуры, табличные переменные, возвращаемые функциями с табличными значениями таблицы и курсоры.
Внутренние объекты, создаваемые ядром СУБД. К ним относятся следующие:
- Рабочие таблицы, хранящие промежуточные результаты буферов, курсоры, сортировки и временное хранилище больших объектов (LOB).
- рабочие файлы для операций хэш-соединения или статистических хэш-выражений;
- промежуточные результаты сортировки для таких операций, как создание или перестроение индексов (если указать SORT_IN_TEMPDB ), либо определенных запросов GROUP BY , ORDER BY или UNION .
Отдельные базы данных и эластичные пулы Базы данных SQL Azure поддерживают глобальные временные таблицы и глобальные временные хранимые процедуры, которые хранятся в tempdb и имеют область действия на уровне базы данных.
Глобальные временные таблицы и глобальные временные хранимые процедуры являются общими для всех сеансов пользователей в рамках одной базы данных SQL. Сеансы пользователей, связанные с другими базами данных SQL, не имеют доступа к глобальным временным таблицам. Дополнительные сведения см. в разделе Глобальные временные таблицы (база данных SQL Azure) в области базы данных. Управляемый экземпляр SQL Azure поддерживает те же временные объекты, что и SQL Server.
Для эластичных пулов и отдельных баз данных Базы данных SQL Azure применяются только базы master и tempdb . Дополнительные сведения см. в статье Что являет собою сервер Базы данных SQL Azure?. Описание tempdb в контексте эластичных пулов и отдельных баз данных Базы данных SQL Azure см. в разделе База данных tempdb в Базе данных SQL Azure.
Для Управляемого экземпляра SQL Azure применяются все системные базы данных.
Хранилища версий. Это коллекции страниц данных со строками данных, которые поддерживают функции управления версиями строк. Существует два типа хранилищ: общее хранилище версий и хранилище версий для построения индекса в подключенном режиме. Хранилища версий содержат следующее:
- версии строк, создаваемые транзакциями изменения данных в базе данных, которая использует READ COMMITTED через транзакции изоляции моментальных снимков и транзакции изоляции управления версиями строк;
- версии строк, создаваемые транзакциями изменения данных для таких функций, как операции с индексами в подключенном режиме, функции MARS (множественный активный результирующий набор) и триггеры AFTER .
Операции в tempdb в минимальном объеме записываются в журнал, что позволяет откатывать транзакции. tempdb создается заново при каждом запуске SQL Server, чтобы система всегда запускалась с чистой копией базы данных. Временные таблицы и хранимые процедуры удаляются автоматически при отключении, и при выключении системы нет активных соединений.
tempdb не требует сохранения каких-либо данных между сеансами SQL Server. Операции резервного копирования и восстановления для tempdb недопустимы.
Физические свойства tempdb в SQL Server
В следующей таблице приводятся исходные значения конфигурации для файлов данных и журналов tempdb в SQL Server. Значения основаны на значениях по умолчанию для базы данных model . Размеры этих файлов могут немного отличаться в зависимости от выпуска SQL Server.
Количество вторичных файлов данных зависит от числа логических процессоров на компьютере. Как правило, если число логических процессоров меньше или равно восьми, используйте равное ему число файлов данных. Если число логических процессоров больше восьми, используйте восемь файлов данных. Если состязание сохраняется, увеличьте число файлов данных на значение, кратное четырем, пока состязание не снизится до приемлемого уровня, или внесите изменения в рабочую нагрузку или код.
Количество файлов данных по умолчанию основано на общих рекомендациях, приведенных в статье KB 2154845.
Чтобы проверить текущий размер и параметры увеличения для tempdb , выполнить запрос к представлению tempdb.sys.database_files .
Перемещение данных и файлов журналов базы данных tempdb в SQL Server
Сведения о перемещении файлов журналов и данных tempdb см. в статье Перемещение системных баз данных.
Параметры базы данных для tempdb в SQL Server
В следующей таблице приводится список значений по умолчанию для каждого параметра базы данных tempdb , а также возможность его изменения. Чтобы просмотреть текущие настройки этих параметров, используйте представление каталога sys.databases .
База данных tempdb в Базе данных SQL
Размеры базы данных tempdb для уровней служб на основе DTU
Целевой уровень обслуживания | Максимальный размер файла данных tempdb (ГБ) | Число файлов данных tempdb | Максимальный размер данных tempdb (ГБ) |
---|---|---|---|
Basic | 13.9 | 1 | 13.9 |
S0 | 13.9 | 1 | 13.9 |
S1 | 13.9 | 1 | 13.9 |
S2 | 13.9 | 1 | 13.9 |
S3 | 32 | 1 | 32 |
S4 | 32 | 2 | 64 |
S6 | 32 | 3 | 96 |
S7 | 32 | 6 | 192 |
S9 | 32 | 12 | 384 |
S12 | 32 | 12 | 384 |
P1 | 13.9 | 12 | 166.7 |
P2 | 13.9 | 12 | 166.7 |
P4 | 13.9 | 12 | 166.7 |
P6 | 13.9 | 12 | 166.7 |
P11 | 13.9 | 12 | 166.7 |
P15 | 13.9 | 12 | 166.7 |
Эластичные пулы уровня "Базовый" (все конфигурации DTU) | 13.9 | 12 | 166.7 |
Эластичные пулы ценовой категории "Стандартный" (50 eDTU) | 13.9 | 12 | 166.7 |
Эластичные пулы ценовой категории "Стандартный" (100 eDTU) | 32 | 1 | 32 |
Эластичные пулы ценовой категории "Стандартный" (200 eDTU) | 32 | 2 | 64 |
Эластичные пулы ценовой категории "Стандартный" (300 eDTU) | 32 | 3 | 96 |
Эластичные пулы ценовой категории "Стандартный" (400 eDTU) | 32 | 3 | 96 |
Эластичные пулы ценовой категории "Стандартный" (800 eDTU) | 32 | 6 | 192 |
Эластичные пулы ценовой категории "Стандартный" (1200 eDTU) | 32 | 10 | 320 |
Эластичные пулы ценовой категории "Стандартный" (1600–3000 eDTU) | 32 | 12 | 384 |
Эластичные пулы уровня "Премиум" (все конфигурации DTU) | 13.9 | 12 | 166.7 |
Размеры базы данных tempdb для уровней служб на основе виртуальных ядер
Ограничения
С базой данных tempdb нельзя выполнять следующие операции:
- Добавление файловых групп.
- Резервное копирование и восстановление из копии.
- Изменение параметров сортировки. Параметрами сортировки по умолчанию являются параметры сортировки сервера.
- Изменение владельца базы данных. Владельцем tempdb является sa
- Создание моментального снимка базы данных.
- Удаление базы данных.
- Удаление пользователя guest из базы данных.
- Включение отслеживания измененных данных.
- Участие в зеркальном отображении базы данных.
- Удаление первичной файловой группы, первичного файла данных или файла журнала.
- Переименование базы данных или первичной файловой группы.
- Выполнение DBCC CHECKALLOC .
- Выполнение DBCC CHECKCATALOG .
- Перевод базы данных в режим OFFLINE .
- Перевод базы данных или первичной файловой группы в режим READ_ONLY .
Разрешения
Любой пользователь может создавать временные объекты в tempdb . Если не предоставлены дополнительные разрешения, пользователям доступны только принадлежащие им объекты. Можно отозвать разрешение на подключение к tempdb , чтобы запретить пользователю работать с tempdb . Но делать это не рекомендуется, так как tempdb требуется для выполнения некоторых стандартных операций.
Оптимизация производительности базы данных tempdb в SQL Server
Размер и физическое размещение базы данных tempdb может влиять на производительность системы. Например, если для базы данных tempdb установлен слишком малый размер, часть системной нагрузки может приходиться на автоувеличение tempdb до размера, требуемого для поддержки рабочей нагрузки при каждом перезапуске экземпляра SQL Server.
По возможности используйте мгновенную инициализацию файлов, чтобы повысить производительность операций увеличения файлов данных.
Заранее выделите место для всех файлов tempdb , установив для файла размер, достаточный для обеспечения обычной рабочей нагрузки в среде. Предварительное выделение позволяет избежать слишком частого расширения tempdb , способного повлиять на производительность. Следует установить автоувеличение для базы данных tempdb , чтобы увеличить место на диске для незапланированных исключений.
Файлы данных в каждой файловой группе должны иметь одинаковый размер, так как SQL Server использует алгоритм пропорционального заполнения, который повышает вероятность выделения памяти в файлах с большим объемом свободного пространства. Разделение tempdb на множество файлов данных равного размера обеспечивает эффективное выполнение использующих tempdb операций с высокой степенью параллелизма.
Установите приемлемое значение шага увеличения размера файла, чтобы оно не было слишком низким для файлов базы данных tempdb . Если увеличение размера файлов будет слишком малым по сравнению с объемом записываемых в tempdb данных, tempdb может постоянно требовать расширения. Это скажется на производительности.
Чтобы проверить текущий размер и параметры увеличения для tempdb , используйте следующий запрос:
Поместите базу данных tempdb в быструю подсистему ввода-вывода. Если имеется много непосредственно присоединенных дисков, то используйте чередование дисков. Отдельные файлы данных tempdb или их группы не обязательно должны располагаться на разных дисках или шпинделях, если только у вы не наблюдаете узкие места в подсистеме ввода-вывода.
Расположите базу данных tempdb на дисках, отличающихся от используемых пользовательскими базами данных.
Увеличение производительности базы данных tempdb в SQL Server
Начиная с версии SQL Server 2016 (13.x);, производительность tempdb дополнительно оптимизирована следующим образом:
- Временные таблицы и табличные переменные кэшируются. Кэширование позволяет операциям удаления и создания временных объектов выполняться очень быстро. Кэширование также снижает вероятность возникновения состязаний, связанных с метаданными и выделением страниц.
- Усовершенствован протокол кратковременных блокировок выделения страниц для снижения количества используемых кратковременных блокировок UP (обновление).
- Снижены затраты ресурсов на ведение журнала tempdb — уменьшено потребление пропускной способности подсистемы ввода-вывода файлом журнала tempdb .
- Программа установки добавляет множество файлов данных tempdb при установке нового экземпляра. Эту задачу можно выполнить с помощью нового элемента управления для ввода в пользовательском интерфейсе в разделе Настройка ядра СУБД и параметра командной строки /SQLTEMPDBFILECOUNT . По умолчанию программа установки добавляет столько файлов данных tempdb , сколько имеется логических процессоров, но их может быть не больше восьми.
- При наличии множества файлов данных tempdb автоматическое увеличение выполняется для всех файлов в одно время и в равном объеме согласно параметрам увеличения. Флаг трассировки 1117 больше не требуется.
- Для всех операций распределения в tempdb используются единообразные экстенты. Флаг трассировки 1118 больше не требуется.
- Для первичной файловой группы свойство AUTOGROW_ALL_FILES включено и не может быть изменено.
Дополнительные сведения об улучшениях производительности в tempdb см. в статье блога TEMPDB — Files and Trace Flags and Updates, Oh My! (TEMPDB — файлы, флаги трассировки и обновления).
Оптимизированные для памяти метаданные tempdb
Состязание метаданных tempdb всегда было узким местом для масштабируемости многих рабочих нагрузок, выполняющихся в SQL Server. В SQL Server 2019 (15.x) появилась новая функция оптимизированных для памяти метаданных tempdb, входящая в семейство функций выполняющейся в памяти базы данных.
Она эффективно устраняет существующее узкое место и открывает новый уровень масштабируемости для рабочих нагрузок, активно использующих tempdb. В SQL Server 2019 (15.x) системные таблицы, связанные с управлением метаданными временных таблиц, можно переместить в неустойчивые таблицы без кратковременной блокировки, оптимизированные для памяти.
Сейчас функция оптимизированных для памяти метаданных tempdb недоступна для Базы данных SQL Azure и Управляемых экземпляров SQL Azure.
Просмотрите это 7-минутное видео, чтобы узнать, как и когда следует использовать метаданные tempdb, оптимизированные для памяти:
Настройка и использование метаданных оптимизированной для памяти базы данных tempdb
Чтобы согласиться на применение этой новой функции, используйте следующий скрипт:
Чтобы это изменение конфигурации вступило в силу, нужно перезапустить службу.
Вы можете проверить, является ли tempdb оптимизированной для памяти, используя следующую команду T-SQL:
Если по какой-то причине не удается запустить сервер после включения оптимизированных для памяти метаданных tempdb , можно обойти эту функцию, запустив экземпляр SQL Server в минимальной конфигурации с помощью параметра запуска -f. После этого вы можете отключить функцию и перезапустить SQL Server в нормальном режиме.
Чтобы защитить сервер от потенциальных состояний нехватки памяти, можно привязать tempdb к пулу ресурсов. В этом случае вместо действий, которые обычно выполняются при привязке пула ресурсов к базе данных, следует использовать команду ALTER SERVER .
Кроме того, даже если метаданные оптимизированной для памяти базы данных tempdb уже включены, чтобы это изменение вступило в силу, требуется перезагрузка.
Ограничения оптимизированной для памяти базы данных tempdb
Включение и отключение функции не является динамическим. Из-за внутренних изменений, которые необходимо внести в структуру tempdb , для включения или отключения этой функции требуется перезапуск.
Отдельная транзакция не может обратиться к таблицам, оптимизированным для памяти, в более чем одной базе данных. Все транзакции, связанные с таблицей, оптимизированной для памяти, в пользовательской базе данных, не смогут обратиться к системным представлениям tempdb в той же транзакции. Если вы попытаетесь обратиться к системным представлениям tempdb в транзакции с участием таблицы, оптимизированной для памяти, в пользовательской базе данных, возникнет следующая ошибка:
Запросы к таблицам, оптимизированным для памяти, не поддерживают указания блокировки и изоляции, поэтому запросы к представлениям каталога оптимизированной для памяти tempdb не будут учитывать указания блокировки и изоляции. Как и в случае с другими системными представлениями каталога в SQL Server, все транзакции для системных представлений будут находиться в изоляции READ COMMITTED (или READ COMMITTED SNAPSHOT в нашем случае).
Если оптимизированные для памяти метаданные tempdb включены, индексы columnstore нельзя создавать во временных таблицах.
В связи с ограничением на индексы columnstore использование системной хранимой процедуры sp_estimate_data_compression_savings с параметром сжатия данных COLUMNSTORE или COLUMNSTORE_ARCHIVE не поддерживается, если включены оптимизированные для памяти метаданные tempdb .
Эти ограничения применяются только при создании ссылок на системные представления tempdb . При необходимости вы сможете создать временную таблицу в той же транзакции, где обращаетесь к таблице, оптимизированной для памяти, в пользовательской базе данных.
Планирование ресурсов для tempdb в SQL Server
Определение требуемого размера tempdb в рабочей среде SQL Server зависит от многих факторов. Как описано выше, эти факторы включают текущую рабочую нагрузку и используемые функции SQL Server. Рекомендуется проанализировать текущую рабочую нагрузку, выполнив следующие задачи в среде тестирования SQL Server:
Системная база данных TEMPDB участвует в работе пользователей, подключённых ко всем пользовательским базам данных сервера СУБД.
TEMPDB используется при работе с временными таблицами и процедурами, в ней создаются внутренние (internal) и пользовательские объекты (user objects) промежуточных результатов запросов и т.п..
При запуске сервера, TEMPDB создаётся заново, если TEMPDB по каким то причинам не может быть создана, то сервер СУБД не запуститься. По умолчанию размер этой базы данных неограничен и увеличение его осуществляется при необходимости автоматически, порциями по 10% от текущего размера TEMPDB, однако эти параметры могут быть переопределены пользователем. По умолчанию, минимальный размер этой базы данных, который устанавливается при старте Microsoft SQL Server, определяется размером системной базы данных MODEL. Очистка журнала транзакций в этой базе данных производится автоматически, при этом удаляются только неактивные записи журнала транзакций.
При работе 1С:Предприятия 8 в режиме клиент-сервер широко используются временные таблицы. Кроме того, TEMPDB используется Microsoft SQL Server при выполнении запросов, использующих операторы GROUP BY, ORDER BY, UNION, SORT, DISTINCT и т.п.
Наиболее частой проблемой, с которой сталкиваются пользователи, является значительное увеличение размера базы TEMPDB. Причиной увеличения размера базы данных TEMPDB, как правило, является невозможность автоматической очистки журнала транзакций и повторного использования свободного пространства в TEMPDB из-за наличия активных транзакций, использующих объекты этой базы данных.
Какие могут быть решения данной проблемы:
1. Перезапустить MS SQL Server. В этом случае размер базы данных TEMPDB будет установлен по умолчанию.
2. Сжать базу данных TEMPDB. Для этого нужно в Query Analyzer выполнить следующую команду: DBCC SHRINKDATABASE (TEMPDB).
3. Уменьшить размер отдельных файлов. Для этого нужно в Query Analyzer выполнить команды:
DBCC SHRINKFILE (Логическое_Имя_Файла_Данных, Желаемый_Размер_Файла_Данных_В_Мегабайтах)
go
DBCC SHRINKFILE (Логическое_Имя_Файла_Журнала_Транзакций,
Желаемый_Размер_Файла_Журнала_Транзакций_В_Мегабайтах)
go
Пример.
Уменьшение размера файлов базу TEMPDB до 20 мегабайт
USE TempDB
DBCC SHRINKFILE (tempdev, 20)
go
DBCC SHRINKFILE (templog,20)
go
Пункты 2 и з также можно выполнить с помощью Management Studio
4. Переместить базу данных TEMPDB нас диск большего размера. Изменить месторасположение файлов базы данных TEMPDB можно с помощью команды ALTER DATABASE. Для этого нужно в Query Analyzer выполнить следующую последовательность команд и перезапустить сервер СУБД:
В завершении еще парочка советов по работе с базой TEMPDB:
1. Для оптимизации работы базы данных TEMPDB рекомендуется ее вынесение на отдельный жёсткий диск или RAM-диск и разбиение MDF файла на части (одинакового размера) по числу процессоров (ядер): если процессоров < 8, то количество файлов = количество процессоров; если процессоров > 8, то количество файлов для начала 8, а затем добавлять по мере необходимости.
2. При использовании временных таблиц используется кеширование, но это не относится к операциям создания индексов, сортировки, группировки и т.п. Например: создали таблицу, построили индекс (что разумно с точки зрения построения плана), то данная таблица кешироваться не будет. Но если таблица очень маленькая и почти наверняка она SQL-сервером будет сканироваться и создается она очень часто, то возможно имеет смыл операцию создания индекса опустить, в этом случае за счет кеширования таблица будет создаваться быстрее.
Что, как правило, делает 1С-ник? Открывает диспетчер задач, в лучшем случае видит загрузку памяти и начинает ее чистить, в худшем – видит картину, когда все вроде бы хорошо, но все тормозит. Тогда начинаются рестарты всего, что можно рестартовать.
В какой-то момент мне надоели рестарты и чистки кэша, я начал разбираться с вопросами производительности и попутно получил сертификат эксперта по технологическим вопросам.
По своему опыту и опыту коллег скажу, что все тормоза, как правило, возникают из-за неоптимального кода 1С, написанного программистами. Реже – из-за настройки серверов, СУБД и т.д. В любом случае, нет волшебной «галочки», которую можно поставить – и все летает.
разберем тормозящие запросы и что с ними делать;
научимся убирать ожидания на СУБД MS SQL Server;
узнаем, как чинить падающие рабочие процессы сервера 1С.
Первая проблема
Это был старт проекта на ERP:
Из типовой ERP использовалось очень мало, буквально пара подсистем. При этом был очень большой самописный модуль.
Серверы 1С и СУБД совмещены.
Оборудование не загружено.
Но при этом все тормозит.
Начали разбираться. Взяли для примера одну типовую операцию – открытие формы документа. Причем, это был простой самописный документ без сложных наворотов.
Обычный замер производительности из конфигуратора показал, что под полными правами все работает и открывается быстро, а под неполными открывается 11 секунд.
Сразу же видно разницу в запросах. На первом месте у меня запрос, который выполняется больше трех секунд под неполными правами, а подо мной выполняется за сотые доли секунды.
Наверное, все подумали о том, что проблема во все-таки включенном RLS, потому все и тормозит. Я тоже так решил и пошел его проверять. Оказалось, что он отключен.
Я собрал технологический журнал конкретно по проблемному запросу, выполнил его под собой и под пользователем с неполными правами.
Оказалось, что тексты запросов, которые передавались на SQL, были абсолютно одинаковые. И, что более важно, абсолютно одинаковым было и время выполнения.
На слайдах отмечено время в микросекундах – оба запроса выполняются почти мгновенно.
Откуда тогда могло взяться 3 секунды?
Какие компоненты могут тормозить?
Первое – СУБД, но она у нас не тормозит. Техжурнал показал, что запрос выполняется быстро.
Второе – сеть между 1С и СУБД. Но она тоже не может тормозить, потому что ее попросту нет – у нас для сервера СУБД и сервера 1С используется одна машина. Плюс включен протокол Shared memory – используется общая оперативная память. Сети вообще нет, грубо говоря.
Клиенты и сеть между клиентами сервера тормозить вообще не могли, потому что у нас проблема в запросе. Клиентов мы сразу отметаем, все запросы выполняются на сервере.
Остается одно звено – сервер 1С, с ним что-то было не так.
А что было не так?
Посмотрел, сколько ролей у проблемных пользователей. Оказалось – 1261 роль.
Напоминаю, что у нас ERP с подсистемами, которые не использовались. И однажды был создан профиль, который назывался «Для всех». Туда были добавлены вообще все типовые роли ERP без разбора – получилось столько ролей.
Также я сохранил конфигурацию в файлы, когда каждый объект метаданных сохраняется в отдельный файлик.
Посмотрел размер файлов ролей, и получилось так, что когда мы добавляем самописную роль, мы ставим в нее только пару галочек, поэтому она весит буквально несколько килобайт. А типовые роли за счет ограничений доступа, написанных для RLS, достаточно тяжелые. Они весят мегабайты, максимально – 25 мегабайт.
Убрали лишние роли, оставили порядка 150 штук, и все заработало быстро.
Точно не могу сказать, что повлияло: количество или вес ролей. Такого эксперимента мы не проводили, но суть в том, что убрали лишнее – заработало.
Не давать пользователю все роли без разбора, 1261 роль – это достаточно много.
Если порассуждать по поводу запроса, на котором были тормоза, то это был очень простой запрос с выборкой из основной таблицы одного регистра сведений. Без соединений, но с одним нюансом – там выбиралось порядка сотни полей.
Такое ощущение, что три секунды уходило на то, чтобы сервер 1С сформировал из текста запроса на языке 1С текст запроса на языке SQL. Возможно, он пытался для каждого поля поискать ограничения в выбранных для пользователя ролях. Но, так как он их не находил, то отправлял запрос точно такой же.
На слайде стоят знаки вопросов. Возможно, кто-то меня поддержит, а кто-то опровергнет мои догадки и кинет в меня ссылкой, потому что официального подтверждения своим догадкам я так и не нашел. Такой повод для дискуссий.
Вторая проблема
Перейдем к следующей проблеме:
Нагрузочный тест на 600 пользователей.
Использовалась также ERP, но практически типовая.
Серверы 1С и СУБД разнесены.
При начале итерации теста CPU на сервере СУБД возрастало до 100% и не отпускало несколько минут.
Предприняли самые простые действия.
Собрали трассировку запросов на SQL, сгруппировали, отсортировали по CPU.
На первом месте с большим отрывом – занимал в десять раз больше CPU, чем второе место – оказалось заполнение панельки «Текущие дела». По мере наполнения базы у нас этот запрос выполнялся порядка 15-20 минут. Оно крутится в фоне, никто этого не замечает, но оно нагружает базу.
Удалили эту панельку, стало легче.
Но раз уж я занимался СУБД, решил заглянуть в механизм ожиданий на SQL. Тут тоже будет немного теории.
Наверное, многие знают, что в SQL есть механизм системных динамических административных представлений – DMV. С помощью него можно посмотреть всевозможные данные о работе сервера: размер баз, таблиц, состояние индексов, когда делаются бэкапы, все, что угодно.
Одно из таких представлений –
Есть несколько основных типов ожидания – они перечислены на слайде, подробно рассказывать не буду.
В целом, я ожидал увидеть первый тип, который называется SOS_SHEDULER_YIELD. Если вы его видите на SQL – это значит, что у вас просто малоядерное ЦПУ. Так как у нас была нагрузка, я ожидал увидеть его.
Также есть несколько типов, которые говорят о недостаточной производительности дисков – PAGEIOLATCH и WRITELOG
И еще один тип ASYNC_NETWORK_IO, который означает, что у вас либо проблема с сетью, либо сервер 1С перегружен настолько, что не может принять результат какого-то запроса.
Самое простое – LCK, блокировки.
Итак, мы выполнили запрос к DMV sys.dm_os_wait_stats:
SOS_SHEDULER_YELD, который я ожидал увидеть, оказался на втором месте и занимал всего 6% от всех ожиданий;
а на первом месте был некий PAGELATCH_UP.
Еще скриншоты с таблицы sys.dm_exec_requests, где показан список запросов, которые выполняются прямо сейчас.
На этом слайде показано 15 запросов, и все они ждут.
Здесь – 12 запросов.
В пике уходило до 100 запросов, и время ожидания доходило до полсекунды. Это очень долго и очень плохо.
Прочел раза четыре, ничего не понял, и начал искать более понятное определение.
Выяснил, что Latches – внутренние блокировки SQL-сервера, которые должны быть очень легкими и короткими, незаметными. И они блокируют доступ не на диске, а в оперативной памяти.
Давайте посмотрим, откуда они могли у нас взяться.
Если посмотреть внимательно на скриншоты таблички sys.dm_exec_requests – с запросами, которые выполнялись прямо сейчас – видно, что:
мы всегда ждем один и тот же ресурс – это некая страница 2:1:2;
мы видим здесь команды CREATE TABLE (создание таблицы) и TRUNCATE TABLE (очистка таблицы).
Здесь еще несколько скриншотов и везде – CREATE TABLE и TRUNCATE TABLE, только страницы другие – 2:3:2, 2:4:2, 2:5:2.
Чтобы понять, что это за страницы, еще раз обращусь к теории.
Многие знают, что в MS SQL Server данные хранятся в страницах. Каждая страница занимает 8 килобайт. И это не настраивается. В PostgreSQL, по-моему, настраивается, но тоже лучше не менять.
В MS SQL Server есть два типа экстентов: однородные и смешанные.
однородные – когда в экстенте хранятся данные только по одной таблице;
а смешанные – когда можем положить в него 8 разных страниц с данными по разным таблицам и индексам.
На слайде приведено куча определений – их можно не читать, я постараюсь донести суть.
В каждой базе на MS SQL Server есть ряд служебных страниц, которые контролируют заполненность наших страниц и экстентов.
Когда мы пытаемся добавить, записать какие-то данные, MS SQL Server обращается к картам, смотрит, что у него тут экстент свободный, тут – половинка и там – половинка, и решает, куда класть данные. После этого делает отметку в карте, что экстент заполнен, туда больше ничего не положить.
При очистке – то же самое, только наоборот. MS SQL Server данные из страницы убирает и ставит отметку в карту, что там свободно, можно что-то класть.
В случае с обычной базой данных это не так критично, потому что мы в нее не так часто пишем и удаляем данные. Чтобы увидеть такие ожидания в запросах пользовательской базы данных, у этой базы должна быть очень крутая загрузка. Как минимум тысяча пользователей.
В случае с базой tempdb все как раз наоборот. 1С-ка с ней работает очень интенсивно – постоянно создает и очищает таблицы, на скриншотах это как раз и было видно – CREATE TABLE, TRUNCATE TABLE. Они на tempdb выполняются постоянно.
Как раз на этих картах у нас и было ожидание – страница 2:1:2 как раз отвечает за то, какие экстенты у нас заняты.
Решение здесь простое:
Разбить базу tempdb на несколько файлов. На сколько разбить? Рекомендации сайта ИТС говорят, что надо разбивать на 4 части.
Я нашел более универсальную формулу: если у вас количество ядер меньше 8, то количество файлов должно быть равно количеству ядер, а если больше или равно – то количество файлов = 8. В целом, думаю, можно бить просто на 8 файлов и не париться – хуже не будет. Мы так и сделали, ожидания ушли.
Вторая рекомендация с сайта ИТС: флаг трассировки 1118. Этот флаг запрещает создание смешанных экстентов. Я этого не делал – мне хватило первой рекомендации. Но если у вас конкуренция за доступ к ресурсу 2:1:3, который отвечает как раз за смешанные экстенты – можно попробовать включить этот флаг. Но пользоваться этим нужно аккуратно, потому что если вы отключите смешанные экстенты, база будет расти.
Третья проблема
Еще одна ситуация:
Сервер 1С и сервер СУБД разнесены,
На сервере 1С – пять баз.
Оборудование не загружено, проблем с производительностью не было никаких, работало все достаточно быстро.
Но периодически вываливались непонятные ошибки.
Например, на слайде показана ошибка, с которой закрывалась 1С в разных базах, у разных пользователей. Это доставляло дискомфорт, с этим нужно было что-то сделать.
Для исследования настроили все возможные мониторинги.
Техжурнал с событиями, которые отвечают за работу сервера 1С: ATTN, PROC, CLSTR и тд.
Счетчики производительности Windows конкретно для процессов 1С: rphost, ragent, rmngr.
Изменили одну настройку: количество ИБ на процесс. У нас было 2, установили единицу.
Для чего это сделано? Когда количество ИБ=2, у вас один rphost хоть каждый день может обслуживать разные базы: в первый день у вас rphost обслуживает 1С:ERP и 1C:Документооборот, во второй день – 1С:Документооборот и БП, в третий – ЗУП и ERP и т. д. Когда возникает ошибка с падением – мы вылетаем из двух разных баз.
Чтобы понять: проблемы в какой-то из баз или платформа падает сама по себе – сделана вот такая настройка, что один rphost обслуживает одну базу.
Это дало результат – мы обнаружили, что падает только ERP. Мы хотя бы починили 4 базы из 5 – они падать перестали.
На слайде показан скриншот дампов, которые создавались из-за падений процессов. Здесь видно, что нет никакой закономерности, база падает каждый день по несколько раз. Из этого ничего было особо непонятно.
Это график потребления памяти одним из упавших rphost-ов. График получен с помощью стандартного мониторинга производительности Windows – Perfmon.
Мы видим график памяти:
перед падением нет никакого скачка, роста потребления;
нет и падения – не видно, что он пытается это отпустить, передать соединение на другой rphost;
он просто идет, живет своей жизнью и резко обрывается.
Снизу – запись rphost-а перед падением. В них нет описания ошибки, есть исключение операционной системы и больше никакой информации: «Я устал, я ухожу – вот тебе дамп, делай с ним, что хочешь».
Зачастую, когда падают rphost-ы, в логах rphost последней записью бывает прямо строчка кода, из-за чего он рухнул. И тогда сразу становится понятно, куда смотреть и что произошло. Но тут такого не было.
Попробовали открывать наши созданные дампы. Там были ссылки на библиотеку Windows, которая не могла быть источником проблемы.
Пособирали полный техжурнал, попытались найти закономерности – это нам тоже ничего не дало.
Тогда мы поставили экстремальную настройку, количество соединений на процесс = 1, из-за которой для каждого соединения создавался свой rphost. Нам повезло, что заказчик был достаточно лояльный и пошел нам навстречу с тяжелыми экспериментами. В результате rphost-ов было больше 100, все очень сильно тормозило, пользователи так поработали полдня. За эти полдня мы выловили несколько падений, надеялись увидеть какую-то закономерность: какой пользователь падает, выполняется ли перед этим какой-то запрос или форма. Нам это ничего не дало. Каждое падение было уникальным.
Идеи стали заканчиваться. Мы исследовали багборд 1С на предмет ошибок платформы и ERP, но ничего похожего по нашим симптомам не нашли. Google тоже ничего похожего не дал.
Решение нашлось случайно на партнерском форуме 1С. Там уже была создана тема с точно такими же симптомами, как у нас. Оказалось, что проблема была во внешней компоненте печати штрихкодов, которая лежит в общем макете в базе ERP.
Мы не нашли никаких ошибок, потому что эта компонента входит в состав библиотеки подключаемого оборудования. Когда мы искали ошибки на багборде, их нужно было искать не в платформе, не в системе, а в библиотеке.
Скачали новую библиотеку, обновили этот макет и падения ушли.
Вопросы
Создаваемые вами роли были отдельные (одна роль на один объект) или составные? И как вы догадались, что вес роли влияет на производительность? Это просто был перебор всех возможных комбинаций?
Роли мы создавали отдельные на каждый объект, составных ролей не было. А по поводу веса – не знаю, как догадался. То ли вычитал в интернете, то ли сам решил сделать это. Я до сих пор не уверен, что именно вес здесь вызвал проблему. Возможно, проблема была в количестве полей.
Поделитесь, какая версия MS SQL Server была, что вы словили проблему с tempbd с PAGELATCH_UP. Современный MS SQL Server по умолчанию ставит 8 файлов для tempdb.
У нас был MS SQL Server 2014. И там по умолчанию стоял один файл для tempdb.
Данная статья написана по итогам доклада (видео), прочитанного на INFOSTART MEETUP Ekaterinburg.Online. Больше статей можно прочитать здесь.
Приглашаем всех принять участие в тематических митапах Инфостарта и INFOSTART EVENT 2021 (6-8 мая, СПб).
Читайте также: