[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