1#!/bin/sh 2 3# 4# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28 29# Script to catch possible leaks in vm, malloc and mbufs 30# This version looks for increse in minimum values 31 32i=0 33while true; do 34 # Check for leaks in vm.zone 35 36# ITEM SIZE LIMIT USED FREE REQUESTS 37# 38# UMA Kegs: 140, 0, 66, 6, 66 39# UMA Zones: 120, 0, 66, 24, 66 40 41 vmstat -z | sed '1,3d;s/://g' | \ 42 sed 's/ */ /g;s/\([0-9]\) *\([0-9]\)/\1,\2/g;s/ \([0-9]\)/,\1/;s/^ *//' | \ 43 awk -F, ' 44/^..*$/{ 45 gsub("^ *", "", $1); 46 size=$4; 47 printf "vmstat -z %s,%s\n", $1, size; 48} 49' 50 # Check for leaks in mbufs 51 52# $ netstat -m 53# 1233/597/1830 mbufs in use (current/cache/total) 54# 1232/196/1428/8896 mbuf clusters in use (current/cache/total/max) 55# 1232/74 mbuf+clusters out of packet secondary zone in use (current/cache) 56# 0/0/0/0 4k (page size) jumbo clusters in use (current/cache/total/max) 57# 0/0/0/0 9k jumbo clusters in use (current/cache/total/max) 58# 0/0/0/0 16k jumbo clusters in use (current/cache/total/max) 59# 2772K/541K/3313K bytes allocated to network (current/cache/total) 60# 508/7778/5734 requests for mbufs denied (mbufs/clusters/mbuf+clusters) 61# 0/0/0 requests for jumbo clusters denied (4k/9k/16k) 62# 0/6/2480 sfbufs in use (current/peak/max) 63# 0 requests for sfbufs denied 64# 0 requests for sfbufs delayed 65# 0 requests for I/O initiated by sendfile 66# 251 calls to protocol drain routines 67 68 netstat -m | head -10 | sed 's#/# #g;s/k / /;s/K / /' | awk ' 69/mbufs / {mbufs=$1}; 70/ clusters/ {clusters=$2}; 71/sfbufs in use/ {sfbufs=$3}; 72/allocated/ {allocated=$1} 73END { 74 print "mbufs,", mbufs; 75 print "clusters,", clusters; 76 print "sfbufs,", sfbufs; 77 print "allocatedToNetwork,", allocated; 78} 79' 80# sysctl vm.kvm_free | tail -1 | sed 's/:/,/' # Need used here! 81 sleep 1 82done | awk -F, ' 83{ 84# Pairs of "name, value" are passed to this awk script 85 name=$1 86 size=$2 87 if (NF != 2) 88 print "Number of fields for ", name, "is ", NF 89 if (size == s[name]) 90 next; 91# print "name, size, old minimum :", name, size, s[name] 92 93 if ((size - 10 < s[name]) || (f[name] == 0)) { 94# print "Initial value / new minimum", n[name], s[name], size 95 n[name] = 0 96 if (f[name] == 0) 97 f[name] = 1 98 if (f[name] != 2) 99 s[name] = size 100 } 101 102 if (++n[name] > 120) { 103 cmd="date '+%T'" 104 cmd | getline t 105 close(cmd) 106# if (++w[name] > 4) { 107 printf "%s \"%s\" may be leaking, size %d\n", t, name, size 108 f[name] = 2 109# } 110 n[name] = 0 111 s[name] = size 112 } 113}' 114