Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Jul 2010 17:26:27 +0200
From:      Vikash Badal <Vikash.Badal@is.co.za>
To:        "freebsd-threads@freebsd.org" <freebsd-threads@freebsd.org>
Subject:   syslog strangeness on freebsd 8.0 and 8.1-RC when using threads
Message-ID:  <9B425C841283E0418B1825D40CBCFA613D9E525940@ZABRYSVISEXMBX1.af.didata.local>

next in thread | raw e-mail | index | archive | help

Can someone please assist me with some strangeness on FreeBSD 8.0 and 8.1=
-RC2

using a threaded test code code, I see the that freebsd 8.x seems to be u=
sing more memory when using the syslog() call from a c program:


Results:

7.2
without syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
26872 vikashb    1001   8    0   128M 14236K RUN      0:00  0.00% a.out

with syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
26881 vikashb    1001  44    0   128M 26236K RUN      0:00  0.00% a.out

8.0-RELEASE-p3
without syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
61529 vikashb    1001  44    0   129M 14840K RUN      0:01  0.00% a.out

with syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
61507 vikashb    1001  44    0   257M 42708K RUN      0:30  0.00% a.out

8.1-RC2
without syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
33062 vikashb    1001  44    0   129M 14804K RUN      0:00  0.00% a.out

with syslog
=20 PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMA=
ND
33056 vikashb    1001  44    0   257M 42708K RUN      0:03  0.00% a.out


I have not been able to find any reasonable information via google.

Why does syslog result in more memory being consumed on 8.x as opposed to=
=207.2 ?



<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <stdarg.h>
#include <errno.h>
#include <syslog.h>
#include <signal.h>
#include <pthread.h>

char *ProgramName =3D "WTF";

int loop =3D 0;
int LogToSTDOUT =3D 1;

void LogMessage(int debug, const char *fmt,...)
{
=20  extern int LogToSTDOUT;

=20  char message[8192];

=20  memset(message, 0, sizeof(message));

=20  va_list args;

=20  va_start(args, fmt);
=20  vsnprintf(message, sizeof(message), fmt, args);
=20  va_end(args);

=20  if ( LogToSTDOUT )
=20  {
=20     printf("%s\n", message);
=20  }

=20  syslog(LOG_NOTICE, "%s", message);

}

unsigned long int getTimeNow()
{
=20  struct timeval tv;

=20  if ( gettimeofday(&tv, NULL) =3D=3D -1 )
=20  {
=20     LogMessage(0, "ERROR(%d) %s\n", errno, strerror(errno));
=20     tv.tv_sec =3D 0;
=20  }

=20  return tv.tv_sec;
}

void HandleSignal(int sig)
{
=20  loop =3D 0;
=20  LogMessage(0, "loop  =3D %d\n", loop);
=20  signal(sig, SIG_IGN);
=20  usleep(1000);
}

void *worker(int n)
{
=20  while ( loop )
=20  {
=20     LogMessage(0, "worker #%d logging", n);
=20     usleep(1000);
=20  }

=20  pthread_exit(0);
}

int main(int argc, char* argv[])
{
=20  pthread_t* tpool;

=20  int workers =3D 1000, i, rc;

=20  openlog(ProgramName, LOG_PID, LOG_MAIL);

=20  unsigned long int duration =3D 120, StartTime, TimeNow;

=20  signal(SIGINT, HandleSignal);
=20  signal(SIGTERM, HandleSignal);
=20  signal(SIGHUP, HandleSignal);
=20  signal(SIGQUIT, HandleSignal);

=20  StartTime =3D getTimeNow();

=20  tpool =3D (pthread_t*)malloc(workers * sizeof(pthread_t));

=20  if ( tpool =3D=3D NULL )
=20  {
=20     LogMessage(0, "malloc failed \n");
=20     closelog();
=20     exit(-1);
=20  }

=20  memset(tpool, 0, sizeof(pthread_t) * workers);

=20  loop =3D 1;

=20  for ( i =3D 0; i < workers; i++ )
=20  {
=20     rc =3D pthread_create(&tpool[i], NULL, (void *(*)(void*))&worker,=
=20(void*)i);

=20     if ( rc !=3D 0 )
=20     {
=20        LogMessage(0, "pthread_create #%d failed\n", i );
=20        pthread_cancel(tpool[i]);
=20     }
=20     else
=20     {
=20        pthread_detach(tpool[i]);
=20     }
=20  }

=20  LogMessage(0, "loop  =3D %d\n", loop);

=20  while ( loop )
=20  {
=20     TimeNow =3D getTimeNow();

=20     if ( ( TimeNow - StartTime )  > duration )
=20     {
=20         loop =3D 0;
=20     }

=20     usleep(1000);
=20  }

=20  for ( i =3D 0; i < workers; i++ )
=20  {
=20     pthread_cancel(tpool[i]);
=20  }

=20  for ( i =3D 0; i < workers; i++ )
=20  {
=20     pthread_join(tpool[i], NULL);
=20  }

=20  free(tpool);
=20  closelog();
=20  exit(0);
}

</CODE>
Please note: This email and its content are subject to the disclaimer as =
displayed at the following link http://www.is.co.za/legal/E-mail+Confiden=
tiality+Notice+and+Disclaimer.htm. Should you not have Web access, send a=
=20mail to disclaimers@is.co.za and a copy will be emailed to you.

_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.o=
rg"
Please note: This email and its content are subject to the disclaimer as =
displayed at the following link http://www.is.co.za/legal/E-mail+Confiden=
tiality+Notice+and+Disclaimer.htm. Should you not have Web access, send a=
=20mail to disclaimers@is.co.za and a copy will be emailed to you.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9B425C841283E0418B1825D40CBCFA613D9E525940>