[prev in list] [next in list] [prev in thread] [next in thread]
List: dovecot
Subject: Re: doveadm http api not responding under load
From: Achim Stahlberger <achim.stahlberger () tallence ! com>
Date: 2024-01-23 9:31:12
Message-ID: 18c185bc-d066-1575-aed1-de757263ed84 () tallence ! com
[Download RAW message or body]
Hi Timo,
thanks for your quick answer.
On 23.01.2024 00:18, Timo Sirainen wrote:
> > When doveadm server receives at lot of connects on port 50000 the http service on
> > port 50001 is not responding until load on port 50000 drops to zero.
> > It seems like doveadm-server is prefering port 50000 over 50001.
> >
> > Looking into Recv-Q when http hangs
> >
> > Netid State Recv-Q Send-Q Local \
> > Address:Port Peer Address:Port tcp LISTEN \
> > 129 128 0.0.0.0:50000 \
> > 0.0.0.0:* tcp LISTEN 1 128 \
> > 0.0.0.0:50001 0.0.0.0:*
>
> By "drops to zero" do you mean the connection queue has to drain until Recv-Q is \
> below 129? Or that even then it needs to go down further?
The Recv-Q for port 50000 needs to be empty to have port 50001 served.
> Also, doveadm process isn't supposed to be handling more than one client at a time. \
> So if it has a lot of pressure, why does it matter which port it's answering to \
> since it can't handle all connections anyway?
For load peaks doveadm is only serving port 50000 until all requests on port 50000 \
are served. At this time no requests on port 50001 are handled.
Our customer observes the situation that 40 client processes are waiting for port \
50001 longer than 40 minutes because of heavy load on port 50000.
> With the fix wouldn't it still take several seconds to connect to either 50000 or \
> 50001, since now both the queues are full? Or why is it different?
In the customers situation it would make the difference of seconds against 40 \
minutes. Our customer has the uneven situation where a big load on port 50000 and \
small load on 50001 is produced. Which led to port 50001 not served anymore. In this \
situation it would be better to distribute limited rsources evenly over both ports.
> Although it's using quite a lot of randomness (= /dev/urandom reads), which isn't \
> so good. I think it would be just as good to do round-robin:
> + static int i_start = 0;
I also thought of round robin.
I think there is the problem that the newly forked doveadm process is always \
initializing i_start with 0. And then the first thing it does is to accept connection \
on port 50000. With service_count = 1 I think this would not solve the problem.
> But even so, I'd like to understand better what exactly this is helping with before \
> merging. Looking at libevent and nginx, I don't see them doing anything like this \
> either.
In this situation the epoll_wait() in doveadm process returns two ready sockets (port \
50000 and 50001). The loop "for (i = 0; i < ret; i++) {" within \
io_loop_handler_run_internal() also trys to handle both events. But handling the \
first event (port 50000) disables the handler for port 50001 because doveadm will \
only handle one request at a time. Thus a newly forked doveadm always chooses port \
50000 if a request for this port is waiting. Thus as long there is waiting requests \
for port 50000 requests for port 50001 are completely ignored.
Maybe it is a good idea to use round robin if service_count is > 1 and random if \
service_count == 1.
The problem might be related to the customers config service_count = 1 for doveadm.
Setting service_count = 100 also resolved the problem. But I think because of the \
performance boost of about factor 10.
Making the two ports independent services also resolves the situation:
service doveadm {
inet_listener {
port = 50000
}
}
service doveadm_http {
executable = doveadm-server
inet_listener http {
port = 50001
ssl = no
}
}
Kind regards
Achim
https://www.tallence.com
Folgt uns auf LinkedIn <https://www.linkedin.com/company/tallence-ag> // XING \
<https://www.xing.com/pages/tallenceag> // Kununu - Top Company 2024 \
<https://www.kununu.com/de/tallence2>
Tallence AG // Sitz der Gesellschaft: Hamburg // Neue Gröningerstraße 13, 20457 \
Hamburg // Amtsgericht Hamburg HRB 142900
Vorstand: Frank Moll (Vorsitzender), Bernd Scherf // Aufsichtsrat: Wolf Ingomar \
Faecks (Vorsitzender)
Die Speicherung und Verarbeitung personenbezogener Daten erfolgt entsprechend unserer \
Datenschutzhinweise. <https://www.tallence.com/datenschutzhinweise-gp> \
_______________________________________________ dovecot mailing list -- \
dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic