Задать вопрос

Си или Go для приложения по обработке сетевого трафика до 1.5М пакетов/с?

Планируется проект по обработке сетевого трафика. Основная суть - взять сырой поток пакетов сетевой карты и извлечь из него различную статистику и метаинформацию. Далее это статистику надо сжать и отправить на сервер. Поток пакетов на входе до 1.5 миллионов пакетов/с.
Дополнительные требования - утилита должна поставляться в виде одного бинарного файла, поддержка x86 и ARM.

Первая мысль, которая меня посетила - это реализация на C/C++, основная причина - добиться высокой производительности даже на слабом/среднем железе.

Несколько знакомых посоветовали приглядеться к Go, мол всем твоим требованиям отвечает, но разработка на Go должна получиться лучше/проще.
Поизучал материалы по Go и не смог сформировать однозначного ответа по Go. Особенно смущает вопрос, не будет ли проигрыша в скорости работы.

Что можно почитать толкового относительно скорости С/C++ vs Go?
  • Вопрос задан
  • 2562 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 12
opium
@opium
Просто люблю качественно работать
ну напишите две простых проги для обсчета каких нибудь потоков и сравните скорость
Ответ написан
2ord
@2ord
Выбор в пользу Go:
  1. разумный компромис между надёжностью и производительностью. Касательно доводов против из-за производительности по сравнению с Си: всё зависит от структур данных, алгоритмов и их оптимизации для железа.
  2. простота разработки и отладки
  3. хорошая поддержка, наличие большого количества проектов и документация
  4. есть сборка в исполняемые файлы и библиотеки: Go Execution Modes.
  5. с интеграцией проблем быть не должно - записать файл-бинарник не проблема
  6. в долгосрочном плане может быть выигрыш при поддержке кода


Из недостатков выбора Go:
  1. Нужно время на знакомство и эксперименты
  2. Сразу хорошо написать не получится из-за пункта 1. Возможно, понадобится переписывать некоторые части или всю архитектуру программы пока не получится нужный результат.

Ответ написан
Olej
@Olej
инженер, программист, преподаватель
Языки программирования: скорость
По качеству сгенерированного нативного кода можно ожидать, что Go будет раз до 2-х (всего!) медленнее, но в плюсах получите а). скорость проектирования + б). возможность очень эффективного распараллеливания работы.
См. также Go конспект.
Ответ написан
@mantyr
Пишу много Golang кода с удовольствием:)
Для обработки сетевого трафика больше подойдёт модуль ядра Linux написанный на Си. Если кто-то умеет такое делать на Golang - дайте знать, с удовольствием послушаю, почитаю на эту тему... Агрегированные же данные (прилетающие от такого модуля) вполне хорошо обрабатывать на Golang (в этом случае можно не заморачиваться одной железкой, а поставить сразу несколько распределив по ним трафик).

P.S. Возможно речь идёт не о linux, но в топике это как-то отдельно не оговаривалось.
Ответ написан
@CMHungry
конечно, Си. Потому что придется всю обработку держать в kernel space, возможно, использовать DPDK. Переключения контекста kernel - user сожрут весь CPU на потоке 1.5 Мппс.

А на других языках кернел-модули писать, вроде, не получается.
Ответ написан
Комментировать
shpaker
@shpaker
Вольный хлебопашец
На гоу быстрее напишите программу. очевидно что читать ничего не надо чтобы понимать что тормознее работать будет, значительно больше исполняемый файл весить будет.
Ответ написан
AlexXYZ
@AlexXYZ
O Keep Clear O
Я бы предложил "поразмышлял" от обратного - на чём вообще формируется поток с такой скоростью передачи?
Ответ написан
@cthulhudx
На C/C++ с использованием Boost asio
Ответ написан
Комментировать
sim3x
@sim3x
Заказать разработку у специалиста
Ответ написан
Комментировать
ruddy22
@ruddy22
Спасение утопающих — дело рук самих утопающих
Попробуйте rust-lang
Ответ написан
Комментировать
@31415
системный инженер
Если на LuaJIT можно написать код, генерирующий 35 Mpps на ядро сервера, наверно и на Go так получится. Ещё могут буть полезны эта и эта ссылки.
Ответ написан
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Вот только еще не хватало сниффер от руки писать. А что, wireshark из коробки не справляется?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы