getpid() performance

Julian Grajkowski julian.grajkowski at gmail.com
Wed Sep 16 07:15:12 UTC 2020


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


More information about the freebsd-drivers mailing list