Re: 10K problem for keep-alive utility
От: fk0 Россия https://fk0.name
Дата: 27.01.24 11:41
Оценка:
Здравствуйте, avovana, Вы писали:

A>Добрый день, дорогие форумчане!


A>Есть файл со списком из 10 000 записей "ip+port".

A>Нужно мониторить состояние подключения по адресу. Реализовать чек "жив ли сервер", фактически.
A>И оповещать — выводить в консоль и файл запись "ts + address + up/down".
A>Всё это нужно делать быстро.

A>1ая реализация

A>epoll + main thread + output
A>Минус реализации, что проходимся в цикле по выданному пулу fd синхронно записывая в консоль, файл. А в это время уже события на fd новые могут придти.

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

A>2ая реализация

A>epoll + threads + background output

Так далеко не уедешь, ибо C10K problem. Всё равно потребуется epoll в потоках. Что у тебя 1 тред, что тред пул,
на тред приходится очень много соединений и работа с ними не может быть блокирующей. В перспективе тред-пул конечно
лучше, но внутри тот же epoll в каждом треде.

A>Подумал над memory mapped file + спин лок. Спин локом защищаем общую переменную — смещение. Поток подготовил строку для вставки в файл. Теперь ему нужно узнать по какому смещению её записать.

A>Он лочит спин лок, сохраняет себе смещение, обновляет его — прибавляет к нему длину строки, которую сейчас вставит. Отпускает спин лок. Вставляет по полученному смещению строку.
A>Т.е. критическая секция получилась маленькая.

Почему просто в памяти (если процесс один) нельзя иметь переменную (массив), зачем какой-то файл?
Зачем спинлок, когда можно готовый rwlock или мьютекс из библиотеки. Они хоть управление другому треду отдать могут,
если блокировка длительная.
Re[8]: 10K problem for keep-alive utility
От: fk0 Россия https://fk0.name
Дата: 27.01.24 11:46
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>И 10К соединений — это совсем немного по нашим временам. У меня есть личный опыт 300К...


Вот интересно, я понимаю что ОС внутри не только по номеру порта, но и по адресу идентифицирует.
То-есть 300к не выглядит нереалистично (хотя портов казалось бы 64к). Но если кто-то за НАТом сидит,
то уже кажется не реалистичным, т.к. в самом НАТе портов всего 64к...
Re[9]: 10K problem for keep-alive utility
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.01.24 11:51
Оценка:
Здравствуйте, fk0, Вы писали:

Pzz>>И 10К соединений — это совсем немного по нашим временам. У меня есть личный опыт 300К...


fk0> Вот интересно, я понимаю что ОС внутри не только по номеру порта, но и по адресу идентифицирует.

fk0>То-есть 300к не выглядит нереалистично (хотя портов казалось бы 64к). Но если кто-то за НАТом сидит,
fk0>то уже кажется не реалистичным, т.к. в самом НАТе портов всего 64к...

Почему нереалистично?

TCP-соединение идентифицируется четверкой чисел: {local-host, local-port, remote-host, remote-port}

Если два соединения различаются хоть в каком-то из этих параметров, они разные. Т.е., {local-host, local-port} могут быть одинаковыми хоть у всех 300К, если внешние различаются.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.