È difficile proporre una spiegazione solo in base ai dati forniti, ma ecco la mia ipotesi. Suppongo che tu abbia già controllato le ovvie sorgenti di latenza (quelle legate alla persistenza), che nessun comando di Redis stia tracciando la CPU nel slow log e che la dimensione dei dati del lavoro decapitati da Python-rq non sia enorme.
In base alla documentazione, Python-rq inserisce i lavori in Redis come oggetti hash e lascia che Redis scada i tasti relativi (500 secondi sembra essere il valore predefinito) per eliminare i lavori. Se si dispone di un certo throughput serio, in un punto, si avranno molti elementi in Redis in attesa di essere scaduti. Il loro numero sarà elevato rispetto ai lavori in sospeso.
È possibile controllare questo punto osservando il numero di elementi che devono essere scaduti nel risultato del comando INFO.
La scadenza di Redis si basa su un meccanismo pigro (applicato quando si accede a una chiave) e su un meccanismo attivo basato sul campionamento della chiave, che viene eseguito nel ciclo di eventi (in modalità pseudo sfondo, ogni 100 ms). Il punto è quando il meccanismo di scadenza attivo è in esecuzione, nessun comando Redis può essere elaborato.
Per evitare un impatto eccessivo sulle prestazioni delle applicazioni client, viene elaborato solo un numero limitato di chiavi ogni volta che viene attivato il meccanismo attivo (per impostazione predefinita, 10 chiavi). Tuttavia, se si scopre che oltre il 25% delle chiavi è scaduto, tenta di scadere più chiavi e cicli. Questo è il modo in cui questo algoritmo probabilistico adatta automaticamente la sua attività al numero di chiavi che Redis deve scadere.
Quando molte chiavi devono essere scadute, questo algoritmo adattivo può influire significativamente sulle prestazioni di Redis. Puoi trovare ulteriori informazioni here.
Il mio suggerimento sarebbe di cercare di impedire a Python-rq di delegare la pulizia degli elementi a Redis impostando la scadenza. Questo è comunque un design scarso per un sistema di accodamento.
fonte
2013-03-07 19:47:47
Che aspetto ha il tuo utilizzo? C'è un sacco di grandi 'SORT' sta succedendo? Utilizzi 'KEYS' nel codice di produzione? Stai eseguendo il 'MONITOR' da qualche parte? Qual è la tua strategia di persistenza? –
Abbiamo disabilitato la persistenza in questa istanza. Attualmente non si usano i comandi 'KEYS' o' MONITOR' ovunque. Non abbiamo nemmeno "SORT", almeno per quanto ne so. Questa istanza è dedicata a 'rq' (www.python-rq.org). –