7.0-RELEASE(CPU: AMD-K6)になってから、gkrellm2の Swapメーターが、起動
時の値のままで変更されません。
sysutils/gkrellm2/work/gkrellm-2.3.0/src/sysdeps/freebsd.c
...
struct vmmeter sum;
...
if (kvm_read(kvmd, nl_mem[N_CNT].n_value, (char *)&sum,
sizeof(sum)) != sizeof(sum))
...
swappgsin = sum.v_swappgsin;
swappgsout = sum.v_swappgsout;
(gdb) p sum
$3 = {... v_swapin = 0, v_swapout = 0, v_swappgsin = 0, v_swappgsout = 0,
... v_page_count = 61095, ... v_free_count = 22020,
... v_wire_count = 12479, v_active_count = 15406, v_inactive_target = 2791,
... v_cache_count = 923 ...
変動中でも sum.v_swappgsin と sum.v_swappgsoutの値が "0"のままで替わら
ず、メーターが更新されないようです。
6.3 では正常です。どこかの設定の違いでしょうか?
ただ、topでは Swap値は正常に更新されているので、そこから 2つの読み込み
部分だけを借用(gtk用に少し変更)してみると
--- freebsd.c.orig 2007-07-07 08:53:07.000000000 +0900
+++ freebsd.c 2008-04-24 18:08:08.000000000 +0900
@@ -654,6 +654,9 @@
#include <sys/sysctl.h>
#include <vm/vm_param.h>
+#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
+static void getsysctl(const char *name, void *ptr, size_t len);
+
static struct nlist nl_mem[] = {
#define N_CNT 0
{ "_cnt" },
@@ -934,6 +937,23 @@
swap_total,
swap_used;
+static void
+getsysctl(const char *name, void *ptr, size_t len)
+{
+ size_t nlen = len;
+
+ if (sysctlbyname(name, ptr, &nlen, NULL, 0) == -1) {
+ fprintf(stderr, "top: sysctl(%s...) failed: %s\n", name,
+ strerror(errno));
+ exit(23);
+ }
+ if (nlen != len) {
+ fprintf(stderr, "top: sysctl(%s...) expected %lu, got %lu\n",
+ name, (unsigned long)len, (unsigned long)nlen);
+ exit(23);
+ }
+}
+
void
gkrellm_sys_mem_read_data(void)
{
@@ -941,6 +961,7 @@
static gint first_time_done = 0;
static gint swappgsin = -1;
static gint swappgsout = -1;
+ gint nspgsin, nspgsout;
gint dpagein, dpageout;
struct vmmeter sum;
guint64 total, used, x_used, free, shared, buffers, cached;
@@ -1039,6 +1060,9 @@
cached = sum.v_cache_count << pshift;
used = x_used - buffers - cached;
gkrellm_mem_assign_data(total, used, free, shared, buffers, cached);
+
+ GETSYSCTL("vm.stats.vm.v_swappgsin", nspgsin);
+ GETSYSCTL("vm.stats.vm.v_swappgsout", nspgsout);
if (swappgsin < 0)
{
dpagein = 0;
@@ -1046,11 +1070,11 @@
}
else
{
- dpagein = (sum.v_swappgsin - swappgsin) << (pshift - 10);
- dpageout = (sum.v_swappgsout - swappgsout) << (pshift - 10);
+ dpagein = (nspgsin - swappgsin) << pshift;
+ dpageout = (nspgsout - swappgsout) << pshift;
}
- swappgsin = sum.v_swappgsin;
- swappgsout = sum.v_swappgsout;
+ swappgsin = nspgsin << pshift;
+ swappgsout = nspgsout << pshift;
if (dpagein > 0 || dpageout > 0 || first_time_done == 0)
{
----------- ここまで ----------
jdk16での makeで、swap 100%で停止するまでの変化を、ちゃんとメーターで
示すようになります。
/usr/include/sys/vmmeter.hが 6.3から替っていて
...
/*
* System wide statistics counters.
* Locking:
* a - locked by atomic operations
* c - constant after initialization
* f - locked by vm_page_queue_free_mtx
* p - locked by being in the PCPU and atomicity respect to interrupts
* q - locked by vm_page_queue_mtx
*/
...
u_int v_swapin; /* (p) swap pager pageins */
u_int v_swapout; /* (p) swap pager pageouts */
...
swap 関係が、皆(p)となっているのですが(デュアルCPUへの対応でしょうか?)、
ここまで;
--
/ Name : Dobashi Mitsuyoshi /
/ E-mail :
[メールアドレス保護] /