Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 30

Не переживайте, инфа найдёт своего потребителя)
Утилита поддерживает исполнение JS? (в JS могут быть вызовы API, которые тоже добавляют нагрузку на сервер)
Я не переживаю. Скорее удивлён. Но спасибо за поддержку )
Вроде на хабаре жалуются что мало технических статей. Но вот взяли и заминусовали.

Я думал почему. Пришёл к выводу — решаемый баг оказался пшиком. Я мог конечно придумать более эпичную концовку, но честно написал как было. Думал статья будет интересна как пример поиска бага. Как подходил с разных сторон. Но это никому не интересно — как оказалось. Возможно статья имеет низкий технический уровень. Не знаю.

Что качается вашего вопроса — утилита написана на C#. HTTP запросы сам формирую. Т.е. в коде. Утилита писал чисто для тестов. На C# можно быстро писать подобные утилиты.
Поддержку JS — что бы ответить надо понять что вы имели ввиду.

Если в качестве скриптового языка для запросов в утилите — то разумеется нет. Конечно можно реализовать — но это вообще не моя цель. Если надо устроить DOS на API — так это обычные AJAX запросы. Я точно также могу их набросать в коде — и запросы будут уходить на сервер. Ответ на AJAX — та же html страница. Делай с ней что хочешь.
Собственно скриптовый язык запросов для меня это — исходники утилиты. Придумал запрос. Написал его в коде. И в работу.
а по каким причинам если не секрет? Будет иронично, если низкий технический материал и не соответствует тематике хабра, что опять же указывает на не справедливость… Если орфографические ошибки, то я всего одну увидел, где Вы себя в женском роде написали [сказала], но минусовать за это это дико по моему мнению
а по каким причинам если не секрет?


Не понял вопроса. Вы спрашиваете почему по моему мнению заминусовали статью? Если да то для меня это секрет. Собственно статья может быть не интересной — ну тогда просто уходишь. Зачем ставить минус? Я сам никогда не ставлю — не вижу смысла. Думаю что может люди ставили минус потому что баг в результате оказался слишком банальным.
Зачем ставить минус?

Во-первых, это обратная связь автору.
Во-вторых, это некий сигнал тем, кто идет по ленте, и выбирает статьи почитать.

Я бы предпочёл разгромный комментарий. Хоть понятно что не так. Опять же я постоянно замечаю что минусы и плюсы ставят за компанию.
Но я не жалуюсь. Просто констатирую факт.
Я бы предпочёл разгромный комментарий.

На комментарий надо тратить время и силы.


Хоть понятно что не так.

Мне казалось, на хабре к минусовалке прикручен опрос "что не так". Вам не показывают результаты?

Не представляю о чём вы. Я вижу просто счётчик. Сейчас полазил по интерфейсу — не нашёл ничего что бы было похоже на какие то объяснения.

На комментарий надо тратить время и силы.

Это понятно. Да я собственно без каких либо претензий.
Нет, когда дизлайкают ставят причину. Автор статьи всегда может посмотреть причину минусов). Причины минусов есть всегда [низкое качество; ничего не понял; не соответствует тематике хабра; офограыические ошибки; личная неприязнь; другое] Это Вы можете посмотреть, просто нажав на оценку вашей статьи в виде стрелочек. Вот я и спросил Вас по какой причине задисили)))
Спасибо. Не знал про такой функционал. Собственно там было низкий технический уровень 60%, ничего не понял 20%, ошибки 20%

Посмотрев другие варианты — понял что некоторые вряд ли вообще пользуются популярностью. Вроде — личная неприязнь к автору.

Впрочем такие ответы — особо ничего не говорят. И так были догадки либо технический уровень. Либо ошибки. Но если технический уровень — куда его ещё повышать в тематике подобной статьи? Выкладывать портянки кода с подробным анализом каждой строки? Может минусующие вообще не согласны с способом поиска бага и у них совершенно другие взгляды на это. Но к сожалению они посчитали объяснения выше своих сил.

Кстати причина по которой я не знал что при установки минуса — нужно писать почему, та что я никого никогда не минусил) Забавный случай.
Возможно имеется ввиду оформление. У меня так две статьи задисили. Одну я даже убрал. Видимо хотят чуть попроще и картинок побольше. Хотя фиг его знает. Низкого уровня я не заметил. Пишите ещё. Попробуйте в науч-поп, но по вашей тематике. Еще мне кажется чем больше карма, тем больше читают, но я смотрю со второй статьёй Вы карму и приподняли. Пишите не останавливайтесь.
НЛО прилетело и опубликовало эту надпись здесь
Именно так. На хабре кстати много таких «умников» обитает, есть и конкретные мракобесы.
НЛО прилетело и опубликовало эту надпись здесь
Не устраивайте здесь флуд. Признаюсь вчера дал слабину и повёлся. Задавайте вопросы исключительно по тематике статьи.
НЛО прилетело и опубликовало эту надпись здесь
Ахахах. Я от вас убежал из этой темы, так вы за мной сюда пришли? Признавайтесь вы мне карму понизили? К слову я вам не понижал (да и ни кому не ставлю минусы) — хоть вы в той теме преследовали только одну цель — облить помоями собеседника.

Что касается «компетенции» — ВООБЩЕ нету спора с моей стороны о компетенции статьи. Я лишь настаиваю — ну блин напишите пару слов, что не так? Если тема статьи лежит вне интереса читающего — так проходи мимо. Тем много.
А так поставят минус — собственно мне на них наплевать. Но меня начинает мучить вопрос. Раз поставили минус, значит где то я не прав. Значит есть куда расти. Но минусующие — сами походу не знают за что они минусы ставят.
НЛО прилетело и опубликовало эту надпись здесь
Он не может Вам карму понизить, потому что у него карма вечно в минусе. Интересно, что у него нулевая карма была благодаря мне, но он всё равно с кем-то уже поругаться успел. Стоит убрать плюсик и он в минусе не на два очка будет, а на 4-ре. Его не очень сообщество любит…
Т.е Вы сейчас полностью устранили баг с socket? И после перезапуска не надо все эти процедуры повторять заново? Статья хорошая!
Тот который описывался в статье — да. Однако проводя дальнейшие испытания — удалось выявить другие. Непонятные — то ли стек переполняется, то ли сжираются все ресурсы процессора. Есть простор для испытаний.

А те процедуры который я описывал в статье — они были предназначены для проверки не только сокета, но и механизмов веб сервера. Как создаются и удаляются клиенты. Как обслуживается очередь клиентов. Порты и прочее. Всё это проверено — работает соответственно ожиданиям. И дальше уже не надо запускать эти процедуры.
Продолжая эксперименты, я обнаружил в коде один хитрый перехватчик исключений на слушающим socket.

В этом exсeption была паузу.

Поясните, пожалуйста, это в вашем коде был такой обработчик исключений? Или, не дай бог, в библиотеке?

Как видно – для работы с слушающим socket нужно 3 действия. Создали. Слушаем. Принимаем клиентов. Схема настолько простая что программисту не остаётся никаких способов для манёвров, ну или возможностей отстрелить себе ногу.

Вот в этом-то и состоит оборотная сторона высокоуровневых средств: они могут скрывать под собой кое-что существенное с низкого уровня — там где ногу отстрелить себе таки можно (вы в этом убедились).
Потому что на уровне API ОС (в Windows он по старинке называется WinSock, сейчас это — часть Win32 API, а вообще этот API — он родом с BSD, и в современных *nix он везде весьма похож) -там не три, а (минимум) четрые действия: если брать изначальные вызовы (сейчас вместо них в Windows обычно используются их расширенные варианты, но общая логика осталась), то это будут socket (создание слушающего сокета), bind(установка адреса и порта для прослушивания), listen(запуск прослушивания) и accept (прием подключения с получением приемного сокета). Из этих операций вы не видите listen, а он есть, и имеет параметр — длину очереди (т.е. на уровне API длина настраивается, но вообще она не оень велика, ЕМНИП не более 65535): макс. число подключений, принятых ОС, но ожидающих обработки со стороны приложения (вызовом accept или его аналога). Как только эта очередь исчерпывается, то ОС перестает принимать подключения и получается ровно та картина, которую вы видели — это вторая причина отказа соединения, кроме того, что порт вообще не прослушивается.
Поэтому у людей, работавших с WinSock на низком уровне, при виде такой картины сразу возникает мысль: а не мешает ли что своевременному вызову accept (у вас это была задержка в обработчике исключений)?..
Ну, а всякие высокоуровневые оболочки для WinSock нередко запускают accept в отдельном потоке, чтобы цикл приема подключений случайно не заблокировался (VCL в Delphi, к примеру именно так делала). А в MS в TPL, я гляжу, понадеялись на асинхронность (и это правильно — в той же Delphi при принятых тогда подходах поток подключений мог запросто породить сотню-другую потоков, по одному на подключение) и на осведомленность программиста — а вот с этим сложнее: не только лишь все программисты сейчас знают низкоуровневые детали Sockets/Winsock API (подозреваю, что заминусовавшие вашу статью — как раз знают давно и хорошо) и проистекающие отттуда возможные неприятности.
Поясните, пожалуйста, это в вашем коде был такой обработчик исключений?

Да это был обработчик в веб сервере.

А по поводу сторонних библиотек я с вами полностью согласен. Никогда не знаешь выиграешь или потеряешь. Если реализовал — и всё работает. Выиграл. Если столкнулся с тем что функционал не подходит или не дай бог баг — проиграл. Потому как по итогу времени на исправление займёт больше чем на свой велосипед.

По поводу socket в .net — ИМХО, там изначально всё было достаточно корявенько. О чём свидетельствуют многочисленные вопросы в топиках. И если не использовать Task — а всякие callback — то выглядит не очень. Хотя может это и не вина .net.

И опять же мне удалось убить socket огромным числом подключений — что бы разобраться что к чему — надо лезть в исходники socket. И тут получается ситуация что мы уже начинаем терять от использования готового. Если бы использовался самый низкий уровень — проблема была бы видна.
Хотя опять же — может и не socket виноват, а стек программы. Это на вскидку — потому как вроде не должен стек переполняться. Просто симптомы такие же как в этой статье — ничего не работает. А почему, пойди разберись. Потом окажется что опять какая то фигня. Но что бы найти ту фигню почему то надо очень сильно постараться и опять 100500 разных экспериментов провести.
что бы разобраться что к чему — надо лезть в исходники socket.

Не обязательно. Мысль была в том, что концептуальное понимание, как работает на низком уровне используемая технология — оно помогает сделать разумное предположение о причине проблемы и без копания в деталях в исходниках (кстати, я в них загляывал когда писал предыдущий ответ — и там все очень непрозрачно).
PS Непосредственной причиной, почему не был вызван вовремя accept, возможно, явлилось то, что кончились потоки в пуле, которым можно было бы поручить эту задачу: все висели на Delay. Но это неточно. Однако симптоматика (а вы ее достаточно нарыли: порт прослушивается, но соединение все равно отвергается) уже сразу указывала именно на невызов accept вовремя.
Да я планировал тестирования количества потоков. Собрать информацию сколько вообще можно. Как посмотреть и прочее. Но видимо то ли забыл, то ли проблема решилась до того как приступил к этому кейсу.
Но в свете последних тестов — обязательно вернусь к этому вопросу.

Увидев это в своих рекомендациях по интересам в Гугле, решил специально отписаться об этой статье .


  1. Зачем делать велосипед, если есть софт от Apache для тестирования балансировки нагрузки, который как по мне лучше костылей всяких работает.


  2. Тестить это с Windows — безумие.



И есть несколько вариантов http флуда: забивать его сокетами (пока их не хватит для новых подключений), флудить максимально столько, чтобы на сервере вообще места не осталось.


Советую присмотреться к софта ntopng чтобы понимать как работают подключения, и ведёт себя трафик.


Есть пару ультит ещё для доса под лину. Сказать точно не смогу, ни дома, пишу с тел. Отпишусь обязательно...!))

По поводу софта — я попытался объяснить свою точку зрения, повторюсь.

Разумеется наверняка есть много полезных утилит для тестирования. Но их надо искать, качать, изучать и настраивать для работы.

И что же делают эти утилиты. Ну скорее всего они делают http запросы. Мне было намного проще делать http запросы в своём велосипеде. Подобного рода программы на C# пишутся за минут 10-20.
Конечно мои доводы могут быть совершенно неверны. Но я по крайней мере привожу их. За использования сторонних утилит — я доводов пока не видел. Вернее они есть — но мои доводы, ИМХО, перевешивают. Разумеется я буду рад услышать про киллер-фичу, которую будет сложно либо лениво реализовывать у себя, и я перейду на стороннюю утилиту.

По поводу Windows — думаю тут больше религиозная точка спора, чем факты ) И дабы сгладить ситуацию скажу — что сам сервер также скомпилирован и под linux и стоит на ubuntu server. И там тоже тестировался. linkin.link висит на на ubuntu server. Если посмотреть шапку ответов web отладчиком — то там можно увидеть строку Server:Occamus /nix

Просто баг проявился под виндой — и под виндой его искали. Потому как бага не должно быть нигде. Web cервер предназначен для работы и по виндой.

По по воду атак- сценариев я могу придумать множество. Просто в статье обсуждался самый простой способ. Те же соединения можно по разному открывать. Например недавно читал что в ngnix нету защиты от медленных соединений. Или наоборот только подвезли такую защиту? Не помню уже. Короче можно качать данные со скорость байт в секунду. Этот сценарий я могу в своём велосипеде реализовать за минуты.

Например в тестируемом сервере такая защита стоит.

И есть несколько вариантов http флуда: забивать его сокетами

В сервере есть динамический массив клиентов. И время жизни клиентов зависит от текущего их количества. Параметр настраивается. При приближении к этому числу время уменьшается. При достижении предела — время жизни сокета — один ответ. Это своеобразная защита от множественных мёртвых подключений.

Советую присмотреться к софта ntopng чтобы понимать как работают подключения, и ведёт себя трафик.


Пока писался сервер. А ещё полностью собственный TLS стек — насмотрелся вдоль и поперёк. Месяц не вылезал с Wireshark пока туже современную криптографию на эллиптических кривых делал. TLS — это такой сборщик дикого легаси, что ни один RFC — нормально не пояснялось как та же функция PFR работает.
Но я всегда готов к новым знаниям.
Просто баг проявился под виндой — и под виндой его искали. Потому как бага не должно быть нигде. Web cервер предназначен для работы и по виндой.

Но под linux тоже этот баг был зашит в код, получается. А в linux было бы намного проще продиагностировать сетевой стек.

Вообще, не очень понимаю, зачем в принципе запускать сервер на Windows, тем более на десктопной версии. Но прочитал с интересном, узнал даже что-то новое, хоть эти вещи из мира Win мне не актуальны, статью плюсанул, хоть и мало картинок :)

Тестируя нагрузки на веб-приложения ( последней была CRM система ). Случилось это полгода назад когда вернулся на своё место работы в офис (у компании 2 отдела CRM и ещё один SaaS).


Под наблюдением нескольких программистов — на их глазах просто падает все что стоит. В соседнем офисе в котором был call-центр — полностью затих.


В качестве балансировки нагрузки у них выступал nginx (он так же мешал делать ≥2 запросов в сек.) проксировал десяток размещенных node.js


Проводил испытания с нескольких выделенных железяк размещенных в EU.


Железо моё стояло под Linux (Debain), то что я использовал были: RavenStorm, hping3 (использовал до 90% ресурсов моих серверов для флуда).


Так же стоит не опускать Apache JMeter, это пожалуй будет отличное решение для тестов своих приложений.


ntopng можно наблюдать любую картину связанную с трафиком на Linux сервере.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации