[Python] Python, redis e bottleneck

Pietro Battiston me a pietrobattiston.it
Gio 19 Dic 2013 12:52:37 CET


Il giorno gio, 19/12/2013 alle 11.14 +0000, enrico franchi ha scritto:
> 
> 
> 
> 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.

- Cosa mi aspetto: che almeno una delle due CPU sia fissa al 100%.
- Cosa vedo se avvio "top": redis-server non è mai sopra al 45%, Python
non è mai sopra al 75%.
- 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%.
- 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%.
- Cosa non riesco nemmeno a immaginare che stia succedendo:
probabilmente varie cose, motivo per cui ho scritto in lista.
- 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.

ciao

Pietro




Maggiori informazioni sulla lista Python