Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Sep 2020 09:14:58 +0200
From:      Julian Grajkowski <julian.grajkowski@gmail.com>
To:        freebsd-drivers@freebsd.org
Subject:   getpid() performance
Message-ID:  <CAGQdsJhgAM4aHY46SaGDpXJGOdEzG6rD93WzG7RT9PWi_%2BwJrA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi,

I am working on a contiguous memory allocator which frequently calls
getpid() in user space and I have noticed very poor performance of this
function call. I measured this call performance using following code:

inline uint64_t rdtsc_start(void)
{
    uint32_t cycles_high;
    uint32_t cycles_low;

    asm volatile("lfence\n\t"
                 "rdtscp\n\t"
                 "mov %%edx, %0\n\t"
                 "mov %%eax, %1\n\t"
                 : "=r" (cycles_high), "=r" (cycles_low)
                 : : "%rax", "%rdx", "%rcx");

    return (((uint64_t)cycles_high << 32) | cycles_low);
}


inline uint64_t rdtsc_end(void)
{
    uint32_t cycles_high;
    uint32_t cycles_low;

    asm volatile("rdtscp\n\t"
                 "mov %%edx, %0\n\t"
                 "mov %%eax, %1\n\t"
                 "lfence\n\t"
                 : "=r" (cycles_high), "=r" (cycles_low)
                 : : "%rax", "%rdx", "%rcx");

    return (((uint64_t)cycles_high << 32) | cycles_low);
}

This way I measured ~320 cycles used for getpid() on FreeBSD 12.1. For
comparison, in Linux (CentOS 7) this call uses ~10 cycles. I am aware that
this should not be compared directly. as these are different systems, but
such a big difference in performance is an issue for me, as getpid() is
called very often in my code.

Is such a poor performance of getpid() a known problem and is it possible
that this might be improved in future releases?

Measurements were done on the same mahcine with following setup:

CPU: Intel(R) Atom(TM) CPU C3958 @ 2.00GHz (2000.06-MHz K8-class CPU)
FreeBSD/SMP: Multiprocessor System Detected: 16 CPUs

8GB RAM (2x4GB):
        Type: DDR4
        Type Detail: Synchronous Unbuffered (Unregistered)
        Speed: 2400 MT/s

Thank you very much in advance for any help.

Kind regards,
Julian



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGQdsJhgAM4aHY46SaGDpXJGOdEzG6rD93WzG7RT9PWi_%2BwJrA>