Здравствуйте, 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 или мьютекс из библиотеки. Они хоть управление другому треду отдать могут,
если блокировка длительная.
Здравствуйте, Pzz, Вы писали:
Pzz>И 10К соединений — это совсем немного по нашим временам. У меня есть личный опыт 300К...
Вот интересно, я понимаю что ОС внутри не только по номеру порта, но и по адресу идентифицирует.
То-есть 300к не выглядит нереалистично (хотя портов казалось бы 64к). Но если кто-то за НАТом сидит,
то уже кажется не реалистичным, т.к. в самом НАТе портов всего 64к...
Здравствуйте, fk0, Вы писали:
Pzz>>И 10К соединений — это совсем немного по нашим временам. У меня есть личный опыт 300К...
fk0> Вот интересно, я понимаю что ОС внутри не только по номеру порта, но и по адресу идентифицирует. fk0>То-есть 300к не выглядит нереалистично (хотя портов казалось бы 64к). Но если кто-то за НАТом сидит, fk0>то уже кажется не реалистичным, т.к. в самом НАТе портов всего 64к...
Если два соединения различаются хоть в каком-то из этих параметров, они разные. Т.е., {local-host, local-port} могут быть одинаковыми хоть у всех 300К, если внешние различаются.