На одном из серверов баз данных поймали интересный эффект. Сервер является хранилищам данных (data warehouse). В момент закачки очередной порции новых данных пользовательские сессии начинали жутко тормозить. Создавалось впечатление, что система зависает. К счастью, закачка завершалась относительно быстро и пользователей это особо не беспокоило, тем не менее, разобраться в чем дело стоило.
Причину нашли достаточно быстро. На сервере установлено 4 процессора и дисковый массив с 12-ю дисками объединенными в RAID 1+0. В погоне за высокой пропускной способностью количество db writer было увеличено до двух. В принципе, это сработало и закачка данных пошла быстрее, но массив оказался перегружен. Вот что показывал iostat в моменты пиковой нагрузки:
r/s w/s Mr/s Mw/s wait actv svc_t %w %b 8,6 3579,6 0,1 58,0 248,5 256 140,6 100 100 5,5 3108,8 0,1 50,4 248,3 256 161,9 100 100 3,6 2987,5 0,1 48,8 247,5 256 168,3 100 100 4,0 2721,5 0,1 44,5 235,7 251 178,6 96 100 4,5 2569,6 0,1 41,9 236,0 254 190,3 97 100 9,3 2544,3 0,3 41,4 248,3 256 197,5 100 100
Пришлось убрать "лишний" db writer. После этого пиковая нагрузка на дисковый массив уменьшилась более, чем вдвое, примерно так же уменьшилось среднее время выполнения операций ввода-вывода, и почти полностью исчезли операции ждущие в очереди на выполнение. Показания iostat в моменты пиковой нагрузки, после внесения изменений:
r/s w/s Mr/s Mw/s wait actv svc_t %w %b 16,2 1246,5 0,3 23,2 0 115,0 91,1 0 73 17,1 1267,4 0,3 25,0 0 66,4 51,7 0 50 16,2 1305,0 0,3 25,8 0 66,3 50,2 0 47 15,4 1208,3 0,2 23,7 0 97,5 79,7 0 59 12,8 1353,4 0,2 25,3 0 143,7 105,2 0 79 20,4 1709,0 0,3 31,1 0 92,2 53,3 0 73
С точки зрения базы данных, наиболее заметны были изменения в событиях ожидания относящихся к классу User I/O:
#Waits/sec Avg wait (ms) Event до после %diff до после %diff db file sequential read 67,08 48,72 -27,37 8,63 4,01 -53,53 db file scattered read 4,36 4,68 7,34 22,05 8,33 -62,22 direct path read temp 46,27 46,50 0,50 6,07 0,90 -85,17
Выводы:
Перегрузка подсистемы ввода-вывода легко ставит "на колени" сервер. (собственно не новость)
Oracle не заботится об автоматическом ограничении нагрузки создаваемой db writer. Увеличение количества db writer надо выставлять с учетом возможностей дискового массива.
Как-то странно ведет себя Solaris. Cлишком уж резко деградирует производительность. Подозреваю, что где-то есть ошибка в настройках.
Комментариев нет:
Отправить комментарий