Не равномерное использование экземпляров temdb

1. shaykhelov 15.05.24 09:09 Сейчас в теме
приветствую!

После разделения одного tempdb на несколько файлов и перемещение их на другой диск, осталась проблема что размер первого больше всех, 10Гб. Было задано 8 по 1Гб. Показатели статов подтверждают что обращений максимально к нему. Файлы перемещены обычным ALT ER DATABASE tempdb.

В чем может быть проблема не равномерного использования? MS SQL 2014
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. redfred 15.05.24 09:36 Сейчас в теме
Нагрузка пропорциональна размеру файла, нужно выравнять
3. shaykhelov 15.05.24 09:50 Сейчас в теме
(2)
ка пропорциональна размеру файла


изначально размеры были выравнены по 1024МБ, при запуске службы все было хорошо
Прикрепленные файлы:
6. redfred 15.05.24 11:13 Сейчас в теме
(3)
изначально размеры были выравнены по 1024МБ, при запуске службы все было хорошо


TraceFlag 1117 должен помочь. Рекомендуют еще 1118 заодно
7. shaykhelov 15.05.24 11:54 Сейчас в теме
(6) Потеряно в памяти что только с 2016 SQL они начали их включать автоматом. В 2014 SQL надо прописывать. После отпишу что там в итоге, после применения флагов. Спасибо за наводку
Прикрепленные файлы:
9. booksfill 15.05.24 12:39 Сейчас в теме
(6)
TraceFlag 1117


Судя по этому "Trace flag 1117 changes the behavior of file growth: if one data file in a filegroup grows, it forces other files in that filegroup to ALSO grow."
И этому "Not everyone likes to implement this trace flag, particularly because it impacts every database on the instance and not just tempdb"

"Поможет" он своеобразно - вырастут еще и остальные файлы.

Не понимаю в чем проблема - разного размера файлы в tempdb, скорее-всего (ну если не лезть совсем уж в крайности по размерам), не повлияют на производительность.
В чем тогда смысл?

А растет первый файл, например, если что-то "большое" делалось в единой транзакции, или началось несколько транзакций и MS SQL не "знал", что это "большие" транзакции и надо их разнести по своим файлам.
10. redfred 15.05.24 13:05 Сейчас в теме
(9)
"Поможет" он своеобразно - вырастут еще и остальные файлы.


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

(9)
Не понимаю в чем проблема - разного размера файлы в tempdb, скорее-всего (ну если не лезть совсем уж в крайности по размерам), не повлияют на производительность.
В чем тогда смысл?


При создании временного объекта нужно аллоцировать под него страницы в tempdb, а при удалении - деаллоцировать. Делается это в служебных страницах, которые на время внесения изменения блокируются. При интенсивной работе с tempdb с какого-то момента к ним могут начать расти очереди. Но если добавить файлов в той же файловой группе, то на каждый файл будут свои служебные страницы.
Нюанс в том, что нагрузка между файлами распределятся не round-robin, а пропорционально их размеру, поэтому необходимо чтоб они были одинакового размера.
11. booksfill 15.05.24 13:47 Сейчас в теме
(10)
Это и нужно, чтоб файлы росли одновременно и всегда оставались одинакового размера

Т.е. если вместо одного файла в 10гб и 2-х по 8 получить, все три по 10, да еще получить подобное не только для tempdb - будет хорошо?

... Но если добавить файлов в той же файловой группе...
- с этим никто не спорит.


"Нюанс в том, что нагрузка между файлами распределятся не round-robin, а пропорционально их размеру" - можно пруф?
Не понимаю логики, когда нагрузка ложиться на самый большой в файл, ибо единственный эффект, который мы получим - так это увеличение вероятностей тех самых блокировок.

Могу подозревать, что все же применяется Weighted Round Robin (ну, или, если не путаю Weighted Least Connections), в котором вес определяется свободными страницами в конкретном файле или числом открытых транзакций (возможно еще учитывается протекание процессов деаллокации), а не размером файла - тут могу только гадать.
12. redfred 15.05.24 14:20 Сейчас в теме
(11)
Т.е. если вместо одного файла в 10гб и 2-х по 8 получить, все три по 10, да еще получить подобное не только для tempdb - будет хорошо?


Ну, что поделать, серебряной пули нет, чем-то надо жертвовать. Размениваем дисковое пространство на уменьшение ожидания. Плюс этот флаг меняет поведение приращения в пределах одной файловой группы, а на пользовательских базах новые файлы обычно создают в разных. Так же напомню, что с 2016-й версии он включен по умолчанию и вроде никто особо не жаловался

(11)
Могу подозревать, что все же применяется Weighted Round Robin (ну, или, если не путаю Weighted Least Connections), в котором вес определяется свободными страницами в конкретном файле или числом открытых транзакций (возможно еще учитывается протекание процессов деаллокации), а не размером файла - тут могу только гадать.


Proportional fill algorithm, и, строго говоря, да, там на основе количества свободных страниц. Но, по большому счёту, суть-то та же. При старте инстанса файлы пусты, вопрос в размерах. Или при приросте одного файла из группы - скорее всего и свободных страниц в нём будет больше (ну, тут и от настроек прироста зависит, конечно)
13. paulwist 15.05.24 15:19 Сейчас в теме
(11)
Могу подозревать, что все же применяется Weighted Round Robin (ну, или, если не путаю Weighted Least Connections), в котором вес определяется свободными страницами в конкретном файле или числом открытых транзакций (возможно еще учитывается протекание процессов деаллокации), а не размером файла - тут могу только гадать.


Да, правильно "свободным местом", Д. Короткевич в каком-то вебинаре рассказывал.

У 2019 эта проблема решена, запись идёт "как бы равномерно по всем файлам" (во всяком случае синтетические тесты это показывают)
14. booksfill 15.05.24 16:30 Сейчас в теме
(13)
У 2019 эта проблема решена, запись идёт "как бы равномерно по всем файлам"


Подозреваю, что и в этом случае данные единой транзакции не разносятся по нескольким файлам и если место в файле, куда начали писать исчерпано, все равно получим прирост на n блоков и разный размер.

Но проверять желания нет, не думаю, что это значимо сказывается на производительности.

В крайнем случае никто не запрещает в "ненагруженное время" DBCC SHRINKDATABASE (tempdb, '<target_percent>');
15. redfred 15.05.24 18:48 Сейчас в теме
(14)
Но проверять желания нет, не думаю, что это значимо сказывается на производительности.


Зависит от нагрузки. Я раз пять наблюдал вживую tempdb contention, не больше. В основном это были очень нагруженные сервера с количеством баз за сотню и выравнивание файлов помогало всегда. Подозреваю, что на среднестатистической 1с-ной инсталляции такое словить сложнее, но если есть возможность заранее сделать нормальные настройки согласно рекомендациям - почему бы и нет? Даже если не пригодится, всё лучше, чем траблшутить внезапные тормоза на ровном месте
shaykhelov; +1 Ответить
17. booksfill 16.05.24 09:48 Сейчас в теме
(15)
tempdb contention

Мы же не про необходимость разнесения по нескольким файлам, а про необходимость выравнивания их размера?

Пусть первоначальный размер файла в файловой группе 10Гб, с запасом,и есть 3-и файла по 10Гб.
Потом что-то разово пошло не так и первый файл вырос до 20Гб, было бы очень странно в подарок получить "лишние" 20Гб за счет 2-х оставшихся файлов.
С этим надо как-то разбираться, а не разрешать расти базе на пустом месте.
tempdb это не про in-memory, поэтому можем получить тормоза связанные с работой с бОльшими файлами или даже out of disk space, вместо tempdb contention.

Впрочем, не буду спорить, моих познаний во внутренних механизмах MS SQL явно не достаточно.
Просто, с точки зрения программирования, не понимаю, почему то, что может решаться небольшой оптимизацией алгоритмов выделения свободных страниц, надо решать методом топора.
18. paulwist 16.05.24 11:17 Сейчас в теме
(14)
Подозреваю, что и в этом случае данные единой транзакции не разносятся по нескольким файлам и если место в файле, куда начали писать исчерпано, все равно получим прирост на n блоков и разный размер.


MSSQL 2019 нет, на

sel ect @@version

Microsoft SQL Server 2022


Имеем картину одновременного равномерного увеличения файлов tempDB в одной транзакции

Код

use tempDB

CRE ATE   TABLE [dbo].[t](
	[ID] [INT] identity primary key NOT NULL,
	[f1] [char](4000) NOT NULL
) 
GO

ins ert into dbo.t (f1)
sele ct top (100000) b.[name]  fr om master.dbo.spt_values a cross join master.dbo.spt_values b where a.type = 'P'
Показать


результат
Прикрепленные файлы:
16. shaykhelov 16.05.24 08:33 Сейчас в теме
(6) Флаги 1117 и 1118 включены, файлы перенесены на новый диск через ALTER.
Вчера вечером при перезапуске SQL все 8 файлов ровные по 1гб.
Сегодня с утра первый 10гб, остальные так же по 1гб, хотя по всем есть чтения/записи.
Прикрепленные файлы:
4. muskul 15.05.24 10:24 Сейчас в теме
все 8 гигов кончились, нужно было расти, стоит авто увеличение на первом, вот он и начал увеличиваться, а так как максимального размера нет, то и растет.
И вообще зачем темпдб разбивать, сейчас же все на ссд, а это ему не нужно
5. shaykhelov 15.05.24 10:42 Сейчас в теме
(4)
стоит авто увеличение на первом

авто увеличение стоит для всех 8-ми.


(4)
И вообще зачем темпдб разбивать

рекомендации MS:
Прикрепленные файлы:
8. redfred 15.05.24 12:34 Сейчас в теме
(4)
И вообще зачем темпдб разбивать, сейчас же все на ссд, а это ему не нужно


Это не про скорость дисков история, это про конкурентный доступ к служебным страницам (GAM, SGAM), они всё равно в памяти лежат. Больше файлов - больше служебных страниц, меньше борьбы за них.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот