Сейчас на форуме: asfa (+7 невидимых) |
eXeL@B —› Вопросы новичков —› TDI. Высоконагруженный ядерный сервер |
Посл.ответ | Сообщение |
|
Создано: 23 ноября 2013 04:18 · Личное сообщение · #1 Пишу ядерный сервак с возможностью одновременного приёма 1000+ клиентов. Скажу сразу, что я нуб, нуб и ещё раз нуб тут, но кое в чём разобрался. Представляю примерную схему, но многие вещи пока толково объяснить не могу. Всех объектов ещё не знаю, чтобы выбирать самостоятельно и разумно. А выбрать нужно способ приёма/передачи данных на установленном соединении. Поскольку нужно уметь принимать огромное число клиентов одновременно, а обработка одного может занимать до нескольких секунд, то цикл приёма/передачи сразу вслед за акцептом не катит. Обработка должна быть вынесена отдельно, чтобы у другого клиента не сработал таймаут коннекта. APC также не подходит. Каждую в отдельный поток вынести - вряд ли система будет стабильно работать с тысячью систем тредов. И пока реализовал на Work Item'ах. Code:
Проверить полностью на тысячу коннектов сейчас не могу, это будет в финале. Сделать правильный выбор нужно сейчас. И уже сейчас что-то не очень нравится это способ на Work Item. Есть ещё идея создать отдельный рабочий тред, и посылать в него команды с параметрами на обработку, но как-то сложновато... Есть ли ещё другие способы? ----- IZ.RU |
|
Создано: 23 ноября 2013 04:26 · Личное сообщение · #2 ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 23 ноября 2013 04:29 · Поправил: reversecode · Личное сообщение · #3 |
|
Создано: 23 ноября 2013 04:40 · Поправил: DenCoder · Личное сообщение · #4 ClockMan Вот не поверишь, но готовые дрова на TDI так часто выкладывают в сеть, что нашёл 1 рабочий и 2 куска из привата гугла, но всё там не по той схеме В книгах о руткитах тоже только знакомят. Собственно, я с xakepa и начал reversecode Упрямство велит сделать самому P.S. А да - и на TDI!!! ----- IZ.RU |
|
Создано: 23 ноября 2013 04:42 · Личное сообщение · #5 |
|
Создано: 23 ноября 2013 04:45 · Личное сообщение · #6 |
|
Создано: 23 ноября 2013 04:48 · Поправил: reversecode · Личное сообщение · #7 |
|
Создано: 23 ноября 2013 04:54 · Поправил: DenCoder · Личное сообщение · #8 Да не малварь ) Что ж сразу если дров - то малварь? Вон Инде SIDE забабахал - кошерно, но запускать до сих пор побаиваюсь Кстати, Инде, наверняка смог бы помочь тут ) Хотя странно тоже в ядре работает - TCPView от Руссиновича не видит его состояния соединений - ни LISTEN, ни ESTABLISHED. Да и сами соединения не видит, хотя коннекты есть. Почти руткит ) ----- IZ.RU |
|
Создано: 23 ноября 2013 04:58 · Личное сообщение · #9 |
|
Создано: 23 ноября 2013 05:02 · Поправил: DenCoder · Личное сообщение · #10 reversecode пишет: если не мелварь, то дрова не нужны от ты не прав! По производительности куда выше. Ну да ладно ) reversecode пишет: а инде здесь профан Про его сетевую деятельность неизвестно, но помочь в выборе колбэков он смог бы! ARCHANGEL, наверняка, поделился бы дельным советом. Вполне возможно, кто из новых (или редких) участников имеет ценное мнение... ----- IZ.RU |
|
Создано: 23 ноября 2013 05:06 · Личное сообщение · #11 DenCoder пишет: от ты не прав! По производительности куда выше. Ну да ладно ) осталось понять что это за чудо задание которое будет выплевывать и выгребать такие огромные куски данных что сорм покажется просто маленькой букашкой )) не хилые видимо у хомячков для внедрение мелвари интернет каналы и сетевые карты с оптикой сразу к м9 |
|
Создано: 23 ноября 2013 08:40 · Личное сообщение · #12 |
|
Создано: 23 ноября 2013 09:19 · Личное сообщение · #13 Ядерный сервак - это отличный бсодогенератор. Не изобретайте велосипед, обычный IOCP + правильные настройки сетевого стека, и будет держать столько клиентов, на сколько хватит канала и ресурсов CPU для выполнения прикладного протокола. Ядерные ухищрения могут понадобиться если вам в реалтайме обрабатывать 10gbit+ канал, но тогда я бы начал с перехода на другую ОС. З.Ы. если очень хочется непременно ядерный сервер, то на WSK проще, быстрее и актуальнее. TDI это теперь legacy обертка. ----- PGP key |
|
Создано: 23 ноября 2013 09:36 · Личное сообщение · #14 Во-первых, не уловил, зачем в ядро лезть для сервера. Узким местом здесь явно будет не юзер-мод/кернел-мод. И про бсоды уже сказали. Во-вторых, пишешь для уже сдохшей архитектуры. The TDI feature is deprecated and will be removed in future versions of Microsoft Windows. Depending on how you use TDI, use either the Winsock Kernel (WSK) or Windows Filtering Platform (WFP). |
|
Создано: 23 ноября 2013 14:43 · Поправил: DenCoder · Личное сообщение · #15 Archer Ну неверная же информация. Это они планировали его в конец закрыть. Но, однако, не получилось, пришлось оставить для совместимости. И на всех Windows, включая Windows 8, он существует. ) ntldr пишет: если очень хочется непременно ядерный сервер, то на WSK проще, быстрее и актуальнее. TDI это теперь legacy обертка. Согласен, но подхожу исторически в хронологическом порядке У меня редкие бсоды, всё можно проработать... Конструктива не будет? Gideon Vi пишет: если ТЗ для малвари, то малварь Всё верно. А если человек судит предвзято, то он мнителен, верно? UPD http.sys для IIS - тоже малварь? Скажу честно, что первым делом спросил у заказчика, для чего ему это. Он ответил, что хочет попробовать SOCKS 5 на уровне ядра. Сам по себе SOCKS ничего общего с малварью не имеет! Сильно переубеждать его не стал, тем более что сбылась мечта идиота - наконец-то, что-нибудь ядерное напишу, а то только реверсить надоело. Есть мнение, что у спеца в этом вопросе займёт на задачу каких-то 3 дня. Я сомневаюсь в этом, но сказал, что у меня в любом случае выйдет в 2-3 раза дольше, чем у спеца. Как человек дальновидящий, нарисовал возможные проблемы, предложил Winsock Kernel или WFP. Остались всё же пока на TDI. ----- IZ.RU |
|
Создано: 23 ноября 2013 15:23 · Поправил: Gideon Vi · Личное сообщение · #16 DenCoder пишет: А если человек судит предвзято, то он мнителен, верно? Верно. Но выживают только параноики По факту, ты не привел ни одного конструктивного довода, кроме "хочу". DenCoder пишет: http.sys для IIS - тоже малварь? из-за специфичности задачи у тебя получилось привести всего один пример, да и тот реализован в таком виде не от большого ума. DenCoder пишет: Скажу честно, что первым делом спросил у заказчика, для чего ему это. Он ответил, что хочет попробовать SOCKS 5 на уровне ядра. ну ок, но по моему ты снова |
|
Создано: 23 ноября 2013 15:29 · Поправил: DenCoder · Личное сообщение · #17 Довод один - так надо, а не "хочу". Ответ на интересующий вопрос выше в правке поста. P.S. Вот честно, так и знал, что не стоит сюда писать. Вместо того, чтобы кодить, постоянно ждёшь, что что-то предложат, да ещё и выбираешь адекватные ответы, чтоб не забанили. А ответов не по делу, провоцирующих ответов много - пользы ноль. Видимо не на тот сайт зашёл, наверное, придётся регаться на rsdn или wasm... Но посмотрю ещё. Если дадут, конечно. Если это PS не послужит поводом для закрытия топика (что практикуется часто, я заметил). ----- IZ.RU |
|
Создано: 23 ноября 2013 16:25 · Поправил: sendersu · Личное сообщение · #18 |
|
Создано: 23 ноября 2013 16:26 · Личное сообщение · #19 а смысл там регатся? хотя конечно виднее но на rsdn можно создать тему и анонимно, в некоторые темы можно и анонимно отвечать на васм... ну с таким же успехом мог бы написать напрямую x64, интересного мог бы сказать tarasco, и его блог который он удалил и сам пропал идти на поводу у заказчика даже если у него много денег это путь вникуда умей правильно выбирать методы решения задач и убеждать в этом заказчика по факту ты сам то знаешь много подходов в асинхронной обработок кроме ворк итемов и апс? все они оберкти итд которые исполняются на тех же уровнях можно чего то придумать и влезть на уровень ниже, прогнув многозадачность и заставив ос заниматся ненужной работой обработка скорости запросов и принятие аксепт при больних потоках упирается в другой потолок а не в ядреное принятие решения | Сообщение посчитали полезным: DenCoder |
|
Создано: 23 ноября 2013 16:53 · Личное сообщение · #20 DenCoder пишет: Конструктива не будет? Ок, будет. Я так понял, нужны общие советы "как сделать", а не готовый код? Если нужен код, в интернете нагугливается не одна реализация TDI сокетов. Еще можно глянуть исходники зевса и краба, там есть подобное. а обработка одного может занимать до нескольких секунд, то цикл приёма/передачи сразу вслед за акцептом не катит Если у вас сокс, не требуется никакой обработки вообще. Вам не нужно никаких циклов, просто в комплешене одного события, запускаем другое. Тут будут такие моменты: Обращаем внимание на IRQL, комплешены часто вызываются на DISPATCH_LEVEL, а запускать IRP нужно на PASSIVE_LEVEL. Если IRQL позволяет, запускаем новый IRP сразу, не позволяет - ставим воркитем. Обязательно проверять остаток ядерного стека через IoGetRemainingStackSize, иначе можно словить превышение уровня вложенности и срыв стека. Если стека становится мало - следующее действие переносится в воркитем. Сокс - это много исходящих соединений, здесь вы упретесь сначала в системные настройки TCP/IP, а затем в количество TCP портов. Нужно прописать следующие настройки реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters MaxUserPort = 65535 TcpTimedWaitDelay = 10 Это минимум нужный для Win7+, для старых виндов придется прописать еще пачку параметров, уже забыл каких, и применить патч для разлочивания TcpMaxHalfOpen. С этими настройками у вас получится максимум 64к исходящих. Если нужно больше - на сервере должно быть несколько ip адресов, и ваш код должен уметь разбрасывать исходящие соединения между ними. При правильном кодинге и правильных настройках, производительность вашего прокси будет зависить в основном от сетевой карты, весьма хороши серверные сетевухи Intel. Впрочем, потоки до 100мбит переварит любая, на 1gbit при большом PPS всё упрется в управление прерываниями, на 10gbit нужен тщательный системный подход к выбору всего железа и его настроек, узким местом может стать что угодно. ----- PGP key | Сообщение посчитали полезным: DenCoder |
|
Создано: 23 ноября 2013 17:17 · Поправил: DenCoder · Личное сообщение · #21 sendersu IOCP - это User mode DeviceIoControl -> ntoskrnl.exe -> afd.sys -> tdi.sys -> tcpip.sys. Да, 4-5 лет где-то назад видел табличку сравнения различных подходов к реализации сервера. IOCP выдержал стресс-тест с около 50К подключениями, если мне не изменяет память, в то время как на select'ах не держалось толком даже 100. Но напрямую через tdi и tcpip мы исключаем сразу 3 звена. reversecode пишет: ну с таким же успехом мог бы написать напрямую x64 Я представляю картину ) Одно время мне надоедали с запретом скриншота... поэтому пойму, если он меня пошлёт ) reversecode пишет: по факту ты сам то знаешь много подходов в асинхронной обработок кроме ворк итемов и апс? да если б знал, здесь не спрашивал. Проблема в том, что не знаю как правильно спросить у гугла. callbacks? asynchronous operations? Даже если reversecode пишет: можно чего то придумать и влезть на уровень ниже, прогнув многозадачность и заставив ос заниматся ненужной работой да, это ещё одна причина, почему задал вопрос здесь. Важен больше исследовательский подход, чем с точки зрения опыта А нужного Тараско найти не могу... ntldr пишет: Я так понял, нужны общие советы "как сделать", а не готовый код? Да, именно. Когда вижу готовый код, как правило он не всё равно весь не подходит по каким-то причинам. Даже копипастить отдельные части не имеет смысла. Понимаю принцип, реализую по своему. P.S. Кому не поставил спасибки, исчерпал лимит на сегодня. Поставлю потом. ----- IZ.RU |
|
Создано: 23 ноября 2013 17:26 · Поправил: reversecode · Личное сообщение · #22 ну погугли еще раз как строятся высоко нагруженые сервера на 100к )) никто ж не мешает? на васме блог тараски помоему в архиве выкладывали по васм и рсдн он гуглится как пользователь, но уже сто лет не появляется он хорошо подсказывал многим по сетеой части винды сокс сервер без авторизации, безсмысленнен, а при авторизации неимеет смысла его пихать в ядро разве что еще и авторизацию с пользовательской базов пароль логин ты запихнешь заказчик видмо омериканец а смысл в сокс проксике это очевидно tor дальнешее направление было ясно еще с первого поста гугл tarasco site:wasm.ru tarasco site:rsdn.ru но перечитывая его посты врядли польза будет а в блоге уже не помню что было, но внутренне устройство net вроде хорошо рассматривалось,многим в рунете нравилось, насколько я помню DenCoder пишет: да, это ещё одна причина, почему задал вопрос здесь. Важен больше исследовательский подход, чем с точки зрения опыта давай еще раз позовем мастера гойя и его грибы | Сообщение посчитали полезным: DenCoder |
|
Создано: 23 ноября 2013 17:42 · Поправил: DenCoder · Личное сообщение · #23 reversecode пишет: давай еще раз позовем мастера гойя и его грибы Где ты, о, великий? ntldr пишет: Обязательно проверять остаток ядерного стека через IoGetRemainingStackSize, иначе можно словить превышение уровня вложенности и срыв стека. Если стека становится мало - следующее действие переносится в воркитем. То есть рекурсивно? С возможностью переноса последующих рекурсий в другой тред? Если предположить, что на одну CP может потребоваться до 4К стека, 50К клиентов будут жрать 200 МБ памяти только в стеке. Не много ли? Сколько ни замечал - CP выполняется в контексте того же треда. Или может при некоторых условиях выполниться в другом? Вот стоит 2 CP на каких-то IRP в том же треде, пусть один минор TDI_LISTEN, второй - TDI_RECEIVE. Сработало второе событие, обработка занимает 5 мсек, через 1 мсек сработало первое. Вызовется ли первая CP во время работы второй? ... Хотя это дело экспериментов. Но как-то странно - из-за обсуждения у меня растёт лень... В целом спасибо, ntldr, развеяли страхи. Но я немного изменю алгоритм, не буду перегружать стек. Я видел подобную реализацию, в одном комплишене посылается другой IRP. Но мне почему-то это кажется не совсем и не всегда правильным, на мсдн вроде как убеждают, что в комплишенах должно быть минимум обработки. ----- IZ.RU |
|
Создано: 23 ноября 2013 18:28 · Личное сообщение · #24 4К стека, окстись! В ядре его 64к, и не один ты его используешь! Структуры описывающие контекст клиентов и буфера ввода/вывода должны быть в lookaside list'ах на paged pool'е. Я имел ввиду что если произошла буферизация, CP может вызываться в твоем потоке, до возврата из IoCallDriver. Если в таком CP сразу ставить следующее событие, можно исчерпать стек. Общепринятая практика в таком случае, проверять IRQL и лимит стека, и если нужно - выносить следующую операцию в workitem. Сколько ни замечал - CP выполняется в контексте того же треда. Или может при некоторых условиях выполниться в другом? На такое завязываться, ммм, как это помягче сказать... Completion routine может вызываться в DPC, там вообще некорректно говорить о треде. Забудь про треде, считай что CP может вызываться абсолютно где угодно. DenCoder пишет: Вызовется ли первая CP во время работы второй? DPC может вызваться когда угодно и прервать что угодно с более низким IRQL. Это не должно тебя волновать, делай код работающий корректно в любом случае. ----- PGP key |
|
Создано: 23 ноября 2013 18:53 · Поправил: DenCoder · Личное сообщение · #25 ntldr Благодарю! Да, не так легко переучиться после юзермода. В 2004 году была потенциальная возможность дрова научиться писать, да старенький нач. АСУТП метрополитена не согласился с моей кандидатурой. Gideon Vi пишет: ну ок, но по моему ты снова лезешь в какой-то блудняк. Шире смотреть: вся наша жизнь - блудняк! Шансы попасть в блудняк как и шансы падения метеорита. Тем не менее он упал под Челябинском. Кто не знает, в сентябре упал ещё один, в Африке, было 3 последовательных взрыва... Тот блудняк, на который ты ссылаешься - по моей же собственной глупости, несмотря на то, что что-то подобное предвидел... А в целом я солидарен с ntldr: Человека легко использовать и подставить! ----- IZ.RU |
|
Создано: 24 ноября 2013 02:48 · Личное сообщение · #26 |
eXeL@B —› Вопросы новичков —› TDI. Высоконагруженный ядерный сервер |