[Python] Python, redis e bottleneck

Roberto De Ioris roberto a unbit.it
Gio 19 Dic 2013 13:07:29 CET


>>
>> 2013/12/19 Pietro Battiston <me a pietrobattiston.it>
>
>
>> [...]
>>
>> Io credo che ci possa essere relazione a come e' scritto il codice.
>
>
> OK, ragionevole dubbio. Prendi _questo_ codice:
>
> import redis
> import random
>
> r = redis.Redis(db=0)
>
> try:
>     while True:
>         r[random.random()] = random.random()
> except KeyboardInterrupt:
>     r.flushdb()
>
>
> che gira su un vecchio Intel Core2 Duo CPU T7300, a 2 GHz, con 4 GB di
> RAM DDR2 a 667 MHz.



Scusa ho iniziato a leggere il thread solo ora, spero di avere tutti gli
elementi per risponderti:


>
> - Cosa mi aspetto: che almeno una delle due CPU sia fissa al 100%.


improbabile, sia python che redis passano parecchio tempo in kernel space
per trasferire i dati l'uno all'altro


> - Cosa vedo se avvio "top": redis-server non è mai sopra al 45%, Python
> non è mai sopra al 75%.


direi realistico, anche se usando random() hai inficiato il test visto che
su Linux random() apre /dev/urandom, quindi di nuovo un bel context switch
in kernel space.

> - Cosa succede se invece che TCP-IP utilizzo un socket unix: l'utilizzo
> di CPU da parte di Python sale (e la performance pure, e parecchio), ma
> rimanendo comunque sotto l'80%.

il tempo in kernel space diminuisce, i socket unix sono piu' efficienti
(anche se tecnicamente e' meglio dire che sono estremamente piu' semplici)


> - Cosa posso immaginare che stia succedendo: che ci sia una latenza tra
> CPU e cache, o tra una CPU e l'altra CPU, o tra le CPU e la RAM, che
> "top" non sia affidabile al 100%.


no no fermo, i risultati che hai sono in linea con il tuo approccio, il
collo di bottiglia e' il tuo hardware nel suo insieme :)

>
> - Cosa me ne frega: pura curiosità, e magari pure un indizio di quanto
> parallelizzare codice che utilizza in modo intensivo redis possa o meno
> migliorare le prestazioni in modo lineare, o se viceversa qualunque cosa
> mi stia facendo da bottleneck adesso si riproporrebbe anche
> parallelizzando, magari su più di 2 CPU.
>


redis e' mono thread, puoi 'parallelizzare' la parte python ma visto che
l'hardware ha "solo" 2 cpu e hai comunque 2 processi fissi nell'equazione
(python e redis) non otterresti alcun vantaggio (anzi peggioreresti)

Spero di averti tolto i dubbi :)

-- 
Roberto De Ioris
http://unbit.it


Maggiori informazioni sulla lista Python