[libvirt] [PATCH 2/2] Introduce max_queued_clients

Michal Privoznik mprivozn at redhat.com
Thu Jul 25 14:44:57 UTC 2013


On 25.07.2013 16:34, Daniel P. Berrange wrote:
> On Thu, Jul 25, 2013 at 04:23:33PM +0200, Michal Privoznik wrote:
>> This configuration knob lets user to set the length of queue of
>> connection requests waiting to be accept()-ed by the daemon. IOW, it
>> just controls the @backlog passed to listen:
>>
>>   int listen(int sockfd, int backlog);
>> ---
>>  daemon/libvirtd-config.c      | 1 +
>>  daemon/libvirtd-config.h      | 1 +
>>  daemon/libvirtd.aug           | 1 +
>>  daemon/libvirtd.c             | 4 ++++
>>  daemon/libvirtd.conf          | 6 ++++++
>>  src/locking/lock_daemon.c     | 2 +-
>>  src/lxc/lxc_controller.c      | 1 +
>>  src/rpc/virnetserverservice.c | 6 ++++--
>>  src/rpc/virnetserverservice.h | 2 ++
>>  9 files changed, 21 insertions(+), 3 deletions(-)
>>
>> diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c
>> index 107a9cf..c816fda 100644
>> --- a/daemon/libvirtd-config.c
>> +++ b/daemon/libvirtd-config.c
>> @@ -414,6 +414,7 @@ daemonConfigLoadOptions(struct daemonConfig *data,
>>      GET_CONF_INT(conf, filename, min_workers);
>>      GET_CONF_INT(conf, filename, max_workers);
>>      GET_CONF_INT(conf, filename, max_clients);
>> +    GET_CONF_INT(conf, filename, max_queued_clients);
>>  
>>      GET_CONF_INT(conf, filename, prio_workers);
>>  
>> diff --git a/daemon/libvirtd-config.h b/daemon/libvirtd-config.h
>> index 973e0ea..a24d5d2 100644
>> --- a/daemon/libvirtd-config.h
>> +++ b/daemon/libvirtd-config.h
>> @@ -63,6 +63,7 @@ struct daemonConfig {
>>      int min_workers;
>>      int max_workers;
>>      int max_clients;
>> +    int max_queued_clients;
>>  
>>      int prio_workers;
>>  
>> diff --git a/daemon/libvirtd.aug b/daemon/libvirtd.aug
>> index 7c56a41..70fce5c 100644
>> --- a/daemon/libvirtd.aug
>> +++ b/daemon/libvirtd.aug
>> @@ -56,6 +56,7 @@ module Libvirtd =
>>     let processing_entry = int_entry "min_workers"
>>                          | int_entry "max_workers"
>>                          | int_entry "max_clients"
>> +                        | int_entry "max_queued_clients"
>>                          | int_entry "max_requests"
>>                          | int_entry "max_client_requests"
>>                          | int_entry "prio_workers"
>> diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
>> index 9f7fd8a..402b494 100644
>> --- a/daemon/libvirtd.c
>> +++ b/daemon/libvirtd.c
>> @@ -485,6 +485,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
>>                                             NULL,
>>  #endif
>>                                             false,
>> +                                           config->max_queued_clients,
>>                                             config->max_client_requests)))
>>          goto error;
>>      if (sock_path_ro) {
>> @@ -497,6 +498,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
>>                                                   NULL,
>>  #endif
>>                                                   true,
>> +                                                 config->max_queued_clients,
>>                                                   config->max_client_requests)))
>>              goto error;
>>      }
>> @@ -522,6 +524,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
>>                                                       NULL,
>>  #endif
>>                                                       false,
>> +                                                     config->max_queued_clients,
>>                                                       config->max_client_requests)))
>>                  goto error;
>>  
>> @@ -562,6 +565,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
>>                                              config->auth_tls,
>>                                              ctxt,
>>                                              false,
>> +                                            config->max_queued_clients,
>>                                              config->max_client_requests))) {
>>                  virObjectUnref(ctxt);
>>                  goto error;
>> diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf
>> index af4493e..5353927 100644
>> --- a/daemon/libvirtd.conf
>> +++ b/daemon/libvirtd.conf
>> @@ -257,6 +257,12 @@
>>  # over all sockets combined.
>>  #max_clients = 20
>>  
>> +# The maximum length of queue of connections waiting to be
>> +# accepted by the daemon. Note, that some protocols supporting
>> +# retransmission may obey this so that a later reattempt at
>> +# connection succeeds.
>> +#max_queued_clients = 1000
>> +
>>  
>>  # The minimum limit sets the number of workers to start up
>>  # initially. If the number of active clients exceeds this,
>> diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
>> index c4c1727..c45f45c 100644
>> --- a/src/locking/lock_daemon.c
>> +++ b/src/locking/lock_daemon.c
>> @@ -671,7 +671,7 @@ virLockDaemonSetupNetworkingNative(virNetServerPtr srv, const char *sock_path)
>>  #if WITH_GNUTLS
>>                                             NULL,
>>  #endif
>> -                                           false, 1)))
>> +                                           false, 0, 1)))
>>          return -1;
>>  
>>      if (virNetServerAddService(srv, svc, NULL) < 0) {
> 
> I think we probably want to have a non-zero backlog for virtlockd, otherwise
> we could get ECONNREFUSED errors when multiple VMs start in parallel, since
> each one will trigger a connect(). Probably worth making it a config file
> parameter too, while you're at it.

In fact, 0 gets translated in virNetSocketListen to 30.

Michal




More information about the libvir-list mailing list