[Gluster-devel] Suggestion to Improve performance
Mohit Agrawal
moagrawa at redhat.com
Thu Sep 28 02:05:12 UTC 2017
Thanks Kaleb for your reply, I will try it and will share the result.
Regards
Mohit Agrawal
On Wed, Sep 27, 2017 at 5:33 PM, Kaleb S. KEITHLEY <kkeithle at redhat.com>
wrote:
> On 09/27/2017 04:17 AM, Mohit Agrawal wrote:
> > Niels,
> >
> > Thanks for your reply, I think these built-in function provides by
> > gcc and it should support most of the architecture.
> > In your view what could be the archietecure that does not support
> > these builtin function ??
> see
>
>
> https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/_
> 005f_005fsync-Builtins.html#g_t_005f_005fsync-Builtins,
>
>
> https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/_
> 005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins,
> and
>
> https://llvm.org/docs/Atomics.html
>
> The _legacy_ __sync*() functions have been superceded by the __atomic*()
> functions.
>
> A quick search seems to suggest that ARM has atomic insns since armv6.
> Fedora supports armv7hl and aarch64 and IMO ARM should be okay in this
> regard.
>
> A ten year old gcc bug report
> (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=34115) speaks to __sync*
> (and now __atomic* ?) not being supported on the i386 and by extension
> to i686 because of how glibc was built for most distributions back then.
> We (gluster) are conservative in this regard, but frankly, since hardly
> anyone runs 32-bit these days, the perf hit of not using atomic is not a
> serious concern.
>
> It's easy to fall into the trap of saying "it works on my box." Where
> "my box" is a x86_64 machine running latest {Fedora,Debian,whatever} but
> please keep in mind that even Fedora runs on i686, x86_64, armv7hl,
> aarch64, ppc64, ppc64le, and s390x these days. IMO we don't want to fill
> our source with lots of #ifdef glop if we can avoid it.
>
> Clang/LLVM supports __sync*() and __atomic*(), and between Clang and gcc
> I'd say that covers pretty much all the distributions we care about,
> e.g. Linux and *BSD, and even many we don't care so much about any more.
>
> I'd say proceed with caution, but proceed. ;-)
>
>
> >
> >
> > Regards
> > Mohit Agrawal
> >
> > On Wed, Sep 27, 2017 at 1:20 PM, Niels de Vos <ndevos at redhat.com
> > <mailto:ndevos at redhat.com>> wrote:
> >
> > On Wed, Sep 27, 2017 at 12:55:37PM +0530, Mohit Agrawal wrote:
> > > Hi,
> > >
> > > I was checking code of internal data structures
> (dict,fd,rpc_clnt etc.)
> > > those we use in glusterfs to store data.
> > > Usually we use common pattern to take reference of data
> structure in
> > > xlator level, in ref function we do take lock(mutex_lock)
> > > and update(increase) reference counter and in unref function we
> do take
> > > lock and decrease reference counter and
> > > check if ref counter is become 0 after decrease then destroy
> object.
> > >
> > > I think to update reference counter we don't need to take a
> lock, we can
> > > use atomic in-built function those
> > > can improve performance
> >
> > The below is not portable for all architectures. However we have
> > refcount.h in libglusterfs/src/ which hides the portability things.
> One
> > of the big advantages to use this, is that the code for reference
> > counting is the same everywhere. Some structures have been updated
> with
> > GF_REF_* macros, more can surely be done.
> >
> > For other more basic counters that do not function as reference
> counter,
> > the libglusterfs/src/atomic.h macros can be used. The number of lock
> > instructions on modern architectures can be reduced considerably this
> > way. It will likely come with a performance increase, but the usage
> of a
> > standard API makes the code simpler to understand and that is my main
> > interest :)
> >
> > Obviously I'm all for replacing the lock+count+unlock sequences for
> many
> > structures!
> >
> > Thanks,
> > Niels
> >
> >
> > >
> > > For ex: Below is a example for specific to dict_ref/unref
> > > To increase refCount we can use below built-in function
> > > dict_ref
> > > {
> > > __atomic_add_fetch (&this->refcount, 1, __ATOMIC_SEQ_CST);
> > >
> > > }
> > >
> > > dict_unref
> > > {
> > > __atomic_sub_fetch (&this->refcount, 1, __ATOMIC_SEQ_CST);
> > > __atomic_load (&this->refcount, &ref, __ATOMIC_SEQ_CST);
> > > }
> > >
> > > In the same way we can use for all other shared data-structure
> also in
> > > case of take/release reference.
> > >
> > > I have not tested yet how much performance improvement we can
> gain but i
> > > think there should be some improvement.
> > > Please share your input on this, appreciate your input.
> > >
> > > Regards
> > > Mohit Agrawal
> >
> > > _______________________________________________
> > > Gluster-devel mailing list
> > > Gluster-devel at gluster.org <mailto:Gluster-devel at gluster.org>
> > > http://lists.gluster.org/mailman/listinfo/gluster-devel
> > <http://lists.gluster.org/mailman/listinfo/gluster-devel>
> >
> >
> >
> >
> > _______________________________________________
> > Gluster-devel mailing list
> > Gluster-devel at gluster.org
> > http://lists.gluster.org/mailman/listinfo/gluster-devel
> >
>
> --
>
> Kaleb
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gluster.org/pipermail/gluster-devel/attachments/20170928/ec107138/attachment.html>
More information about the Gluster-devel
mailing list