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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox