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;