PostgreSQL backend: a waste of time?

Nuno Silva nuno.silva at sectium.com
Fri Nov 29 20:50:02 EST 2002


Hello!

Nicola Ranaldo wrote:
> I cannot spread sql commands of a unique transaction over multiple pgsql
> connection, and a connection cannot handle parallel transactions.
> So if i have 1000 imapd process starting a transaction the mailbox daemon
> has to open 1000 pgsql connection.

Reading from the DB should be trivial, right?

I'm not 100% sure, but I suppose that one can virtualize the 
connections. What I mean is: imapd (or pop3d or lmtpd...) wants to write 
something -> ask the daemon and the daemon will choose a free connection 
and commit those changes. This is the "one operation simple case".
Some of the DBs that cyrus maintains appear to be this simple (the 
mailboxes file).

Other cyrus' DBs seem to require transactions (seen and delivery DB's).. 
This makes it harder to manage with a single daemon connecting to a 
RDBMS with onky a few connections.
CMU people or Ken: comments? :)

> One solution could be:
> BEGIN -> Allocate a new buffer to store sql commands
> SQL COMMANDS -> add commands to buffer
> COMMIT -> send all the buffered commands to the mailbox daemon and cleanup
> the buffer
> ABORT -> cleanup the buffer
> Do you think this is a good solution ?

I really don't know... This buffer is in the daemon?
Don't you have to receive responses from the SQL DB? Or these commands 
are only writes (UPDATE, INSERT)? If these are only writes it seams a 
good ideia, but if you need to SELECT (inside the transaction) too there 
is the problem of different connections getting different transactions.

Brasseur Valéry posted a mysql-backend patch for cyrus recently.

Brasseur, do you use a mysql connection for each cyrus process too? And 
do you use transactions? Last time I checked mysql didn't support these.

If transactions aren't required than it's easy to have 1 connection 
shared amongst 100 processes, right? :)

> Howewer i think a pgsql connection for every master child could not be a
> problem, on my production server (7500 very active users, cyrus.log is
> 20MB/day) the average number of imapd is 15, pop3d is 30, lmtpd is 5 (under
> mail-bombing lmtpd process was 45). Howewer it is an AlphaServer ES45 with 4
> 1ghz CPU and 700Gb of raid disk and is quite fast. Wath's your experience
> with huge number of users or slow server ?
> 

It depends on you user base:
If your system is a backend for a webmail, for instance, your "users" 
(the php or perl script) will always connect, fetch something, 
disconnect. In this situation you'll never see lots of simultaneous 
connections.

If you have 50.000 users on a campus setup using IMAP you'll get 5000 
concurrent connection easily.

The same way if you have a company with 500 desktops all of them 
checking the email with IMAP you can easily get 1000 (the double) 
concurrent connections.

As internet people says, YMMV :)

Regards,
Nuno Silva


> Bye
> 
>     Nicola Ranaldo
> 
> 
>>IIRC someone implemented such a daemon and patched cyrus to use it. This
>>daemon's backend was a text-file but the "protocol" is there.
>>
>>a drawing :)
>>
>>imapd1   imapd2   imapd3 ... imap1000
>>   |        |        |           |
>>   -------------------------------
>>            |
>>          daemon
>>            |
>>-----------------------
>>|  |   |   |   |   |  |
>>1  2   3   4   5   6  7
>>
>>1 to 7 would be postgresql connections. This number may vary... maybe 1
>>connection per 100 imapds? Or a user defined number. IMMV...
> 
> 
> 
> 
> 






More information about the Info-cyrus mailing list