On Sun, 19 Jan 2014, Adam Thompson wrote:
> Yes, it's essentially a preforming web server.  PSGI, Starlet, I think. 
> However, I think I'm also running into a problem with IPC::Run, which 
> does not pass all its tests successfully on 5.4-Release, so the children 
> never exit / are never reaped.  Not sure. I can confirm that the # of 
> new processes per second stays approximately zero while I'm watching 
> this behavior, so in any case I doubt my results are due to sampling 
> artifacts.

Hmm, don't know what's up with IPC::Run, but try this kernel patch.


Philip Guenther


Index: sys/sys/resourcevar.h
===================================================================
RCS file: /cvs/src/sys/sys/resourcevar.h,v
retrieving revision 1.17
diff -u -p -r1.17 resourcevar.h
--- sys/sys/resourcevar.h       8 Oct 2013 03:50:07 -0000       1.17
+++ sys/sys/resourcevar.h       17 Jan 2014 00:34:32 -0000
@@ -59,6 +59,7 @@ do {                                                          
        \
 void    addupc_intr(struct proc *, u_long);
 void    addupc_task(struct proc *, u_long, u_int);
 void    tuagg_unlocked(struct process *, struct proc *);
+void    tuagg(struct process *, struct proc *);
 struct tusage;
 void    calctsru(struct tusage *, struct timespec *, struct timespec *,
            struct timespec *);
Index: sys/sys/ktrace.h
===================================================================
RCS file: /cvs/src/sys/sys/ktrace.h,v
retrieving revision 1.17
diff -u -p -r1.17 ktrace.h
--- sys/sys/ktrace.h    14 Sep 2013 02:28:02 -0000      1.17
+++ sys/sys/ktrace.h    17 Jan 2014 00:34:32 -0000
@@ -224,6 +224,8 @@ void    ktrstruct(struct proc *, const c
        ktrstruct((p), "sigaction", (s), sizeof(struct sigaction))
 #define ktrrlimit(p, s) \
        ktrstruct((p), "rlimit", (s), sizeof(struct rlimit))
+#define ktrrusage(p, s) \
+       ktrstruct((p), "rusage", (s), sizeof(struct rusage))
 #define ktrfdset(p, s, l) \
        ktrstruct((p), "fdset", (s), l)
 
Index: sys/kern/kern_resource.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_resource.c,v
retrieving revision 1.46
diff -u -p -r1.46 kern_resource.c
--- sys/kern/kern_resource.c    25 Oct 2013 04:42:48 -0000      1.46
+++ sys/kern/kern_resource.c    17 Jan 2014 00:34:32 -0000
@@ -53,7 +53,6 @@
 #include <uvm/uvm_extern.h>
 
 void   tuagg_sub(struct tusage *, struct proc *);
-void   tuagg(struct process *, struct proc *);
 
 /*
  * Patchable maximum data and stack limits.
@@ -433,8 +432,13 @@ sys_getrusage(struct proc *p, void *v, r
        int error;
 
        error = dogetrusage(p, SCARG(uap, who), &ru);
-       if (error == 0)
+       if (error == 0) {
                error = copyout(&ru, SCARG(uap, rusage), sizeof(ru));
+#ifdef KTRACE
+               if (error == 0 && KTRPOINT(p, KTR_STRUCT))
+                       ktrrusage(p, &ru);
+#endif
+       }
        return (error);
 }
 
Index: sys/kern/kern_exit.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.129
diff -u -p -r1.129 kern_exit.c
--- sys/kern/kern_exit.c        25 Oct 2013 04:42:48 -0000      1.129
+++ sys/kern/kern_exit.c        17 Jan 2014 00:34:32 -0000
@@ -298,6 +298,7 @@ exit1(struct proc *p, int rv, int flags)
 
        /* add thread's accumulated rusage into the process's total */
        ruadd(rup, &p->p_ru);
+       tuagg(pr, p);
 
        /*
         * clear %cpu usage during swap
@@ -459,6 +460,10 @@ sys_wait4(struct proc *q, void *v, regis
        }
        if (error == 0 && SCARG(uap, rusage)) {
                error = copyout(&ru, SCARG(uap, rusage), sizeof(ru));
+#ifdef KTRACE
+               if (error == 0 && KTRPOINT(q, KTR_STRUCT))
+                       ktrrusage(q, &ru);
+#endif
        }
        return (error);
 }
Index: usr.bin/kdump/ktrstruct.c
===================================================================
RCS file: /cvs/src/usr.bin/kdump/ktrstruct.c,v
retrieving revision 1.2
diff -u -p -r1.2 ktrstruct.c
--- usr.bin/kdump/ktrstruct.c   9 Sep 2013 05:10:32 -0000       1.2
+++ usr.bin/kdump/ktrstruct.c   17 Jan 2014 00:34:32 -0000
@@ -208,12 +208,18 @@ ktrtimespec(const struct timespec *tsp, 
 }
 
 static void
-ktrtimeval(const struct timeval *tvp, int relative)
+print_timeval(const struct timeval *tvp, int relative)
 {
-       printf("struct timeval { ");
        print_time(tvp->tv_sec, relative);
        if (tvp->tv_usec != 0)
                printf(".%06ld", tvp->tv_usec);
+}
+
+static void
+ktrtimeval(const struct timeval *tvp, int relative)
+{
+       printf("struct timeval { ");
+       print_timeval(tvp, relative);
        printf(" }\n");
 }
 
@@ -294,6 +300,23 @@ ktrfdset(const struct fd_set *fds, int l
        printf(" }\n");
 }
 
+static void
+ktrrusage(const struct rusage *rup)
+{
+       printf("struct rusage { utime=");
+       print_timeval(&rup->ru_utime, 1);
+       printf(", stime=");
+       print_timeval(&rup->ru_stime, 1);
+       printf(", maxrss=%ld, ixrss=%ld, idrss=%ld, isrss=%ld,"
+           " minflt=%ld, majflt=%ld, nswap=%ld, inblock=%ld,"
+           " oublock=%ld, msgsnd=%ld, msgrcv=%ld, nsignals=%ld,"
+           " nvcsw=%ld, nivcsw=%ld }\n",
+           rup->ru_maxrss, rup->ru_ixrss, rup->ru_idrss, rup->ru_isrss,
+           rup->ru_minflt, rup->ru_majflt, rup->ru_nswap, rup->ru_inblock,
+           rup->ru_oublock, rup->ru_msgsnd, rup->ru_msgrcv, rup->ru_nsignals,
+           rup->ru_nvcsw, rup->ru_nivcsw);
+}
+
 void
 ktrstruct(char *buf, size_t buflen)
 {
@@ -363,6 +386,13 @@ ktrstruct(char *buf, size_t buflen)
                        goto invalid;
                memcpy(&lim, data, datalen);
                ktrrlimit(&lim);
+       } else if (strcmp(name, "rusage") == 0) {
+               struct rusage ru;
+
+               if (datalen != sizeof(ru))
+                       goto invalid;
+               memcpy(&ru, data, datalen);
+               ktrrusage(&ru);
        } else if (strcmp(name, "tfork") == 0) {
                struct __tfork tf;

Reply via email to