среда, 9 января 2019 г.

Подвешенный сервер. Формула успеха.



Формула очень проста. Числитель-ваши ресурсы. Знаменатель-ваши же желания.
Само зависание, это комбинация  малых ресурсов и больших желаний.
Если данное состояние вас обошло, не тратьте время.

Скачать программу можно отсюда.

Раззипте и запускайте sql_active_process.exe

Сервер сам не вешается. Кто-то подогнал команду, которая ему не по силам.
Три тысячи юзеров, из них, бомбят сервер человек 20. Остальные, в AWAITING COMMAND.
SP_WHO всех видов, выгоняют  на экран три тыщи строк. И кто из них в теремочке живёт?
Появляется термин активного процесса.  Лет 10 я не решался сказать его вслух.
Чтобы не собрать троллей со всей Гренландии. Но недавно, это слово сказал Адам Маханик(Adam Machanic) в его великолепной, без никаких кавычек, sp_whoisactive.
Итак, я говорю о понятии  ACTIVE  PROCESS, которое сейчас знает весь мир.
sp_whoisactive включена в стандартный арсенал дальнейших версий MS SQL.
У кого её нет, Майкрософт  рекомендует  установить.
И что же я делал без неё?

Мы подошли к программе SQL_ACTIVE_PROCESS.
Созданна на PowerBuilder , с помощью демо-версии номер 8.
Всё программирование шло, примерно, 35 рабочих часов.
Экран сейчас выглядит так:


Мне пришлось потереть название сервера и имена боевых баз.
За окном стоит вот такой селект:

select distinct
convert(varchar(50),rsc_objid) id,
db_name(master.dbo.syslockinfo.rsc_dbid) lock_database,
db_name(master.dbo.sysprocesses.dbid) work_database,
master.dbo.syslockinfo.req_spid spid,blocked,
physical_io,loginame,cmd,
hostname,login_time,last_batch,getdate()
from master.dbo.syslockinfo,master.dbo.sysprocesses
where rsc_objid<>0
  and master.dbo.syslockinfo.req_spid=master.dbo.sysprocesses.spid
  and db_name(master.dbo.syslockinfo.rsc_dbid)='tempdb'
union
select distinct
convert(varchar(50),rsc_objid) id,
db_name(master.dbo.syslockinfo.rsc_dbid) lock_database,
db_name(master.dbo.sysprocesses.dbid) work_database,
master.dbo.syslockinfo.req_spid spid,blocked,
physical_io,loginame,cmd,
hostname,login_time,last_batch,getdate()
from master.dbo.syslockinfo,master.dbo.sysprocesses
where rsc_objid<>0
  and master.dbo.syslockinfo.req_spid=master.dbo.sysprocesses.spid
  and db_name(master.dbo.syslockinfo.rsc_dbid)<>'tempdb'

Один мой друг меня спросил:
  тебя какая нога толчковая ?
-Какой в толчок попал, та и толчковая.

Здесь,  толчковым ресурсом является syslockinfo.
Активный процесс обязан локИровать таблицы.
Не блокИровать, а локИровать . Как для чтения, так и для письма.
Исходя, из этого, выходим на номер процесса SPID и узнаём о нём, то, что позволяет наш интеллект.
Как Маханик средствами  одного SQL сумел вытащить полный синтаксис -вопрос не ко мне, я этого не понял. Говорят, что его проект взял 1000 часов.
У меня запускается DBCC, который выносит синтаксис в текстовый файл bondar.out  , а его, для просмотра, подхватывает NOTEPAD.
Теперь, как устроен интерфейс.
Итак, две площадки. 
В площадке  1-локИрованный объект, его системный номер, 
 в площадке 2 всё остальное.
Двойной клик в площадке 1 превращает номер, в имя.
Двойной клик в площадке 2 запускает DBCC для получения синтаксиса.
Превращать автоматом все номера в имена, когда сервер висит, очень жирно.
От этой опции пришлось отказаться.
Кстати, если программа реагирует быстро-сервер не загружен, а с висячим сервером приходится подождать. Тоже индикация, хоть и на глазок.


Список справа-так выглядит дефолтная сортировка.
Когда хочется по-другому, кликайте в заголовок столбца.
Появится значок сортировки по возрастанию, а столбец отсортируется. Кликните в сам значок, и сортировка поменяется на обратную.
Для возвращению к дефолту, есть спец. кнопка.
Кнопка SAVE вываливает экран в файл EXCEL.
А он, в свою очередь, неплохо справляется с вопросом:
"Ты чего гонишь"?

Следующий шаг, который пришлось сделать.
Это спарить мою программку с процедурой Маханика.
Её, так просто нельзя игнорировать-она играет соло по данной теме в мировом масштабе.
Но… ох уж эти "но".
PowerBuilder, чтобы принять выход процедуры, должен найти её последний селект , прочитать список выходных полей  и понять тип каждого из них.
С процедурой Маханика это не работает.  Этот чёртов селект оказался слишком сложен. Мне пришлось сочинять процедуру-переходник. Чей селект PowerBuilder уже прочтёт. Исходники обеих процедур находятся в библиотеке procedures. И их надо прогнать в мастере по указанному в именах их файлах порядку. Если программа не
найдёт эти процедуры в мастере, она продолжит работу без Маханика и это жаль.

Когда вы кликаете во 2-й площадке двойным кликом, запускается алгоритм выдачи синтаксиса. Сначала, процедура Маханика.  Иногда, она ничего не приносит. Почему?
Да потому,  что вы видите на экране то, чем сервер уже не  дышит. Запросто  может быть, что процесс  успел потерять звание активного. Моя ж программа в этих мелочах не копается: тебе нужен синтаксис процесса 228 ? Получай. В каком он сейчас статусе? Это не наш копенгаген.

Если окошко Маханика появилось, то не утруждайтесь копировать строчку с кодом-она уже в клип-борде. Зайдите в NOTEPAD  с, так сказать, моим DBCC выходом . Найдите свободное место и нажмите контрл-ви.

Походу, всё.
Что касается подключения PowerBuilder к SQL SERVER. В двух словах так:
Не ставьте программу на серверный компьютер, ставьте на  компьютер пользователя.
Второе, PowerBuilder не любит бесплатные SQL SERVER, всякие там Экспрессы.
С обычного корпоративного кляента, должна отработать.

Чуть не забыл. Красные строки. Что характерно, они почему-то
AWAITING COMMAND . Но если ты AWAITING COMMAND, то какого, с позволения сказать, ты локИруешь таблицы? А с того, что на самом деле-это цикл, а мой замер попал между его командами. И эти красные юзеры, могут быть конкретно опасны.
Курсоры, блокировки, прочая муть. Хотя, в последнее время, я стал замечать, что современные серверы красных строк  не бояться.
Это ссылки на мои другие блоги. Приглашаются все желающие.


18 января 2021.
Я тут немного, поговорил о красных юзерах.
С появлением Always ON, они снова принялись глушить серверы, как в старые добрые времена.
Речь идёт о моих личных наблюдениях, хоть и не экспертных,
но с переднего края. К категории красных юзеров я бы, 
присоединил, также,Бэк-Апы, но ввиду исключительной важности резервных копий, только покрасил их бордовым цветом, чтобы были заметны.
Есть ситуации, когда Бэк-Апы реально тормозят сервер, но килл по ним, оставляю админу.
Вдобавок, исходя из личных наблюдений, к красным юзерам присоединил процесссы в статусе suspended. Возможно, это метания загнанной крысы, но когда звонят с мест плюс собственное начальство, а перед носом дохнет сервер... Процессом-больше, процессом меньше.  
Кушайте ваш одиннадцатый пирожок, кто считает?
Итак, я оживил старый алгоритм побивания красных юзеров, которым не пользовался, кажись, с восьмого года.
Смысл такой-выставляется интервал таймера в секундах, дефолт=90 сек.
И с нажатием KILL RED LINES, процесс пошёл.
Первые 90 сек. программа ничего не делает, ждёт-вдруг, всё само уладиться.
Потом идёт замер-список красных строк, снова, 90 сек. ожидания, повторный замер, и если кто попался во второй раз-тому идёт килл. Потом опять замер-опять ожидание.
Есть синий батон, внизу экрана, для остановки таймера.
Ведётся счётчик замеров и счётчик киллов. 
Есть маленький батончик klick to stop timer-для слова timer
не хватило места. Та же самая остановка таймера замеров, а значит и киллов. 
Почему  в этом месте и почему в дублёр к синемму батону? 
Как то раз пришлось выставить таймер на 3 сек., и не было никакой возможности откатить экран назад, к синему батону. Пришлось тупо сбить программу, когда сервер прочистился, но я не получил отчёт о киллах, и не смог понять, откуда всё-таки, шёл затык.
Добавил ещё одну смешную опцию DEMO KILL RED LINES. 
Тоже самое, что KILL RED LINES, только
комманда КИЛЛ закомментированна. Когда останавливаешь эту карусель, то поднимается Ексель и показывает, кого надо было бы сбить с сервера, при том, что никто никого не сбил. Опция неожиданно получилась классная.
Контора грохнула кучу бабок на то, чтоб понять, кто гнобит сервер. Там было всё: и инсталляция на отдельную
машину и платёжка за каждый сервер, который ставится в прицел лиссенера и очень знающий мужичёк с французским акцентом. 
Мою дармоедку-определи на 180 секунд, жахни DEMO KILL RED LINES и иди спать.
Утром останови и получишь эксель. 
Демушка считает киллы с минусом, чтоб показать, что никаких киллов, по факту, нет. Одна иммитация. 
Ексель покажет, что примерно, а все показывают примерно, даже профайлер, серверу мешало. 
Есть у этой программы одна мистическая особенность. Я к ней не стремился-она появилась сама.
Время отклика на замер прямо пропорцианально загруженности сервера. Стало логично мерить степень зависания в секундах. 
Я их вывожу на шапку окна. 
Тем, кто скопировал себе мою программу, я выдал пермишенны на побиение процессов(server role: processadmin) и кой какие гранты для 2-х процедур и одной вью в мастере.
Mы, вдруг, стали говорить на одном языке. Типа: "Сервер висит на 6 секунд". Хоть какое-то понимание происходяящего.