1#!/usr/sbin/dtrace -Cs 2/* 3 * anonpgpid.d - anonymous memory paging info by process on CPU. 4 * Written using DTrace (Solaris 10 3/05). 5 * 6 * This scripts may help identify which processes are affected by a system 7 * with low memory, which is paging to the physical swap device. A report 8 * of the process on the CPU when paging occured is printed. 9 * 10 * 18-Feb-2006, ver 0.51 (early release. check for newer versions) 11 * 12 * USAGE: anonpgpid.d # hit Ctrl-C to end 13 * 14 * FIELDS: 15 * PID Process ID 16 * CMD Process name 17 * D Direction, Read or Write 18 * BYTES Total bytes during sample 19 * 20 * NOTES: 21 * 22 * This program is currently an approximation - often the process when writing 23 * pages to swap will be "pageout" the pageout scanner, or "rcapd" the 24 * resource capping daemon. 25 * 26 * THANKS: James Dickens 27 * 28 * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. 29 * 30 * CDDL HEADER START 31 * 32 * The contents of this file are subject to the terms of the 33 * Common Development and Distribution License, Version 1.0 only 34 * (the "License"). You may not use this file except in compliance 35 * with the License. 36 * 37 * You can obtain a copy of the license at Docs/cddl1.txt 38 * or http://www.opensolaris.org/os/licensing. 39 * See the License for the specific language governing permissions 40 * and limitations under the License. 41 * 42 * CDDL HEADER END 43 * 44 * TODO: 45 * 46 * Track processes accurately. This is a little difficult - anonpgout 47 * occurs asynchronously to the process, and events related to this don't 48 * point back to the process. 49 * 50 * Author: Brendan Gregg [Sydney, Australia] 51 * 52 * 25-Jul-2005 Brendan Gregg Created this. 53 */ 54 55#include <sys/vnode.h> 56 57#pragma D option quiet 58 59/* print header */ 60dtrace:::BEGIN 61{ 62 printf("Tracing... Hit Ctrl-C to end.\n"); 63} 64 65fbt::pageio_setup:entry 66/((args[2]->v_flag & (VISSWAP | VSWAPLIKE)) != 0)/ 67{ 68 @total[pid, execname, args[3] & B_READ ? "R" : "W"] = sum(arg1); 69} 70 71dtrace:::END 72{ 73 printf("%6s %-16s %1s %s\n", "PID", "CMD", "D", "BYTES"); 74 printa("%6d %-16s %1s %@d\n", @total); 75} 76