Date: Sat, 10 Dec 2011 10:26:46 +0200 From: Mikolaj Golub <trociny@freebsd.org> To: John Baldwin <jhb@FreeBSD.org> Cc: svn-src-head@freebsd.org, Robert Watson <rwatson@freebsd.org>, svn-src-all@freebsd.org, src-committers@freebsd.org, Kostik Belousov <kib@freebsd.org> Subject: Re: svn commit: r227956 - head/usr.bin/procstat Message-ID: <86y5ukvnll.fsf@kopusha.home.net> In-Reply-To: <4EE12CE0.5070803@FreeBSD.org> (John Baldwin's message of "Thu, 08 Dec 2011 16:32:16 -0500") References: <201111242054.pAOKs6vj012296@svn.freebsd.org> <201111281330.11720.jhb@freebsd.org> <86liqt1ier.fsf@kopusha.home.net> <4EE1024C.6040800@FreeBSD.org> <86k466aip3.fsf@kopusha.home.net> <4EE12CE0.5070803@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=
On Thu, 08 Dec 2011 16:32:16 -0500 John Baldwin wrote:
>> JB> Hmm, I would stick as close to limits output as possible. I would
>> JB> consider duplicating the unit field in each of soft and hard, so you
>> JB> end up with something like this:
>>
>> JB> PID COMM RLIMIT SOFT HARD
>> JB> 48798 zsh cputime 100000 secs infinity secs
>> JB> 48798 zsh filesize infinity kb infinity kb
>> JB> 48798 zsh datasize 524288 kb 524288 kb
>>
>> JB> etc.
>>
>> Ok.
>>
>> JB> (Things like 'openfiles' is simply more intuitive than 'nofile' (no
>> JB> file?, huh? oh, num open files.. (except not all users will make the
>> JB> last step there).
>>
>> Then why do we have so non-intuitive rlimit_ident names?
>>
>> It looks like they are used only in procfs_rlimit.c. Do procfs(5) users always
>> make that last step with 'nofile'? :-)
JB> Well, I suspect it's best not to change the names in procfs in case
JB> there are existing binaries that parse the output of that file
JB> (unfortunately).
>> Is it possible to change rlimit_ident names? Just to ones that are used by
>> limit(1) or (if they look too long) to something like below:
JB> Hmm, I have no idea what other things might use rlimit_ident. Probably
JB> not many. (Also, for fun, note that the 'ulimit' and 'limit' built-in
JB> commands in sh and csh also have their own sets of names, fun!) I would
JB> maybe add a rlimit_names[] (just leave rlimit_ident alone), and give
JB> that the names from limits(1), and change both procstat and sh's
JB> ulimit' command to use those.
Adding yet another rlimit names to the header file does not look so attractive
for me as it was just using/reusing what we had :-). So I decided to hardcode
the names in procstat_rlimit.c (see the attached patch).
Output example:
PID COMM RLIMIT SOFT HARD
11949 zsh cputime 10000 sec infinity
11949 zsh filesize infinity infinity
11949 zsh datasize 524288 kB 524288 kB
11949 zsh stacksize 65536 kB 65536 kB
11949 zsh coredumpsize 190734 MB 190734 MB
11949 zsh memoryuse infinity infinity
11949 zsh memorylocked infinity infinity
11949 zsh maxprocesses 5547 5547
11949 zsh openfiles 11095 11095
11949 zsh sbsize infinity infinity
11949 zsh vmemoryuse infinity infinity
11949 zsh pseudo-terminals infinity infinity
11949 zsh swapuse infinity infinity
--
Mikolaj Golub
--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline; filename=procstat_rlimit.c.patch
Index: usr.bin/procstat/procstat_rlimit.c
===================================================================
--- usr.bin/procstat/procstat_rlimit.c (revision 228285)
+++ usr.bin/procstat/procstat_rlimit.c (working copy)
@@ -28,7 +28,6 @@
#include <sys/param.h>
#include <sys/time.h>
-#define _RLIMIT_IDENT
#include <sys/resourcevar.h>
#include <sys/sysctl.h>
#include <sys/user.h>
@@ -36,6 +35,7 @@
#include <err.h>
#include <errno.h>
#include <libprocstat.h>
+#include <libutil.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -43,17 +43,60 @@
#include "procstat.h"
+static struct {
+ const char *name;
+ const char *suffix;
+} rlimit_param[13] = {
+ {"cputime", "sec"},
+ {"filesize", "B "},
+ {"datasize", "B "},
+ {"stacksize", "B "},
+ {"coredumpsize", "B "},
+ {"memoryuse", "B "},
+ {"memorylocked", "B "},
+ {"maxprocesses", " "},
+ {"openfiles", " "},
+ {"sbsize", "B "},
+ {"vmemoryuse", "B "},
+ {"pseudo-terminals", " "},
+ {"swapuse", "B "},
+};
+
+#if RLIM_NLIMITS > 13
+#error "Resource limits have grown. Add new entries to rlimit_param[]."
+#endif
+
static struct rlimit rlimit[RLIM_NLIMITS];
+static
+const char *humanize_rlimit(int indx, rlim_t limit)
+{
+ static char buf[14];
+ int scale;
+
+ if (limit == RLIM_INFINITY)
+ return "infinity ";
+
+ scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit,
+ rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL);
+ (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit,
+ rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL);
+ /* Pad with one space if there is no suffix prefix. */
+ if (scale == 0)
+ sprintf(buf + strlen(buf), " ");
+ return (buf);
+}
+
void
procstat_rlimit(struct kinfo_proc *kipp)
{
int error, i, name[4];
size_t len;
- if (!hflag)
- printf("%5s %-16s %-10s %12s %12s\n", "PID", "COMM", "RLIMIT",
- "CURRENT", "MAX");
+ if (!hflag) {
+ printf("%5s %-16s %-16s %16s %16s\n",
+ "PID", "COMM", "RLIMIT", "SOFT ", "HARD ");
+ }
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_RLIMIT;
@@ -68,11 +111,9 @@ procstat_rlimit(struct kinfo_proc *kipp)
return;
for (i = 0; i < RLIM_NLIMITS; i++) {
- printf("%5d %-16s %-10s %12jd %12jd\n", kipp->ki_pid,
- kipp->ki_comm, rlimit_ident[i],
- rlimit[i].rlim_cur == RLIM_INFINITY ?
- -1 : rlimit[i].rlim_cur,
- rlimit[i].rlim_max == RLIM_INFINITY ?
- -1 : rlimit[i].rlim_max);
+ printf("%5d %-16s %-16s ", kipp->ki_pid, kipp->ki_comm,
+ rlimit_param[i].name);
+ printf("%16s ", humanize_rlimit(i, rlimit[i].rlim_cur));
+ printf("%16s\n", humanize_rlimit(i, rlimit[i].rlim_max));
}
}
--=-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86y5ukvnll.fsf>
