Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 27 odgovora
  • 12.399 pregleda

Najnovija ↓

Re: Simple client.c i server.c? 03.09.2002. u 18:18 · pre 294 meseca #21
Citat:
Predrag Damnjanovic:
Code:

    while (1)
    {
        // accept connections
        newsock = sockaccept(pfs_sock);
        if (newsock < 0)
        {
            perror("sockaccept");
            exit(1);
        }
        pthread_create(&tid, NULL, (void*) &pfs_thread, (void*) newsock);
    }




Peco, ja se polomih da objasnim da ovaj pristup ne valja. Da budem precizniji, može lepo da radi sa malim brojem zahteva, ali kod većeg saobraćaja dolazi do naglog pada performansi.

Ono što ti predlažem (Linux varijanta) je:
1. Kreiraš socket koji "sluša" port 80
2. Kreiraš jedno 5 niti (ili forkuješ 5 procesa, kako ti je lakše) i svaki od njih zove accept () na isti onaj socket koji si kreirao pod 1). Dakle, pthread_create zoveš samo na početku programa. Svaka od ovih niti (procesa) obrađuje po jedan korisnikov zahtev, a onda opet zove accept() i to je baci u "usnulo stanje" dok ne stigne sledeći klijent.

Potpis
IOCC
Re: Simple client.c i server.c? 03.09.2002. u 18:55 · pre 294 meseca #22
Peco legendo, demantovanje je ovde sasvim DOBRODOSLO :) Ja volim ako mi neko ukaze na gresku. Ali takve sitne stvari... :)

Citat:

P.S. Leko, nisam hteo nista lose, izvini ako si pomislio da sam hteo da te demantujem.

Re: Simple client.c i server.c? 03.09.2002. u 21:18 · pre 294 meseca #23
Citat:
Dragi Tata:
Citat:
Predrag Damnjanovic:
Code:

    while (1)
    {
        // accept connections
        newsock = sockaccept(pfs_sock);
        if (newsock < 0)
        {
            perror("sockaccept");
            exit(1);
        }
        pthread_create(&tid, NULL, (void*) &pfs_thread, (void*) newsock);
    }




Peco, ja se polomih da objasnim da ovaj pristup ne valja. Da budem precizniji, može lepo da radi sa malim brojem zahteva, ali kod većeg saobraćaja dolazi do naglog pada performansi.


Tata, naglasio sam 'i digne (ili probudi vec uspavani) thread".
Nebitno je za ovu diskusiju da li otvaram thread pri svakoj konekciji ili budim uspavani thread.
Zamisli da imam 5 threada koji spavaju, i da ih pri novoj konekciji samo budim - i prepustam im komunikaciju sa novim klijentom.
Kako onda f-ja accept moze da probudi sve procese?
Re: Simple client.c i server.c? 03.09.2002. u 21:43 · pre 294 meseca #24
OK, Peco, nisam te razumeo najbolje. Ako radiš tako kako si ti napisao (glavna nit čeka na accept i po potrebi "budi" neku od niti koje spavaju), onda zaista nećeš imati problema sa thundering herd-om. Međutim, u praksi se ne radi tako (opet zbog performansi), već svaka od tih "uspavanih" niti direktno zove accept (odnosno, često select, pa tek posle accept, ali to je nebitno za ovu priču) za isti socket. Kada stigne klijent, kod nekih Unixoida (među njima je i Linux 2.2) će se desiti da se sve te niti "probude" u isto vreme, a ne samo jedna.

Pogledaj malo http://httpd.apache.org/docs/misc/perf-tuning.html#compiletime

ili još bolje fajl http_main.c iz Apache servera.
Potpis
IOCC
Re: Simple client.c i server.c? 03.09.2002. u 21:51 · pre 294 meseca #25
Citat:
Dragi Tata:
Međutim, ovo rešenje ne važi za sve Unixoide: kod nekih od njih bi se desilo da se probude sve niti (procesi) koji zovu accept i onda nastaje problem koji se popularno naziva thundering herd, a kod nekih verzija će aplikacija jednostavno da "pukne". Više detalja možete naći u knjizi koju sam gore pomenuo.


Pa nista, specijalno u principu radi se o jednoj kriticnoj sekciji(CS).

CS(nemoj neko da mi je pomislio da je rec o counter stike-u :) ) je deo programa u kojem sme da bude samo jedan proces, ukoliko se u tom delu programa nadju dva ili vise procesa kola krecu nizbrdo, ovim problemom bavili su se ljudi pocetkom 60 tih godina proslog veka. Unutar Sys V interprocesne komunikacije postoje semafore, koje regulisu pristup kriticnim sekcijama(man semop). S tim sto su semafore malo uopstenje kriticne sekcije jer dozvoljavaju da ogranicite broj procesa koji sme da udje istovremeno u kriticnu sekciju.

za detalje oko semafora pogledajte (man semop). Medjutim ukoliko vas UNIX ne podrzava semafore kao sistemski poziv uvek mozete umesto semafore da ekskluzivno kreitrate datoteke i na taj nacin kontorlisete ko moze da udje a ko mora da saceka. Uz primere koje sam na pocetku poslao pogledajte program shmchat.c jer se u tom primeru koriste semafore. (gde P; u programu oznacava ulazak u kriticnu sekciju a V; izlazak iz kriticne sekcije)

e pa da se vratimo na nas accpet, posto on na neki nacin moze da se smatra kriticnom sekcijom svesto bi trebalo uraditi jeste
P
accept
V

i stvar je resena, ukoliko neko pokusa da udje u kriticnu sekciju dok ona nije slobodna, taj proces se "zaspati" i probuiti se kada bude bio moguc ulazak u kriticnu sekciju.
Potpis
http://speedy-order.com
Re: Simple client.c i server.c? 04.09.2002. u 13:35 · pre 294 meseca #26
Ima jedna stvar u prici o Apache web serveru koja nikome izgleda nije pala na pamet - Apache nije najbrzi web server ljudi. Postoje mnogo brzi od njega. Na stranu to sto je najpopularniji, ali najbrzi definitivno nije.

Drugo, na Apache 2.0.x su radili mnogo vise na optimizaciji za Windows platformu nego na optimizaciji za ostale sisteme, izgleda da im je namera da totalno dokrajce sve ostale web servere za Windows , specijalno IIS koji je smesan u poredjenju sa Apache web serverom.
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: Simple client.c i server.c? 04.09.2002. u 14:09 · pre 294 meseca #27
Citat:
Dragi Tata:
već svaka od tih "uspavanih" niti direktno zove accept (odnosno, često select, pa tek posle accept, ali to je nebitno za ovu priču) za isti socket. Kada stigne klijent, kod nekih Unixoida (među njima je i Linux 2.2) će se desiti da se sve te niti "probude" u isto vreme, a ne samo jedna.

E sad je jasno Tata :)
Zahvaljujem na odgovoru.
Zahvaljujem i NULL-u za objasnjenje kako organizovati semafore u multi-thread aplikacijama.
Re: Simple client.c i server.c? 04.09.2002. u 18:23 · pre 294 meseca #28
Citat:
Dejan Lozanovic:

e pa da se vratimo na nas accpet, posto on na neki nacin moze da se smatra kriticnom sekcijom svesto bi trebalo uraditi jeste
P
accept
V


Tako je. Upravo to rešenje koristi Apache kod sistema koji "pate" od thundering herd problema. Međutim, ako pogledaš onaj link koji sam ostavio na tekst o thundering herd-u pod Linux-om, videćeš kolika je razlika u performansama kad se radi na način koji si opisao u poređenju sa rešenjem ugrađenim u kernel koje omogućava da se accept zove neserijalizovano.
Potpis
IOCC
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme