szaydel
1/26/2018 - 6:35 PM

Dtrace Scripts for observation of Kernel memory reaping

Collect kernel reaping activity.

#!/usr/sbin/dtrace -s

#pragma D option quiet
#pragma D option destructive

arc_kmem_reap_now:entry
{
        printf("%d ts=%d freemem=%d -> arc_kmem_reap_now\n",
            walltimestamp / 1000000000, timestamp, `freemem);
}

arc_kmem_reap_now:return
{
        printf("%d ts=%d freemem=%d <- arc_kmem_reap_now\n",
            walltimestamp / 1000000000, timestamp, `freemem);
}

kmem_cache_reap:entry
{
        self->cp = args[0];
        printf("%d freemem=%d -> cache reap %s\n", walltimestamp / 1000000000,
            `freemem, stringof(args[0]->cache_name));
}

kmem_cache_reap:return
/self->cp != NULL/
{
        printf("%d freemem=%d <- cache reap %s\n", walltimestamp / 1000000000,
            `freemem, stringof(self->cp->cache_name));
        self->cp = NULL;
}

kmem_depot_ws_reap:entry
{
        self->depot = args[0];
        printf("%d freemem=%d -> mag reap %s\n", walltimestamp / 1000000000,
            `freemem, stringof(args[0]->cache_name));
}

kmem_depot_ws_reap:entry
/self->depot != NULL/
{
        printf("%d freemem=%d <- mag reap %s\n", walltimestamp / 1000000000,
            `freemem, stringof(self->depot->cache_name));
        self->depot = NULL
}

htable_steal_active.isra.2:entry
{
        steals++;
}

profile-1hz
/arg0 != 0 && curthread == `kmem_taskq->tq_thr._tq_thread/
{
        printf("%d kmem_taskq cpu=%d pc=%a", walltimestamp / 1000000000, cpu, arg0);
        stack(60);
}

tick-1sec
{
        printf("%d freemem=%d needfree=%d steals=%d arc_size=%d arc_c=%d waiters=%d load=%d tq=%d\n",
            walltimestamp / 1000000000,
            `freemem, `needfree, steals,
            `arc_stats.arcstat_size.value.ui64,
            `arc_stats.arcstat_c.value.ui64,
            ((condvar_impl_t *)&`arc_reclaim_waiters_cv)->cv_waiters,
            `loadavg.lg_total,
            `kmem_taskq->tq_tasks - `kmem_taskq->tq_executed);
}