🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
2 messages
2 total messages Started by Arek Wed, 09 May 2012 12:19
zapis strumieni multicastowych do pliku a utrata pakietów
#72456
Author: Arek
Date: Wed, 09 May 2012 12:19
85 lines
3685 bytes
Witam

Borykam się z małym problem dot. zapisu odebranego po IP strumienia 
danych (strumień multicastowy) do pliku - wygląda na to, że system się 
nie wyrabia i gubi odbierane ramki z interfejsu eth0 w czasie zapisu na 
dysk - program ich nie otrzymuje. Strumień wejściowy od 10Mbps do 
40Mbps, ale ten parametr nie gra roli, bo i przy 10Mbps się nie wyrabia 
system.

Otwieram socket w trybie nieblokującym, funkcja poll sprawdzam czy są 
dane do odczytu (flaga POLLIN), następnie ręcznie filtruję wybrane ramki 
i zapisuję je do pliku. Próbowałem buforować zapisywane dane i zapisywać 
je w większej ilości (bufor w programie na 10000 ramek po 188bajtów przy 
jednym wywołaniu write - pomaga ale nie do końca - gubi mniej, ale dalej 
gubi), zapisywać w trybie nie blokującym, czytać z socketa w trybie 
blokującym, ale co bym nie robił to i tak co jakiś czas system gubi 
ramki przychodzące na interfejs eth0. W przypadku gdy nie zapisuje 
odebranych ramek tylko je analizuje wszystko jest ok - system nie gubi 
ramek i dostarcza je wszystkie do mojego programu. Próbowałem na różnych 
maszynach (systemy 32/64bit), ale nic mi to nie pomogło.

Proces programu to 4% zajętości procesora podczas zapisu i 2% bez zapisu 
na wiekowej już maszynie na której to go testuję. Zauważyłem, że vmstat 
w chwili gdy występują utraty pakietów zgłasza bo (Blocks sent to a 
block device (blocks/s)) na poziomie 30.000 (normalnie 0) i wa (Time 
spent waiting for IO) na poziomie 30 (normalnie 0). Wydaje mi się, że te 
30.000 bloków/s będzie tu kluczem - może zmusić system by częściej 
zapisywał, ale mniejszą ilość (jakiś flush po write)? Czy może coś w 
programie można usprawnić?

pozdrawiam
Arek


Poniżej najważniejsze fragmenty programu:

bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));

setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&imreq, 
sizeof(struct ip_mreq));

fcntl(sock, F_SETFL,O_NONBLOCK|FASYNC);

pfd[0].fd = sock;
pfd[0].events = POLLIN;

ts_fileptr=open(ts_filename,O_WRONLY|O_CREAT|O_TRUNC, 
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);

if ((flags=fcntl(ts_fileptr, F_GETFL))==-1)
{
    perror("Error get flags for write");
    exit(0);
}

if (fcntl(ts_fileptr, F_SETFL, flags | O_NONBLOCK)<0)
{
    perror("Error set flags for write");
    exit(0);
}

do
{
if (poll(pfd,1,3000))
{
   if (pfd[0].revents & POLLIN)
   {


       recived = recvfrom(sock, buffer, MAXBUFSIZE, 0, (struct sockaddr 
*)&saddr, &socklen);

/*
tu funkcje analizujące, filtrujące, buforujące, itp...
*/

if (write(ts_fileptr,outbuff,chunksize)!=chunksize )
             {
               perror("Error in write");
               exit(0);

             }
     }
   }
} while (1);
Re: zapis strumieni multicastowych do pliku a utrata pakietów
#72457
Author: MaW
Date: Wed, 09 May 2012 21:38
13 lines
1640 bytes
Użytkownik "Arek" <arek@from.hell.pl> napisał w wiadomości 
news:jodnc3$2rs$1@node2.news.atman.pl...
> Witam
> Borykam się z małym problem dot. zapisu odebranego po IP strumienia

Jaki system plików? moje doświadczenia z porównaniem xfs z ext4 wykazały 
przewagę tego drugiego przy dużej ilosci zapisów. Poza tym odpal iostat -x 1 
i obserwuj ostatnią kolumnę - "disk utilisation" Jesli dysk jest przeciążony 
to zobaczysz tam wartości rzędu 80-100%. W takim wypadku może warto 
zainteresować się flaschcache. Taki problem może też pojawic się, gdy dysk 
zaczyna szwankować - wtedy też zobaczysz wysokie wartości util.

MaW 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads