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 : [メールアドレス保護] /