Имя: Пароль:
IT
 
Оптимизация сервера SQL
0 VladZ
 
07.04.11
06:26
Запустил тест на 1 час.
Результаты теста:

***total***    16878177.0    100.0
SLEEP_TASK    5080609.0    30.1
LAZYWRITER_SLEEP    3546843.0    21.0
SQLTRACE_BUFFER_FLUSH    3396031.0    20.1
LCK_M_U    1238109.0    7.3
PAGEIOLATCH_SH    1061515.0    6.3
WRITELOG    1034968.0    6.1
SLEEP_BPOOL_FLUSH    455203.0    2.7
CXPACKET    373390.0    2.2
PAGEIOLATCH_EX    272281.0    1.6
SOS_SCHEDULER_YIELD    189312.0    1.1

Подскажите, плиз, куда копать.
1 упс
 
07.04.11
07:04
2 YHVVH
 
07.04.11
07:30
(0) что за тест?
3 VladZ
 
07.04.11
07:33
(1) Я там уже был...  Нифига не понял.

SLEEP_TASK - Имеет место в случае, когда задача находится в неактивном состоянии во время ожидания универсального события.
4 VladZ
 
07.04.11
07:34
(2) http://info start.ru/public/16681/
5 VladZ
 
07.04.11
07:54
Ап!
6 упс
 
07.04.11
08:13
(3) да вы вообще не на том заморачиваетесь..

"A session status of ‘Sleeping’ indicates SQL Server is waiting for the next SQL Server command."
http://download.microsoft.com/download/4/7/a/47a548b9-249e-484c-abd7-29f31282b04d/Performance_Tuning_Waits_Queues.doc

Посмотрите еще ссылки ниже (они на буржуйском). Там SLEEP_* ожидания исключаются на этапе сбора статиситики ожиданий.

http://www.sqlskills.com/BLOGS/PAUL/post/Wait-statistics-or-please-tell-me-where-it-hurts.aspx

http://blog.sqlauthority.com/2011/02/01/sql-server-wait-stats-wait-types-wait-queues-day-0-of-28-2/
7 VladZ
 
07.04.11
08:32
(6) Спасибо за ссылки. Буду дальше копать.
8 VladZ
 
07.04.11
13:19
ап! Может еще кто-нидь че-нидь подскажет?
9 EasyRider
 
07.04.11
15:47
(8)А в чем вопрос-то?
10 VladZ
 
07.04.11
21:11
(9) Вопрос в следующем: в базе имеют место быть блокировки, усложняющие работу. Можно ли их как-то разрулить?
11 Reaper_1c
 
07.04.11
21:12
(10) Разрешаю.
12 EasyRider
 
08.04.11
08:23
(10)Можно.Поставить помощней железо(чтобы узнать что именно - пользуйтесь замером производительности).Либо перевести конфу(если речь об 1с) в режим управляемых блокировок.Если это еще не сделано конечно.
13 VladZ
 
08.04.11
09:02
(11) Спасибо, мне этого не хватало.

(12) Это не 1С.
Это Оптимум Мобильная Торговля. См. http://www.cdc.ru/solutions/optimum-asumt/
SQL уже перетащили на другую тачку. Проблема осталась.
14 Reaper_1c
 
08.04.11
09:10
(13) буэээ. Не разрешаю. Оптимум - говнище редкое. Надо было у наших земляков, "Системных технологий" проект заказывать.
15 VladZ
 
08.04.11
09:11
(13) Выбором ПО я не занимаюсь...  Мое дело - ямки закапывать..  :)
16 VladZ
 
08.04.11
09:12
(15) -> (14)
17 упс
 
08.04.11
09:16
(13) вы в этом оптимуме код править можете? без этого особого толка не будет.
тут все равно рекомендации будут стандартные - дефрагментация\перестройка индексов и обновление статистики. Про шринк, если есть - забыть.

Судя по этому:
PAGEIOLATCH_SH
WRITELOG
PAGEIOLATCH_EX
У вас могут быть проблемы с дисковой подсистемой - растащить файл данных и журнал траназкций на разные физические устройства. И чем они быстрее тем лучше.

Какой у вас SQL Server? Если 2005 и старше - используйте dmv sys.dm_os_wait_stats  или стандартный отчет. В dmv данные собираются с момента запуска службы sql server, чтобы получить более актуальные данные - запустите DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR); и смотрите как там что со временем изменяется.
Смотрите счетчики ОС - они вам могут больше сказать о проблемах в системе.
18 VladZ
 
08.04.11
09:24
(17) А почему именно на эти вещи нужно обратить внимание: PAGEIOLATCH_SH, WRITELOG, PAGEIOLATCH_EX? Они ж не в первой тройке?

У нас SQL 2005.
19 упс
 
08.04.11
09:38
(18) Ожидания SLEEP_* - это вообще не те ожидания, о которых вам надо беспокоиться.
SQLTRACE_BUFFER_FLUSH - "Имеет место, когда задача ожидает сохранения фоновой задачей буферов трассировки на диск каждые четыре секунды." (msdn, ссылка выше) - не нравится это ожидание - отключите трассировку по умолчанию, 99%, что дело в ней. Это тоже можете не учитывать, просто оно все время висит и ждет. Откинув их, получите:
LCK_M_U - это ваши ожидания на блокировках, фактически - на первом месте.
PAGEIOLATCH_SH - "Имеет место, когда задача ожидает кратковременной блокировки буфера, находящегося в состоянии запроса ввода-вывода. Запрос на кратковременную блокировку производится в режиме общего доступа. Длительное время ожидания может указывать на проблемы с дисковой подсистемой." (msdn)
WRITELOG - тоже диск "Имеет место при ожидании завершения записи журнала. Обычно запись журнала вызывается такими операциями, как контрольные точки и фиксации транзакций."
CXPACKET - процессор, можете попробовать повысить cost treshold для параллелизма
PAGEIOLATCH_EX - диск
SOS_SCHEDULER_YIELD - процессор

Проблема в том, что ожидания - они будут всегда, что бы вы не делали. Ориентироваться только на них, при "оптимизации" - бесполезно
20 VladZ
 
08.04.11
11:53
(19) Очистил утром статистику (DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR)).

Запрос
select * from  sys.dm_os_wait_stats
order by wait_time_ms desc

Выдает следующее:
wait_type/waiting_tasks_count/wait_time_ms/max_wait_time_ms/signal_wait_time_ms
LCK_M_S    115    21299156    1211640    46
SLEEP_TASK    807083    12235796    890    112906
LAZYWRITER_SLEEP    13397    8647093    1015    2078
SQLTRACE_BUFFER_FLUSH    2115    8460046    4015    0
LCK_M_U    176    4041281    528906    15
PAGEIOLATCH_SH    56033    1533281    2062    1718
WRITELOG    17011    889359    2343    765
LCK_M_X    21    790843    772125    0
SLEEP_BPOOL_FLUSH    65162    778468    46    11156
CXPACKET    20618    752781    30250    7203
SOS_SCHEDULER_YIELD    308334    515265    375    515265
PAGEIOLATCH_EX    23302    395453    2062    46
ASYNC_NETWORK_IO    15607    51562    984    203
SQLTRACE_LOCK    241    51562    1015    140
LOGBUFFER    1650    29187    656    62
IO_COMPLETION    1558    27484    1078    15
OLEDB    84669    23031    8156    0
PAGELATCH_UP    97904    15718    31    2625
PAGEIOLATCH_UP    87    6750    2140    0
PAGELATCH_SH    2926    5828    562    1734
LATCH_EX    599    2125    515    0
PAGELATCH_EX    2621    781    171    78
LATCH_SH    37    578    203    15
MSQL_XP    61    46    15    0
MSQL_DQ    161    46    15    0
CMEMTHREAD    160    31    15    31
THREADPOOL    4    15    15    0
LCK_M_IX    2    15    15    0
LCK_M_SIU    0    0    0    0
21 vde69
 
08.04.11
12:03
я-бы обратил внимание на длительность сесий, а конкретнее на "зависшие" такое бывает если клиент отваливается но конект остается.

Лечится установкой в биосе отключением питания сетевых карт (в частности при "sleep" компа)
22 упс
 
08.04.11
13:00
(20) да вы как не понимаете, что эти цифры - это НИ О ЧЕМ! Они имеют смысл в том случае, если у вас есть baseline, с которым вы можете сравнить результат и сделать вывод - стало лучше, хуже, или осталось как было. Это как обратиться с вопросом - "У меня счетчик Transactions\sec показывает 1000 транзакций в секунду. Это нормально?". Ответа на такой вопрос никто не может знать кроме вас - только вы можете знать какое количество транзакций в секунду нормально для ВАШЕЙ системы. Со статистикой ожиданий тоже самое. Ожидание LCK_M_S будет всегда, пока будут блокировки. А блокировки будут всегда, пока у вас с одними и теми же данными работает больше 1 человека.

Я уже давал вам ссылку: http://www.sqlskills.com/BLOGS/PAUL/post/Wait-statistics-or-please-tell-me-where-it-hurts.aspx

Оттуда: LCK_M_XX
This is simply the thread waiting for a lock to be granted and indicates blocking problems. These could be caused by unwanted lock escalation or bad programming, but could also be from IOs taking a long time causing locks to be held for longer than usual. Look at the resource associated with the lock using the DMV sys.dm_os_waiting_tasks.

Т.е. возможные причины: unwanted lock escalation (кривая структура данных\мало памяти), bad programming, IOs taking a long time (медленные диски).
Ну и по второй ссылке можно перейти на это: http://blog.sqlauthority.com/2011/02/15/sql-server-lck_m_xxx-wait-type-day-15-of-28/
23 VladZ
 
21.04.11
10:39
(0) Если кому-то интересно: проблема была не в железе. Проблема в структуре БД.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан