![]() |
paralelni download
treba da napravim php skriptu koja skuplja neke podatke sa neta, i zbog perfomansi to treba da se radi u paraleli, znaci da se otvore sve konekcije, saceka malo i pogleda sta je skinuto, a ne klasicna skini jedno, skini drugo, skini trece sekvenca...naravno postojace kesiranje skinutih podataka, ali ocekivani cache hit rate je vrlo nizak tako da cu morati da obratim paznju na perfomanse, da se to sve ne bi vuklo najstrasnije..
Imam dve ideje, jedna je da probam da otvorim vise socketa i da onda koristim non-blocking select da ih citam u paraleli kako stizu podaci, ili druga varijanta da pomocu exec pokrenem nekoliko instanci wgeta (svaku u zasebnom shellu) koje bi skidale rezultate u fajl, i onda na kraju preparsiram te fajlove. Prvu varijantu sam vec radio u perlu, ali nemam pojma kako to radi u php-u, jel ima neko iskustva sa tim ? Dinke ? Nemam pojma koja varijanta je bolja u smislu perfomansi (pre svega me zanima server load vs. brzina), sta mislite ?? Jel imate mozda neku bolju ideju ? Da li postoji neka varijanta da se forkuju procesi u php-u pod apachom ? to bi isto mogao da bude alternativni pristup, mada sumnjam da bi to imalo bolje perfomanse... |
Moj savet je da ako si ograničen na PHP radiš preko neblokirajućih socketa i da onda postaviš sinhronizacionu barijeru kada se svi završe i potom pređeš na drugi ciklus obrade, pa opet na barijeru - i tako dok ne završiš sve.
Problem je što će ti to biti mnogo sporije nego kad imaš niti jer kada jedna nit završi jedan UnitOfWork može odmah da počne sledeći dok ti sa barijerom moraš da sačekaš da svi završe da bi počeo novi ciklus obrade. Sad zamisli da su svi zahtevi OK (cca 2-3 sec) a da je jedan timeout (ie 90 sec) - što imaš veći broj "niti" efikasnost ti opada. Ono što ti definitvno ne preporučujem je forkovanje procesa ako ti PHP radi pod Apache-om, i ovako je dovoljno komplikovano jer je AFAIK threadsafe misaona imenica za PHP. Mada je uvek bolje sa nitima nego njenim simulacijama - ako nisi ograničen samo na PHP - pogledaj s leve strane ovoga unosa za preporku platforme :) |
ma nisam ja za pitona :), ja bih koristio perl za takve stvari, ali za sada se drzim ideje o php-u...
sto se tice ovoga sto pominjes sa kasnjenjem, to se lako resi sa timeoutom: ako nisu stigli podaci cancelujem taj request i krenem iz pocetka novi krug... za neblokirajuce sockete to nije problem uraditi... |
Dinke je u jednoj ranijoj temi spominjao interesantan članak koji ti može pomoći kod asinhronih zahteva.
Što se tiče problema sa kašnjenjem izgleda da sam pogrešio - prikačio sam uz poruku programče koje pokazuje da sa povećanjem konekcija po ciklusu efikasnost raste. Program simulira rad sa socketima u asinhronom i sekvencijalnom režimu koristeći se izvesnim matematičim aproksimacijama i prikazuje koliko je puta asinhroni režim brži od sekvencijalnog - dobijeni rezultati su veoma interesantni. Nemojte se iznenaditi time što je kod u Python-u :D Kôd:
""" |
zanimljivo programce, jedino nisam siguran da je raspored kasnjenja opisan uniformnom raspodelom, pre bih rekao da je to neka poasonova ili mozda gausova raspodela... nemam pojma da li to utice na krajnji zakljucak, doduse...:)
Uzgred ovaj link je bas ono sto mi treba, thanx :) |
Uniformnu raspodelu sam uzeo zato što mi se to čini kao najgori slučaj - želeo sam da dam pesimističku sliku minimalnog ubrzanja.
Nije nikakav problem da ubaciš drugu raspodelu, ili čak da ga nahraniš živim podacima - ovo je bio samo proof-of-concept. Hehe, upravo sam dobio perverziju od ideje ako ti je rešenje sa asinhronim zahtevima presporo: algoritam u zavisnosti od dosadašnjih rezultata i parametara predviđa optimalnu dužinu ciklusa pred početak narednog :) |
tja, sad cu da vidim sa klijentom koliko para je on spreman da plati, pa cemo u zavvisnosti od toga da komplikujemo algoritam :)
Thanx na ideji u svakom slucaju.. |
E, tek sad vieh ovu temu :)
Lepo ti je rekao Petar, mozes da furas non-blocking sockete, ili pcntl f-je. Ja sam svojevremeno pravio overture multisocket parser, i to radi, ali ne bas savrseno, jer je PHP "CPU intensive" jezik, pa socketi posle odredjenog vremena pocnu da pucaju samo tako. Moj savet, drzi se perla, ili mozda da probas sa pcntl-om, a mozda cak i sa curl-om, posto u verziji php5 moze da se radi sa mutliple konekcijama(nisam probao ali cini mi se da je pomenuto u manualu). |
Drzi se perla. :D
POE all the way. |
kako smanjiti opterecenje CPU?
odlucio sam da se malo igram sa curl multi funkcijama, i nasao sam jedan primer upotrebe na php.net, i po svemu sudeci to je jedini primer koji postoji o tome. :1027:
Elem tamo pise nesto ovako: PHP kôd:
Ono sto mene zanima je da li ova petlja, ovako kako je napisana, nepotrebno opterecuje CPU? Da li bi bilo pametnije dodati neki mali usleep() na kraj petlje, da bi se smanjio broj pristupa socketima, u ono vreme kad na njima nema nicega za citanje. Ili bi to mozda imalo suprotan efekat, i usporilo rad, bez smanjenja server load-a ? Jel ima neko nekog iskustva sa ovim? |
Vreme je GMT +2. Trenutno vreme je 21:29. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.