Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jul 2010 08:06:37 GMT
From:      Vikash <vikash.badal@is.co.za>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   threads/148515: Memory / syslog strangeness in FreeBSD 8.x ( possible leak/ threading issue )
Message-ID:  <201007120806.o6C86bjY051299@www.freebsd.org>
Resent-Message-ID: <201007120810.o6C8A6fs035554@freefall.freebsd.org>

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

>Number:         148515
>Category:       threads
>Synopsis:       Memory / syslog strangeness in FreeBSD 8.x ( possible leak/ threading issue )
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-threads
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jul 12 08:10:05 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Vikash
>Release:        8.0 RELEASE
>Organization:
>Environment:
FreeBSD vix.isnet.net 8.0-RELEASE-p3 FreeBSD 8.0-RELEASE-p3 #11: Sun Jun 27 20:10:59 SAST 2010     root@vix.isnet.net:/usr/obj/usr/src/sys/GENERIC  i386

>Description:
Can someone look into this strangeness on FreeBSD 8.0 and 8.1-RC2

using a threaded test code, I see the that freebsd 8.x seems to be using more memory than freebsd 7.x:


Results:

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

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

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

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

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

with syslog
  PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMAND
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/ PR search


either there is a leak or there is an undocumented behaviour in the 8.x threads.

neither freebsd-questions@freebsd.org nor freebsd-threads@freebsd.org yielded ant responses.

>How-To-Repeat:
compile the code below and observe the memory usage

8.x uses more memory than 7.x

<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 = "WTF";

int loop = 0;
int LogToSTDOUT = 1;

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

   char message[8192];

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

   va_list args;

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

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

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

}

unsigned long int getTimeNow()
{
   struct timeval tv;

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

   return tv.tv_sec;
}

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

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

   pthread_exit(0);
}

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

   int workers = 1000, i, rc;

   openlog(ProgramName, LOG_PID, LOG_MAIL);

   unsigned long int duration = 120, StartTime, TimeNow;

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

   StartTime = getTimeNow();

   tpool = (pthread_t*)malloc(workers * sizeof(pthread_t));

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

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

   loop = 1;

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

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

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

   while ( loop )
   {
      TimeNow = getTimeNow();

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

      usleep(1000);
   }

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

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

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

</CODE>

>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:



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