Sindbad~EG File Manager
#!/usr/bin/stap
# nfsd global counters
global nfsd_lookups
global nfsd_reads
global nfsd_writes
global nfsd_creates
global nfsd_commits
global nfsd_removes
# nfsd client tables
global nfsd_lookup_clients
global nfsd_lookup_clients_last_file
global nfsd_read_clients
global nfsd_write_clients
# Accumulate lookup stats
# Keep a count of lookups globally and by client_ip
# also keep track of the last file looked up by each
# client_ip
probe nfsd.proc.lookup {
nfsd_lookups <<< 1
nfsd_lookup_clients[client_ip] <<< 1
# If no command line argument is provided, remember the last
# directory name and filename ('foo/bar.c') of the lookup. If
# a command line argument was provided, remember the full
# pathname of the last lookup ('/home/user/foo/bar.c').
%( $# == 0 %?
nfsd_lookup_clients_last_file[client_ip]
= sprintf("%s/%s", d_name(fh->fh_dentry), filename)
%:
nfsd_lookup_clients_last_file[client_ip]
= sprintf("%s/%s",
task_dentry_path(task_current(),
fh->fh_dentry,
fh->fh_export->ex_path->mnt),
filename)
%)
}
# Accumulate read stats
# Keep a count of reads globally and by client_ip
# also keep track of the number of bytes read globally
# and per-client_ip
probe nfsd.proc.read {
nfsd_reads <<< size
nfsd_read_clients[client_ip] <<< size
}
# Accumulate write stats
# Keep a count of writes globally and by client_ip
# also keep track of the number of bytes writen globally
# and per-client_ip
probe nfsd.proc.write {
nfsd_writes <<< size
nfsd_write_clients[client_ip] <<< size
}
# Just count creates for now
probe nfsd.proc.create {
nfsd_creates <<< 1
}
# Just count commits for now
probe nfsd.proc.commit {
nfsd_commits <<< 1
}
# Just count removes for now
probe nfsd.proc.remove {
nfsd_removes <<< 1
}
# This is our "main loop" executed once every $interval
# We clear the terminal (top-style screen updates) and then
# to write out all our stats areas as fast as possible.
# Currently there are three sections:
#
# Global stats
# Top 10 lookup clients
# Top 10 reading clients
# Top 10 writing clients
#
probe timer.ms(1000)
{
ansi_clear_screen()
print("\n")
printf("lookups : %8d\n", @count(nfsd_lookups))
printf("reads : %8d\n", @count(nfsd_reads))
printf("r/bytes : %8d KiB\n", @sum(nfsd_reads) >> 10)
printf("writes : %8d\n", @count(nfsd_writes))
printf("w/bytes : %8d KiB\n", @sum(nfsd_writes) >> 10)
printf("creates : %8d\n", @count(nfsd_creates))
printf("commits : %8d\n", @count(nfsd_commits))
printf("removes : %8d\n", @count(nfsd_removes))
printf("\n")
print("lookups\n")
printf("client\t\t\tlast file\n")
foreach (ip in nfsd_lookup_clients- limit 10)
printf("%s\t%s\n", ip, nfsd_lookup_clients_last_file[ip])
print("\n")
print("reads\n")
printf("client\t\t\treads\tbytes\n")
foreach (ip in nfsd_read_clients- limit 10)
printf("%s\t%d\t%d\n", ip, @count(nfsd_read_clients[ip]),
@sum(nfsd_read_clients[ip]))
print("\n")
printf("writes\n")
printf("client\t\t\twrites\tbytes\n")
foreach (ip in nfsd_write_clients- limit 10)
printf("%s\t%d\t%d\n", ip, @count(nfsd_write_clients[ip]),
@sum(nfsd_write_clients[ip]))
delete nfsd_lookups
delete nfsd_reads
delete nfsd_writes
delete nfsd_creates
delete nfsd_commits
delete nfsd_removes
delete nfsd_lookup_clients
delete nfsd_lookup_clients_last_file
delete nfsd_read_clients
delete nfsd_write_clients
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists