[strongSwan-dev] [PATCH] log: do not acquire lock if nobody is listening
    Christophe Gouault 
    christophe.gouault at 6wind.com
       
    Tue Apr 15 10:31:48 CEST 2014
    
    
  
Hi Tobias,
Thanks for reviewing my patches.
On 04/14/2014 06:31 PM, Tobias Brunner wrote:
> Hi Christoph,
>
>> +	if (this->max_level[group] < level &&
>> +		this->max_vlevel[group] < level)
>> +		return;
>
> Unfortunately, this might not be thread-safe.  It's essentially the same
> problem I described in my response to your half-open IKE_SA patch.
> Because the log levels/logger registrations can be changed at runtime
> the threads that are calling vlog() might not be aware of these updates.
I agree it is not thread safe, but the only risk I suspect it that a log 
listener might lose a message at the time it registers or increases its 
loglevel (assuming that reading this->max_level[group] or 
this->max_vlevel[group] is atomic), in which case it does not seem to be 
a serious problem.
What is your opinion?
>> +  49.87%  charon  [kernel.kallsyms]                [k] do_raw_spin_lock
>
> I was not able to reproduce numbers that come even close on a x64 Ubuntu
> Linux system.  On what platform/architecture are you running this?  And
> how exactly did you determine the numbers?  For instance, what is charon
> doing during your perf record run?  And how is it configured (e.g.
> charon.threads)?
I was running charon on an x86_64, with 8 cores/16 hyperthreads, on a 
debian 7.4 system.
Here is my strongswan.conf:
charon {
	dos_protection=no
	install_routes=no
	ikesa_table_size = 65536
	ikesa_table_segments = 16384
	cookie_threshold = 0
	block_threshold = 0
	threads = 64
	syslog {
		daemon {
			default = -1
		}
	}
	filelog {
		stderr {
			default = -1
		}
	}
}
charon replies to IKEv2 negotiations initiated by a remote load-tester 
at a high throughput.
> It seems strange that acquiring an *uncontested* read lock (the write
> lock is only very rarely held, in your case probably never) can produce
> such a massive overhead.  Acquiring such a lock should be possible
> without syscall, just some atomic compare-and-swap operation should be
> sufficient.
I was also surprised by this behavior. I didn't expect spin_locks to be 
invoked on a read lock.
> Unless, of course, your architecture does not support such atomic
> operations, hence the library has to resort to using a regular
> (spin-)lock.  Or if the library just is not optimized very much and
> always does this.
>
> It might not be a bad idea to check if there is any potential in
> optimizing the pthread_rwlock_rdlock implementation in the pthread
> library you are using.
I am using debian's libpthread-2.13.so for x86_64. I would reasonably 
expect that it supports optimized read locks.
Regards,
Christophe
> Since this rwlock is not the only one in the
> strongSwan code base it might increase the overall performance (but this
> is definitely the lock that is most often acquired).
>
> To reduce the overhead somewhat you could also compile strongSwan with
> reduced log statements (see [1]).
>
> Regards,
> Tobias
>
> [1]
> http://wiki.strongswan.org/projects/strongswan/wiki/LoggerConfiguration#Compile-time-configuration
>
    
    
More information about the Dev
mailing list