2013-01-21 25 views
12

Da BoneCP doc ufficiale: http://jolbox.com/index.html?page=http://jolbox.com/configuration.htmlUna spiegazione migliore per partitionCount in BoneCP

partitionCount Per ridurre i conflitti di blocco e migliorare le prestazioni quindi, ogni richiesta di connessione in ingresso raccoglie disattivazione di una connessione da una piscina che ha affinità di thread, ovvero pool [threadId% part_count]. Più alto è questo numero, migliori saranno le prestazioni per il caso in cui ci sono molti thread di breve durata. Oltre una certa soglia, la manutenzione di questi pool inizierà a ha un effetto negativo sulle prestazioni (e solo per il caso in cui le connessioni in una partizione iniziano a scadere).

default: 2, minima: 1, consigliata: 3-4 (ma molto app specifica)

Ma non è così chiaro e non hanno un buon esempio. Sto eseguendo un normale servizio web, con 0-500 thread simultanei. Qual è un buon valore e perché?

risposta

19

Quindi internamente BoneCP ha il numero di partizioni numero di pool di connessioni. Ogni volta che un thread tenta di lavorare con una connessione, prende thread.getId() % partitionCount e funziona con una connessione da quel pool. E avrai il numero totale di connessioni maxConnectionsPerPartition * partitionCount.

Perché questo ha un effetto positivo sulle prestazioni? Bene, non usare due thread contemporaneamente sulla stessa connessione (ovviamente questo sarebbe male), BoneCP deve prendere un lock per rilasciare o acquisire la connessione. Ma nello stesso tempo tutti gli altri thread che vogliono fare lo stesso, devono aspettare quel blocco. Quindi in un certo senso è possibile rilasciare o acquisire il numero di connessioni partitionCount in parallelo.

Quale numero per impostarlo? Penso che # di core sia un buon inizio, perché non avresti più lavoro in parallelo. Ma a parte questo, cerca di prevedere quanti fili sarebbero in corsa per le connessioni, misurare e ripetere.

BTW, la maggior parte del mondo ha fatto affidamento su c3po per oltre un decennio e in sostanza aveva il conteggio delle partizioni impostato su 1. Quindi non ci si può sbagliare molto.

+8

Autore BoneCP qui: Questa spiegazione è perfetta. Vorrei solo aggiungere che avere più partizioni significa anche che in genere ogni partizione ha un minor numero di connessioni configurate (dato che sono suddivise). Se un thread tenta di colpire una partizione esaurita, si rovescia per provare a prendere una connessione dalle altre partizioni, quindi a un certo punto inizia a rallentare. Dato che i javadoc dicono di attaccare a circa 3-4 al massimo (non è un buon suggerimento nemmeno un core). – wwadge

+0

@ user149789 e Mirko, quindi per quelli di noi che eseguono le nostre applicazioni basate su JVM su istanze cloud micro, dove single core sono la norma, suona come partitionCount deve essere impostato su 1. Benchmarking oggi sono stato sorpreso di vedere che le connessioni utilizzate massime in il mio database non era 48 (ho config 3 partitionCount * 16 maxConnectionsPerPartition), ma piuttosto solo 16 O_o – virtualeyes

+0

Se devo fare i conti con connessioni parallele per eseguire almeno 2 operazioni di Statement e quelle connessioni sarebbero ~ 30. Potresti dirmi le dimensioni della partizione? È necessario impostare 30? Inoltre, se potessi dire altri parametri coinvolti nell'impostazione di BoneCPDataSource? – Sanchit