Re: why does mlockall appear to make memcpy slower ?

From: Richard B. Johnson (root@chaos.analogic.com)
Date: Mon Apr 03 2000 - 13:00:27 EST


On Mon, 3 Apr 2000, Paul Barton-Davis wrote:

> >> The following program prints:
> >>
> >> Average msecs per MB 4.914158; Average copy rate: 0.000005 msecs/byte
> >>
> >> if run without root permission (i.e. mlockall() fails), and
> >>
> >> Average msecs per MB 7.417227; Average copy rate: 0.000007 msecs/byte
> >>
> >> if run with root permission.
> >>
> >> Is there a simple explanation ?
> >
> >mlockall() is a privileged call. Performance could improve if all pages
> >are locked. The non-root version doesn't perform as well because
> >mlockall() fails, subjecting the pages to the system's evil memory
> >management schemes (paging/etc).
> >
> >I'm almost positive you know this though, so your question seems strange.
>
> Look at what I wrote again. It runs *slower* when run as root, and
> faster when not. That is, mlockall() causes it run slower.
>
> --p

Not here. If I just comment out your mlockall() it runs at the
same apparent speed one way or the other. FYI, I don't understand
how you are calculating speed, but that's another question altogether.

Script started on Mon Apr 3 13:56:24 2000
[9;0]# cat zzz.c
#include <stdlib.h>
#include <sys/mman.h>
#include <asm/msr.h>

main ()

{
        char buf[1048576];
        char obuf[1048576];
        int i;
        float total;
        unsigned long now, then;

#define N 1000.0
#define CYCLES_PER_MSEC 450000.0f

        total = 0;
#if 0
        mlockall (MCL_CURRENT);
#endif

        for (i = 0; i < N; i++) {
                rdtscl (then);
                memcpy (buf, obuf, sizeof (obuf));
                rdtscl (now);
                total += (float) (now - then);
        }

        printf ("Average msecs per MB %.6f; "
                "Average copy rate: %.6f msecs/byte\n",
                total / (N * CYCLES_PER_MSEC),
                total / (N * 1048576.0 * CYCLES_PER_MSEC));
}

# gcc -o zzz zzz.c
# ./zzz
Average msecs per MB 5.295031; Average copy rate: 0.000005 msecs/byte
# vi zzz.c
[?1h=#include <stdlib.h>
#include <sys/mman.h>
#include <asm/msr.h>

main ()

{
 char buf[1048576];
 char obuf[1048576];
 int i;
 float total;
 unsigned long now, then;

#define N 1000.0
#define CYCLES_PER_MSEC 450000.0f

 total = 0;
#if 0
 mlockall (MCL_CURRENT);
#endif

 for (i = 0; i < N; i++) {
 rdtscl (then);
 memcpy (buf, obuf, sizeof (obuf));
 "zzz.c" 34 lines, 566 chars         
[m        [25;66
H    mlockall (MCL_CURRENT);
#endif

 for (i = 0; i < N; i++) {
 rdtscl (then);
 memcpy (buf, obuf, sizeof (obuf));
 rdtscl (now);
         [
19;1H
 for (i = 0; i < N; i++) {
 rdtscl (then);
 memcpy (buf, obuf, sizeof (obuf));
 rdtscl (now);
 total += (float) (now - then);
   :wq
[?1l># cat zzz.c
#include <stdlib.h>
#include <sys/mman.h>
#include <asm/msr.h>

main ()

{
        char buf[1048576];
        char obuf[1048576];
        int i;
        float total;
        unsigned long now, then;

#define N 1000.0
#define CYCLES_PER_MSEC 450000.0f

        total = 0;
        mlockall (MCL_CURRENT);

        for (i = 0; i < N; i++) {
                rdtscl (then);
                memcpy (buf, obuf, sizeof (obuf));
                rdtscl (now);
                total += (float) (now - then);
        }

        printf ("Average msecs per MB %.6f; "
                "Average copy rate: %.6f msecs/byte\n",
                total / (N * CYCLES_PER_MSEC),
                total / (N * 1048576.0 * CYCLES_PER_MSEC));
}

# gcc -o zzz zzz.c
# ./zzz
Average msecs per MB 5.295233; Average copy rate: 0.000005 msecs/byte
# exit
exit

Script done on Mon Apr 3 13:57:51 2000

Cheers,
Dick Johnson

Penguin : Linux version 2.3.41 on an i686 machine (800.63 BogoMips).

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Apr 07 2000 - 21:00:10 EST