From: Pavel Machek <pavel@ucw.cz>
To: Con Kolivas <kernel@kolivas.org>
Cc: linux kernel mailing list <linux-kernel@vger.kernel.org>,
Nick Piggin <piggin@cyberone.com.au>
Subject: Re: [PATCH] 2.6.0 batch scheduling, HT aware
Date: Sat, 27 Dec 2003 12:09:03 +0100 [thread overview]
Message-ID: <20031227110903.GA1413@elf.ucw.cz> (raw)
In-Reply-To: <200312271042.55989.kernel@kolivas.org>
Hi!
> > > I've done a resync and update of my batch scheduling that is also
> > > hyper-thread aware.
> > >
> > > What is batch scheduling? Specifying a task as batch allows it to only
> > > use cpu time if there is idle time available, rather than having a
> > > proportion of the cpu time based on niceness.
> > >
> > > Why do I need hyper-thread aware batch scheduling?
> > >
> > > If you have a hyperthread (P4HT) processor and run it as two logical cpus
> > > you can have a very low priority task running that can consume 50% of
> > > your physical cpu's capacity no matter how high priority tasks you are
> > > running. For example if you use the distributed computing client
> > > setiathome you will be effectively be running at half your cpu's speed
> > > even if you run setiathome at nice 20. Batch scheduling for normal cpus
> > > allows only idle time to be used for batch tasks, and for HT cpus only
> > > allows idle time when both logical cpus are idle.
> >
> > BTW this is going to be an issue even on normal (non-HT)
> > systems. Imagine memory-bound scientific task on CPU0 and nice -20
> > memory-bound seti&home at CPU1. Even without hyperthreading, your
> > scientific task is going to run at 50% of speed and seti&home is going
> > to get second half. Oops.
> >
> > Something similar can happen with disk, but we are moving out of
> > cpu-scheduler arena with that.
> >
> > [I do not have SMP nearby to demonstrate it, anybody wanting to
> > benchmark a bit?]
>
> This is definitely the case but there is one huge difference. If you have
> 2x1Ghz non HT processors then the fastest a single threaded task can run is
> at 1Ghz. If you have 1x2Ghz HT processor the fastest a single threaded task
> can run is 2Ghz.
Well, gigaherz is not the *only* important thing.
On 2x1GHz, 2GB/sec RAM bandwidth, fastest a single threaded task can
run is 1GHz, 2GB/sec. If you run two of them, it is 1GHz,
*1*GB/sec. So you still have effect similar to hyperthreading. And
yes, it can be measured.
stress runs two tasks walking over 10MB of memory, just for fun. Look:
[Lefik is dual-p3; according to you two mem stressers should run about
same speed as one of them. That's not the case:]
machek@lefik:~/misc$ ./stress tenmega
Process 1665 started at 1072522582.
machek@lefik:~/misc$ Process 1665 done at 1072522695 (113 sec).
machek@lefik:~/misc$ ./stress tenmega tenmega
Process 1669 started at 1072522722.
Process 1670 started at 1072522722.
machek@lefik:~/misc$ Process 1670 done at 1072522895 (173 sec).
Process 1669 done at 1072522903 (181 sec).
machek@lefik:~/misc$
And yes, that machine does have two cpus:
machek@lefik:~/misc$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 3
cpu MHz : 801.828
cache size : 256 KB
physical id : 0
siblings : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 mmx fxsr sse
bogomips : 1599.07
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 3
cpu MHz : 801.828
cache size : 256 KB
physical id : 0
siblings : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 mmx fxsr sse
bogomips : 1602.35
machek@lefik:~/misc$
So... even on normal SMP,
"task-on-other-cpu-slows-down-task-on-this-cpu" effect exists. Okay,
it is not as visible as on HT machine (50% slowdown), but its
definitely there.
Pavel
/* Copyright 1999-2003 Pavel Machek, distribute under GPLv2 */
#define MEM 20*1024
#define RAMSIZE (8*1024*1024)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <time.h>
void
main( int argc, char *argv[] )
{
unsigned long i;
if (!argc)
{
printf( "stress loop|memread|tenmega|mem|write|eatmem ...\n" );
return;
}
for (i=0; i<argc; i++)
{
if (!strcmp( argv[i], "loop" ))
if (!fork())
while (1);
if (!strcmp( argv[i], "eatmem" ))
if (!fork())
while(1) {
char *c = malloc(4096);
if (c) *c='a';
}
if (!strcmp( argv[i], "memread" ))
if (!fork())
{
char *p = malloc( RAMSIZE );
for( i=0; i<RAMSIZE; i++ ) p[i]=1;
while( 1 )
{
int a;
for( i=0; i<RAMSIZE; i++ ) a+=p[i];
}
}
if (!strcmp( argv[i], "tenmega" ))
if (!fork())
{
char *p = malloc( 10*1024*1024 );
int i, j, start;
printf( "Process %d started at %d.\n", getpid(), start = time(NULL));
for( i=0; i<10*1024*1024; i++ ) p[i]=1;
for( j=1; j<1000; j++ )
{
volatile int a;
for( i=0; i<10*1024*1024; i++ ) a+=p[i];
}
printf( "Process %d done at %ld (%ld sec).\n", getpid(), (long) time(NULL), time(NULL)-start);
exit(0);
}
if (!strcmp( argv[i], "mem" ))
if (!fork())
{
char *p = malloc( RAMSIZE );
while( 1 )
{
for( i=0; i<RAMSIZE; i++ ) p[i]=1;
sleep( 60 );
}
}
if (!strcmp( argv[i], "write" ))
if (!fork())
{
char namebuf[1024];
int h;
char buf[1024]="Signature of something rather strange ;-)";
sprintf( namebuf, "/tmp/stresstest.delme.%d", getpid() );
h = creat( namebuf, 0666 );
if (h<0) { printf( "Creat failed: %m\n" ); exit(0); }
while( 1 )
for( i=0; i<MEM; i++ )
{
if (lseek( h, i*1024, SEEK_SET )<0) { printf( "Seek failed: %m\n" ); exit(0); }
if (write( h, buf, 1024 )<0) { printf( "Write failed: %m\n" ); exit(0); }
}
}
}
}
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
next prev parent reply other threads:[~2003-12-27 11:08 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-23 0:38 [PATCH] 2.6.0 batch scheduling, HT aware Con Kolivas
2003-12-23 1:11 ` Nick Piggin
2003-12-23 1:24 ` Con Kolivas
2003-12-23 1:36 ` Nick Piggin
2003-12-23 2:42 ` Con Kolivas
2003-12-23 2:57 ` Nick Piggin
2003-12-23 3:15 ` Con Kolivas
2003-12-23 3:16 ` Con Kolivas
2003-12-26 23:03 ` Pavel Machek
2003-12-23 15:51 ` bill davidsen
2003-12-23 22:09 ` Con Kolivas
2003-12-30 0:35 ` bill davidsen
2004-01-02 20:10 ` Bill Davidsen
2003-12-26 22:56 ` Pavel Machek
2003-12-26 23:42 ` Con Kolivas
2003-12-26 23:49 ` Con Kolivas
2003-12-27 11:09 ` Pavel Machek [this message]
2003-12-27 11:15 ` Con Kolivas
2003-12-30 0:29 ` bill davidsen
2003-12-29 7:02 ` Nick Piggin
2003-12-29 12:49 ` Pavel Machek
2003-12-27 8:52 ` Mika Penttilä
2003-12-30 0:32 ` bill davidsen
2004-01-02 20:05 ` Bill Davidsen
2004-01-02 20:56 ` Davide Libenzi
2004-01-02 21:10 ` Valdis.Kletnieks
2004-01-02 23:34 ` Davide Libenzi
-- strict thread matches above, loose matches on Subject: below --
2003-12-23 1:59 Nakajima, Jun
2003-12-23 2:40 ` Nick Piggin
2003-12-23 5:33 Nakajima, Jun
2003-12-23 10:13 ` Nick Piggin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20031227110903.GA1413@elf.ucw.cz \
--to=pavel@ucw.cz \
--cc=kernel@kolivas.org \
--cc=linux-kernel@vger.kernel.org \
--cc=piggin@cyberone.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.