Date: Fri, 30 Oct 1998 04:37:41 -0800 (PST) From: info@highwind.com To: freebsd-gnats-submit@FreeBSD.ORG Subject: kern/8500: FreeBSD 3.0 thread scheduler is broken Message-ID: <199810301237.EAA00786@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 8500
>Category: kern
>Synopsis: FreeBSD 3.0 thread scheduler is broken
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Oct 30 04:40:00 PST 1998
>Last-Modified:
>Originator: Robert Fleischman
>Organization:
HighWind Software, Inc.
>Release: 3.0
>Environment:
FreeBSD zonda.highwind.com 3.0-19980831-SNAP FreeBSD 3.0-19980831-SNAP #0: Mon Aug 31 14:03:19 GMT 1998 root@make.ican.net:/usr/src/sys/compile/GENERIC i386
>Description:
When an application has threads that are I/O intensive, that thread
unfairly steals cycles from all other threads. This makes writing
an MT program that does any real amount of I/O impossible.
>How-To-Repeat:
Just run this test program:
/*****************************************************************************
File: schedBug.C
Contents: FreeBSD Scheduling Bug Illustrator
Created: 28-Oct-1998
This program SHOULD print "Marking Time : 1", etc. However, the thread
scheduler appears to NOT schedule the markTimeThread because the
ioThread is so busy.
If you uncomment the "::pthread_yield()" it works a little
better. Ideally, you should get a print every second.
g++ -o schedBug -D_REENTRANT -D_THREAD_SAFE -g -Wall schedBug.C -pthread
*****************************************************************************/
#include <assert.h>
#include <fcntl.h>
#include <memory.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef linux
#include <sys/time.h>
#endif
#include <unistd.h>
unsigned int LENGTH = 1024 * 1024;
void *ioThread(void *)
{
char *data = new char[LENGTH];
::memset(data, 0, LENGTH);
while (true) {
int file = ::open("scrap", O_CREAT | O_TRUNC | O_WRONLY, 0666);
assert(file != -1);
assert(::write(file, data, LENGTH) == static_cast<ssize_t>(LENGTH));
// ::pthread_yield();
assert(!::close(file));
}
}
void *markTimeThread(void *)
{
time_t start = ::time(0);
while (true) {
timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
::select(0, 0, 0, 0, &timeout);
::printf("Marking Time: %lu\n", ::time(0) - start);
}
}
int main(int, char **)
{
// Set up Thread Arguments
pthread_t tid;
pthread_attr_t attr;
assert(!::pthread_attr_init(&attr));
assert(!::pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED));
// Spawn markTimeThread
assert(!::pthread_create(&tid, &attr, markTimeThread, 0));
// Spawn ioThread
assert(!::pthread_create(&tid, &attr, ioThread, 0));
// main() goes away for a long time
timeval timeout;
timeout.tv_sec = 3600;
timeout.tv_usec = 0;
::select(0, 0, 0, 0, &timeout);
return EXIT_SUCCESS;
}
>Fix:
I do not know a fix. However, the problem appears to be related to the
use of the VTALARM timer only measuring USER space time and not kernel
space time.
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810301237.EAA00786>
