четверг, 16 февраля 2017 г.

Mmaped Netlink in Linux kernel

В процессе поиска решения одной интересной задачи, связанной с zero-copy между ядром Linux и приложением пользователя, я наткнулся на реализацию mmaped Netlink IO от Patrick McHardy.
Если кратко, Netlink это способ межпроцессной коммуникации между ядром Linux и приложениями пользователя, использующий существующее socket API.
Приложение открывает сокет, тип которого AF_NETLINK, указывает получателем ядро, и с помощью функций socket API, передает через открытый сокет данные. Все хорошо, если бы не накладные расходы на копирование данных между user-space и kernel-space. Для больших объемов данных такой способ не очень подходит. 

вторник, 29 ноября 2016 г.

Простой echo сервер на libev

В одном из своих проектов я активно использую поллинг при помощи epoll(7). Проект этот - HTTP(s) прокси с довольно развесистой бизнес логикой. В приложении постоянно приходится менять маску событий, а так же одновременно обрабатывать довольно большое количество сетевых соединений.

Когда проект начинался, всю обвязку вокруг epoll мы сделали сами, ну и разумеется вдоволь прошлись по граблям. За пример, при разработке, я брал тоже прокси, написанное как раз с целью понять как обрабатывать большое количество соединений в однопоточном приложении и при этом не утонуть в "code spaghetti". Ссылочка на этот проект: https://github.com/gpjt/rsp

Ссылку на свой проект дать не могу - код проприетарный.

Когда все более-менее влетело, я начал смотреть по сторонам на предмет "а нельзя ли немного упростить код". И разумеется код упростить можно было, используя что-то типа libevent или libev. Обе эти библиотеки предоставляют API для портируемой работы с событиями и избавляют от необходимости самому писать event-loop.
libevent, насколько я понял, по-старше будет, но на данный момент не развивается, поэтому ее я оставил на потом и решил написать небольшой примерчик использую libev.

Итак...

пятница, 18 ноября 2016 г.

GDB & SIGPIPE


При отладке сетевых приложений в GDB иногда возникает ситуация когда GDB останавливает приложение перехватывая сигнал SIGPIPE, что является для него нормальным поведением.
У себя в приложении SIGPIPE мы просто игнорируем и обычное поведение GDB для нас создает проблемы. Решается ситуация следующим образом:

handle SIGPIPE nostop noprint pass

в командной строке GDB.

понедельник, 15 февраля 2016 г.

Подготовка окружения для сборки пакетов под OpenWRT

Подготовка окружения для сборки пакетов под OpenWRT



В рамках одного из проектов пришлось столкнуться с разработкой под OpenWRT. Теперь я просто нинздя по кастомизации прошивки на базе OpenWRT для DIR-320 version A1. Вероятно те, кто занимаются этим постоянно, не найдут тут ничего нового. Так что, заметка скорее для себя. Итак, по шагам.

четверг, 22 января 2015 г.

Краткое введение в Erlang C-node

Однажды в жизни Erlang проекта может возникнуть необходимость вызывать функции из внешних библиотек(FFI). Увы, как бы нам ни хотелось остаться в рамках функционального программирования.
Erlang предоставляет следующие способы выполнения FFI:
Эти способы являются популярными, но имеют существенный недостаток - оба они являются не безопасными по отношению к работе Erlang VM.

понедельник, 29 декабря 2014 г.

Опрос сетевых устройств по SNMP в Erlang

Где-то чуть более года назад понадобилось написать многопоточное приложение для опроса сетевых устройств. И так совпало, что необходимость написания такого приложения совпала с интересом к Erlang. Оказалось что задача эта как раз для Erlang. А тут еще и готовая библиотека есть в OTP для работы с SNMP. И документация к этой библиотеке есть.
Вот только документация мне показалась достаточно многословной и объемлющей, для моей весьма скромной задачи. Поэтому я и написал этот краткий экскурс. Надеюсь он кому-нибудь да пригодится.

вторник, 28 октября 2014 г.

Как на самом деле выглядит Haskell код

Оригинал статьи расположен тут

Примечание переводчика:
Прошу отнестись снисходительно к качеству перевода. Буду благодарен за конструктивные советы по переводу терминологии. Я не нашел адекватного и короткого перевода термину desugar, поэтому позволил себе изменить заголовок.

Ядро языка Haskell маленькое и большая часть Haskell кода преобразуется в следующее:
  • лямбды/применение функций
  • алгебраические типы данных/case выражения
  • рекурсивные let связывания
  • классы типов и специализация, или
  • вызов сторонних функций
Однажды разобравшись с этими концепциями у вас будет основа для понимания всего остального в языке. Как результат, язык будет восприниматься компактным и последовательным.

Я хочу показать как многие высокоуровневые возможности преобразуются в низкоуровневые примитивы.