From: Noah Misch <noah@leadboat.com>
To: cygwin@cygwin.com
Subject: Re: cygserver - Postgres Multiple connection Load Testing - Inifinte Loop
Date: Tue, 21 Mar 2017 02:56:00 -0000 [thread overview]
Message-ID: <20170321025614.GA2100214@tornado.leadboat.com> (raw)
In-Reply-To: <20040803100612.GP31522@cygbert.vinschen.de>
[-- Attachment #1: Type: text/plain, Size: 1314 bytes --]
On Tue, Aug 03, 2004 at 12:06:12PM +0200, Corinna Vinschen wrote:
> On Aug 2 20:33, sarbx-cygwin6344@mailblocks.com wrote:
> > This time around, cygserver does not eat CPU. But after 5 to 6
> > concurrent
> > connections nothing seem to work, looks kind of hung. There is no
> > activity in the Postgres
> > log file. Opening a new database connection also hangs. There is no
> > activity on the machine.
> Any chance to create a simple testcase which uncovers that behaviour
> without involving a whole database system?
Attached test program reproduces it on Cygwin 2.7.0, Cygwin 1.7.5, and a few
intermediate versions. The program creates sixteen processes that each
perform a tight loop over the following:
- select one of four semaphores
- reduce semaphore's value from 1 to 0 ("lock" it)
- raise semaphore's value from 0 to 1 ("unlock" it)
On GNU/Linux, AIX, and Solaris, the processes keep busy and finish one million
lock/unlock cycles apiece in a few minutes. On Cygwin, they hang within a few
seconds and under one hundred cycles apiece. At that point, cygserver is
unresponsive to other clients; for example, "strace /bin/true", opening a new
Cygwin terminal, "cat /proc/sysvipc/sem" and "cygserver -S" all hang. In most
tests, cygserver was not consuming CPU while unresponsive.
Thanks,
nm
[-- Attachment #2: sema_parallel.c --]
[-- Type: text/plain, Size: 2344 bytes --]
/*
* Demonstrate cygserver hang under concurrent sysv semaphore traffic. Run
* without arguments. Output will cease within a few seconds, and cygserver
* will be unresponsive to all clients.
*
* This is compatible with default cygserver settings; it uses a single
* semaphore set of four semaphores.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define SEM_KEY 0x631a2c3e
#define N_WORKER 16
#define N_SEMA (N_WORKER/4)
#define N_CYCLE 1000000
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
};
static int print_every = 1;
/* In parallel, N_WORKER processes run this function. */
static int do_worker(int ordinal, int set)
{
int i;
struct sembuf op;
printf("start worker %d\n", ordinal);
fflush(stdout);
op.sem_flg = 0;
for (i = 1; i <= N_CYCLE; i++)
{
op.sem_num = random() % N_SEMA;
op.sem_op = -1;
if (0 > semop(set, &op, 1))
{
perror("semop");
return 1;
}
op.sem_op = 1;
if (0 > semop(set, &op, 1))
{
perror("semop");
return 1;
}
if (i % print_every == 0)
{
printf("worker %d: %d cycles elapsed\n", ordinal, i);
fflush(stdout);
}
}
return 0;
}
int main(int argc, char **argv)
{
int status = 1, set, i, child_status;
if (argc == 2)
print_every = atoi(argv[1]);
else if (argc != 1)
{
fprintf(stderr, "Usage: sema_parallel [print-every-N]\n");
return status;
}
puts("semget");
fflush(stdout);
set = semget(SEM_KEY, N_SEMA, IPC_CREAT | 0600);
if (set == -1)
{
perror("semget");
return status;
}
puts("SETVAL");
fflush(stdout);
for (i = 0; i < N_SEMA; i++)
{
union semun s;
s.val = 1;
if (0 > semctl(set, i, SETVAL, s))
{
perror("semctl(SETVAL)");
goto cleanup;
}
}
for (i = 0; i < N_WORKER; i++)
{
pid_t pid;
pid = fork();
switch (pid)
{
case -1:
perror("fork");
goto cleanup;
case 0:
return do_worker(i, set);
}
}
status = 0;
cleanup:
while (wait(&child_status) != -1)
;
if (errno != ECHILD)
{
perror("wait");
status = 1;
}
if (0 > semctl(set, 0, IPC_RMID))
{
perror("semtctl(IPC_RMID)");
status = 1;
}
return status;
}
[-- Attachment #3: Type: text/plain, Size: 219 bytes --]
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
next prev parent reply other threads:[~2017-03-21 2:56 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200408030333.i733XEXn023894@mx3.redhat.com>
2004-08-03 10:06 ` Corinna Vinschen
2004-08-03 20:45 ` Saravanan Bellan
2004-08-03 20:54 ` Christopher Faylor
2004-08-03 21:10 ` Saravanan Bellan
2017-03-21 2:56 ` Noah Misch [this message]
2017-03-21 7:29 ` Marco Atzeri
2017-03-24 17:52 ` Corinna Vinschen
2017-03-25 10:55 ` Marco Atzeri
2017-03-25 12:02 ` Corinna Vinschen
2017-03-25 12:31 ` Marco Atzeri
2017-03-28 5:48 ` Noah Misch
2017-04-02 2:36 ` Noah Misch
2017-05-07 3:35 ` Noah Misch
2017-05-07 4:01 ` Larry Hall (Cygwin)
2017-06-14 23:32 ` Marco Atzeri
2017-06-20 11:11 ` Corinna Vinschen
2017-06-20 17:29 ` Marco Atzeri
2017-06-21 7:58 ` Corinna Vinschen
2004-08-03 3:33 sarbx-cygwin6344
[not found] <200407302132.i6ULWwXn016838@mx3.redhat.com>
2004-08-02 9:45 ` Corinna Vinschen
-- strict thread matches above, loose matches on Subject: below --
2004-07-30 22:09 sarbx-cygwin6344
[not found] <200407290319.i6T3JCXn018245@mx3.redhat.com>
2004-07-30 13:43 ` Corinna Vinschen
2004-07-29 10:35 sarbx-cygwin6344
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=20170321025614.GA2100214@tornado.leadboat.com \
--to=noah@leadboat.com \
--cc=cygwin@cygwin.com \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).