LINUX.ORG.RU

многопоточный ping на perl

 , ,


0

2

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

сразу говорю, просто любопытно.

сейчас смог осилить следующий вариант - код на перл создает 150 нитей каждая из которых делает 3к пингов без таймаута. по факту прилетает около 3к пакетов в секунду прогружая одно 3ггц ядро впс сервера на 50-60%

в связи с чем есть несколько вопросов

1) можно ли на перле написать чтото что будет выдавать 300-800к пакетов в секунду? вообще пригоден ли для этого перл? вроде как говорят он хорошо справляется с многопоточностью

2) нужно ли как либо оптимизировать ос? сейчас используется центос7 в минимальной установке

3) можете сказать в каком направлении гуглить и что почитать для реализации задуманого?

4) если всеже использовать перл то мне продолжать использовать net::ping или делать это както иначе?

#!/usr/bin/perl -w
use threads;
use Net::Ping;

my $ip = '192.168.1.2';

my $p = Net::Ping->new("icmp",1 ,1024);
my $s = "ping $ip";


my @threads;

for my $i (1..150) {
 push @threads, threads->create(\&get_now, $i);
}

foreach my $thread (@threads) {
$thread->join();
}

sub get_now
{

for (0..3000) {
$p->ping($ip);
}

p.s. в коде нехватает одной закрывающей скобки? оО но ведь работает.

сразу говорю, просто любопытно

да верю, верю, чо ты

zolden ★★★★★
()

многопоточный на perl
2 ответа
ни одного про gnu parallel

эх, молодёжь...

utf8nowhere ★★★
()

можно ли на перле написать чтото что будет выдавать 300-800к пакетов в секунду?

Можно, если приложение распараллелено, т.е. состоит из N процессов, где N зависит от того, как генерируются пакеты и от количества ядер CPU.

Проблема скорее в том, что для Perl это N может быть на порядок больше, чем для Crystal или C.

вроде как говорят он хорошо справляется с многопоточностью

Справляется хорошо, но многопоточность ужасная, поскольку таки да, нормальная многопоточность с интерпретируемым языком программирования - слабо совместимы: как без интерпретатора у вас код в потоке будет выполняться? Правильно, никак! Ну так вот в каждый поток копируется весь код интерпретатора, а заодно ещё и все переменные по необходимости копируются, если не объявлены как :shared. Фактически это тот же CoW как для fork'а, только существенно более тормозной.

ИМХО профит в потоках на Perl абсолютно минимален (возможность использования shared-переменных, меньше накладные расходы ядра ОС на хранение/переключение контекста), а геморроя по сравнению с форком - ощутимо больше.

Зато на Perl отлично пишутся асинхронные приложения, так что AnyEvent::FastPing + обычный fork должны помочь отцу русской демократии :)

DRVTiny ★★★★★
()
Последнее исправление: DRVTiny (всего исправлений: 1)

А что, нити вообще что-то дадут в плане скорости отсылания пинга? Что-то я сомневаюсь. Сделал бы через select на крайний случай

anonymous
()
Ответ на: комментарий от DRVTiny

внял вашим словам) с форком все ясно но есть еще 1 вопрос

как в модуле AnyEvent::FastPing увеличить размер отсылаемого пакета?

нашел в FastPing.xs

#define HDR_SIZE_IP4 20

что соответствует 20 байтам на 1 пинг запрос согласно tcpdump

поменял, сделал perl makefile.pl && make && make install

но размер так и остался 20 байт..

или наращивать размер пакетов смысла нет? и вметсо этого лучше наращивать количество?

diakon2
() автор топика
Ответ на: комментарий от diakon2

#define HDR_SIZE_IP4 20

Это размер IPv4 заголовка, его менять не нужно.

Если хотите увеличить размер пакета, добавьте к структуре PKT еще данных. После uint32_t stamp_lo; допишите uint8_t payload[33]; например. Это увеличит размер пакета на 33 байта.

Если вам нужен серьезный генератор (который на 10G карточках сможет давать теоретические 14.88млн пакетов), посмотрите в сторону netmap или dpdk. У них в комплекте есть готовые генераторы пакетов, но можно с их помощью написать и свой.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.