Где я могу найти эталонные тесты для различных сетевых архитектур?

Где я могу найти эталонные тесты для различных сетевых архитектур?

Я играю с сокетами/потоками/вилками, и я хотел бы знать, что лучше всего. Я подумал, что должно быть место, где кто-то уже изложил все плюсы и минусы различных архитектур для службы сокетов, перечислил тесты с работающим кодом.

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

Многие люди, с которыми я разговаривал, говорят, что я должен просто использовать однопоточный выбор. Но я вижу аргумент в пользу потоков, когда вы сохраняете информацию о состоянии внутри потока, чтобы упростить код. Каков компромисс между написанием моей собственной структуры состояния и использованием проверенной архитектуры потоков.

Мне также говорили, что разветвление — это плохо... но когда вам нужно 12000 подключений к машине, которая не может увеличить лимит открытых файлов на процесс, разветвление — это вариант! Разветвление также является хорошим вариантом для стабильности, когда у вас есть один процесс, который нужно перезапустить, и он не мешает другим.

Извините, это один из моих длинных вопросов... так много переменных остаются пустыми.

Спасибо, Ченз.


person Crazy Chenz    schedule 25.11.2009    source источник


Ответы (2)


редактировать: вот ссылка, которую я искал, это целая статья, отвечающая на ваш вопрос. http://www.kegel.com/c10k.html

Существуют веб-серверы, разработанные по всем трем моделям (форк, поток, выбор). Людям нравится тестировать веб-серверы.

http://www.lighttpd.net/benchmark

У Libevent есть несколько тестов и ссылки на материалы о том, как выбрать модель select() по сравнению с многопоточной моделью, как правило, в пользу использования модели libevent. http://monkey.org/~provos/libevent/

person Peter Cordes    schedule 08.12.2009

Очень сложно ответить на этот вопрос, так как многое зависит от того, что на самом деле делает ваш сервис. Должен ли он запрашивать базу данных? читать файлы из файловой системы? выполнять сложные расчеты? уйти и поговорить с какой-нибудь другой службой? Кроме того, насколько долговечны клиентские соединения? Могут ли соединения иметь некоторое семантическое взаимодействие с другими соединениями, или все они рассматриваются как независимые друг от друга? Возможно, вы захотите позже подумать о балансировке нагрузки вашего сервиса на несколько серверов? (Если это так, вы могли бы с пользой подумать об этом сейчас, чтобы с самого начала можно было разработать любую необходимую помощь.)

Как вы намекаете, обслуживающая машина может иметь ограничения, которые взаимодействуют с различными методами, направляя вас к тому или иному ответу. У вас есть ограничение файлового дескриптора для каждого процесса, но помните, что у вас также может быть таблица процессов фиксированного размера! В любом случае, сколько одновременных клиентов вы ожидаете?

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

Помните историю... fork() дешев в мире Unix, но создание новых процессов относительно дорого в Windows. OTOH, потоки Windows легковесны, тогда как потоки всегда были немного чужды Unix и получили широкое распространение лишь относительно недавно.

person crazyscot    schedule 06.12.2009