2006-07-14 11:24:42 +04:00
/* getdelays.c
*
* Utility to get per - pid and per - tgid delay accounting statistics
* Also illustrates usage of the taskstats interface
*
* Copyright ( C ) Shailabh Nagar , IBM Corp . 2005
* Copyright ( C ) Balbir Singh , IBM Corp . 2006
2006-07-14 11:24:45 +04:00
* Copyright ( c ) Jay Lan , SGI . 2006
2006-07-14 11:24:42 +04:00
*
2006-12-10 13:19:55 +03:00
* Compile with
* gcc - I / usr / src / linux / include getdelays . c - o getdelays
2006-07-14 11:24:42 +04:00
*/
# include <stdio.h>
# include <stdlib.h>
# include <errno.h>
# include <unistd.h>
# include <poll.h>
# include <string.h>
# include <fcntl.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/socket.h>
# include <signal.h>
# include <linux/genetlink.h>
# include <linux/taskstats.h>
2007-11-15 03:59:14 +03:00
# include <linux/cgroupstats.h>
2006-07-14 11:24:42 +04:00
/*
* Generic macros for dealing with netlink sockets . Might be duplicated
* elsewhere . It is recommended that commercial grade applications use
* libnl or libnetlink and use the interfaces provided by the library
*/
# define GENLMSG_DATA(glh) ((void *)(NLMSG_DATA(glh) + GENL_HDRLEN))
# define GENLMSG_PAYLOAD(glh) (NLMSG_PAYLOAD(glh, 0) - GENL_HDRLEN)
# define NLA_DATA(na) ((void *)((char*)(na) + NLA_HDRLEN))
# define NLA_PAYLOAD(len) (len - NLA_HDRLEN)
2006-12-10 13:19:55 +03:00
# define err(code, fmt, arg...) \
do { \
fprintf ( stderr , fmt , # # arg ) ; \
exit ( code ) ; \
} while ( 0 )
int done ;
int rcvbufsz ;
char name [ 100 ] ;
int dbg ;
int print_delays ;
[PATCH] io-accounting: add to getdelays
Wire up the IO accounting into getdelays.c.
Usage:
To display I/O stats for each exitting task:
vmm:/home/akpm> ./getdelays -m0,1,2,3 -i -l
cpumask 0 maskset 1
printing IO accounting
listen forever
rm: read=8192, write=0, cancelled_write=0
cvs: read=733184, write=4255744, cancelled_write=4096
make: read=217088, write=0, cancelled_write=0
cc1: read=4263936, write=12288, cancelled_write=0
as: read=811008, write=8192, cancelled_write=0
gcc: read=323584, write=0, cancelled_write=12288
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=4096
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=1011712, write=16384, cancelled_write=0
collect2: read=626688, write=0, cancelled_write=0
gcc: read=204800, write=0, cancelled_write=0
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=8192, write=16384, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
cc1: read=0, write=4096, cancelled_write=0
ld: read=4096, write=12288, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
To display I/O stats for a particular presently-running task:
vmm:/home/akpm> ./getdelays -i -p $(pidof crond)
printing IO accounting
crond: read=61440, write=0, cancelled_write=0
Cc: Jay Lan <jlan@sgi.com>
Cc: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Chris Sturtivant <csturtiv@sgi.com>
Cc: Tony Ernst <tee@sgi.com>
Cc: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
Cc: David Wright <daw@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-10 13:19:56 +03:00
int print_io_accounting ;
2007-07-16 10:40:48 +04:00
int print_task_context_switch_counts ;
2006-07-14 11:24:45 +04:00
__u64 stime , utime ;
2006-12-10 13:19:55 +03:00
2006-07-14 11:24:45 +04:00
# define PRINTF(fmt, arg...) { \
if ( dbg ) { \
printf ( fmt , # # arg ) ; \
} \
}
/* Maximum size of response requested or message sent */
2006-11-03 09:07:26 +03:00
# define MAX_MSG_SIZE 1024
2006-07-14 11:24:45 +04:00
/* Maximum number of cpus expected to be specified in a cpumask */
# define MAX_CPUS 32
struct msgtemplate {
struct nlmsghdr n ;
struct genlmsghdr g ;
char buf [ MAX_MSG_SIZE ] ;
} ;
char cpumask [ 100 + 6 * MAX_CPUS ] ;
2006-07-14 11:24:42 +04:00
2007-05-08 11:30:13 +04:00
static void usage ( void )
{
fprintf ( stderr , " getdelays [-dilv] [-w logfile] [-r bufsize] "
" [-m cpumask] [-t tgid] [-p pid] \n " ) ;
fprintf ( stderr , " -d: print delayacct stats \n " ) ;
fprintf ( stderr , " -i: print IO accounting (works only with -p) \n " ) ;
fprintf ( stderr , " -l: listen forever \n " ) ;
fprintf ( stderr , " -v: debug on \n " ) ;
2007-11-15 03:59:14 +03:00
fprintf ( stderr , " -C: container path \n " ) ;
2007-05-08 11:30:13 +04:00
}
2006-07-14 11:24:42 +04:00
/*
* Create a raw netlink socket and bind
*/
2006-07-14 11:24:45 +04:00
static int create_nl_socket ( int protocol )
2006-07-14 11:24:42 +04:00
{
2006-07-14 11:24:45 +04:00
int fd ;
struct sockaddr_nl local ;
fd = socket ( AF_NETLINK , SOCK_RAW , protocol ) ;
if ( fd < 0 )
return - 1 ;
if ( rcvbufsz )
if ( setsockopt ( fd , SOL_SOCKET , SO_RCVBUF ,
& rcvbufsz , sizeof ( rcvbufsz ) ) < 0 ) {
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " Unable to set socket rcv buf size "
" to %d \n " ,
rcvbufsz ) ;
2006-07-14 11:24:45 +04:00
return - 1 ;
}
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
memset ( & local , 0 , sizeof ( local ) ) ;
local . nl_family = AF_NETLINK ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
if ( bind ( fd , ( struct sockaddr * ) & local , sizeof ( local ) ) < 0 )
goto error ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
return fd ;
error :
close ( fd ) ;
return - 1 ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
int send_cmd ( int sd , __u16 nlmsg_type , __u32 nlmsg_pid ,
__u8 genl_cmd , __u16 nla_type ,
void * nla_data , int nla_len )
2006-07-14 11:24:42 +04:00
{
2006-07-14 11:24:45 +04:00
struct nlattr * na ;
struct sockaddr_nl nladdr ;
int r , buflen ;
char * buf ;
struct msgtemplate msg ;
msg . n . nlmsg_len = NLMSG_LENGTH ( GENL_HDRLEN ) ;
msg . n . nlmsg_type = nlmsg_type ;
msg . n . nlmsg_flags = NLM_F_REQUEST ;
msg . n . nlmsg_seq = 0 ;
msg . n . nlmsg_pid = nlmsg_pid ;
msg . g . cmd = genl_cmd ;
msg . g . version = 0x1 ;
na = ( struct nlattr * ) GENLMSG_DATA ( & msg ) ;
na - > nla_type = nla_type ;
na - > nla_len = nla_len + 1 + NLA_HDRLEN ;
memcpy ( NLA_DATA ( na ) , nla_data , nla_len ) ;
msg . n . nlmsg_len + = NLMSG_ALIGN ( na - > nla_len ) ;
buf = ( char * ) & msg ;
buflen = msg . n . nlmsg_len ;
memset ( & nladdr , 0 , sizeof ( nladdr ) ) ;
nladdr . nl_family = AF_NETLINK ;
while ( ( r = sendto ( sd , buf , buflen , 0 , ( struct sockaddr * ) & nladdr ,
sizeof ( nladdr ) ) ) < buflen ) {
if ( r > 0 ) {
buf + = r ;
buflen - = r ;
} else if ( errno ! = EAGAIN )
return - 1 ;
}
return 0 ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
2006-07-14 11:24:42 +04:00
/*
* Probe the controller in genetlink to find the family id
* for the TASKSTATS family
*/
int get_family_id ( int sd )
{
2006-07-14 11:24:45 +04:00
struct {
struct nlmsghdr n ;
struct genlmsghdr g ;
char buf [ 256 ] ;
} ans ;
2008-02-08 15:21:56 +03:00
int id = 0 , rc ;
2006-07-14 11:24:45 +04:00
struct nlattr * na ;
int rep_len ;
strcpy ( name , TASKSTATS_GENL_NAME ) ;
rc = send_cmd ( sd , GENL_ID_CTRL , getpid ( ) , CTRL_CMD_GETFAMILY ,
CTRL_ATTR_FAMILY_NAME , ( void * ) name ,
strlen ( TASKSTATS_GENL_NAME ) + 1 ) ;
rep_len = recv ( sd , & ans , sizeof ( ans ) , 0 ) ;
if ( ans . n . nlmsg_type = = NLMSG_ERROR | |
( rep_len < 0 ) | | ! NLMSG_OK ( ( & ans . n ) , rep_len ) )
return 0 ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
na = ( struct nlattr * ) GENLMSG_DATA ( & ans ) ;
na = ( struct nlattr * ) ( ( char * ) na + NLA_ALIGN ( na - > nla_len ) ) ;
if ( na - > nla_type = = CTRL_ATTR_FAMILY_ID ) {
id = * ( __u16 * ) NLA_DATA ( na ) ;
}
return id ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
void print_delayacct ( struct taskstats * t )
2006-07-14 11:24:42 +04:00
{
2006-07-14 11:24:45 +04:00
printf ( " \n \n CPU %15s%15s%15s%15s \n "
" %15llu%15llu%15llu%15llu \n "
" IO %15s%15s \n "
" %15llu%15llu \n "
2008-07-25 12:48:54 +04:00
" SWAP %15s%15s \n "
" %15llu%15llu \n "
" RECLAIM %12s%15s \n "
2007-08-23 03:31:42 +04:00
" %15llu%15llu \n " ,
2006-07-14 11:24:45 +04:00
" count " , " real total " , " virtual total " , " delay total " ,
docsrc: fix getdelays printk formats
Fix printf format type warnings (seen on alpha & ia64):
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 7 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 8 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 9 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 12 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 13 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 16 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 17 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 2 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 3 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:236: warning: 'cmd_type' may be used uninitialized in this function
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-13 02:09:10 +04:00
( unsigned long long ) t - > cpu_count ,
( unsigned long long ) t - > cpu_run_real_total ,
( unsigned long long ) t - > cpu_run_virtual_total ,
( unsigned long long ) t - > cpu_delay_total ,
2006-07-14 11:24:45 +04:00
" count " , " delay total " ,
docsrc: fix getdelays printk formats
Fix printf format type warnings (seen on alpha & ia64):
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 7 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 8 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 9 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 12 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 13 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 16 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 17 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 2 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 3 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:236: warning: 'cmd_type' may be used uninitialized in this function
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-13 02:09:10 +04:00
( unsigned long long ) t - > blkio_count ,
( unsigned long long ) t - > blkio_delay_total ,
2008-07-25 12:48:54 +04:00
" count " , " delay total " ,
docsrc: fix getdelays printk formats
Fix printf format type warnings (seen on alpha & ia64):
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 7 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 8 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 9 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 12 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 13 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 16 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 17 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 2 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 3 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:236: warning: 'cmd_type' may be used uninitialized in this function
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-13 02:09:10 +04:00
( unsigned long long ) t - > swapin_count ,
( unsigned long long ) t - > swapin_delay_total ,
" count " , " delay total " ,
( unsigned long long ) t - > freepages_count ,
( unsigned long long ) t - > freepages_delay_total ) ;
2006-07-14 11:24:42 +04:00
}
2007-07-16 10:40:48 +04:00
void task_context_switch_counts ( struct taskstats * t )
{
printf ( " \n \n Task %15s%15s \n "
2008-02-08 15:21:56 +03:00
" %15llu%15llu \n " ,
2007-07-16 10:40:48 +04:00
" voluntary " , " nonvoluntary " ,
docsrc: fix getdelays printk formats
Fix printf format type warnings (seen on alpha & ia64):
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 7 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 8 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 9 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 12 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 13 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 16 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 17 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 2 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 3 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:236: warning: 'cmd_type' may be used uninitialized in this function
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-13 02:09:10 +04:00
( unsigned long long ) t - > nvcsw , ( unsigned long long ) t - > nivcsw ) ;
2007-07-16 10:40:48 +04:00
}
2007-11-15 03:59:14 +03:00
void print_cgroupstats ( struct cgroupstats * c )
{
printf ( " sleeping %llu, blocked %llu, running %llu, stopped %llu, "
docsrc: fix getdelays printk formats
Fix printf format type warnings (seen on alpha & ia64):
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 7 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 8 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 9 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 12 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 13 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 16 has type '__u64'
Documentation/accounting/getdelays.c:206: warning: format '%15llu' expects type 'long long unsigned int', but argument 17 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:214: warning: format '%15llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 2 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 3 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 4 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 5 has type '__u64'
Documentation/accounting/getdelays.c:221: warning: format '%llu' expects type 'long long unsigned int', but argument 6 has type '__u64'
Documentation/accounting/getdelays.c:236: warning: 'cmd_type' may be used uninitialized in this function
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-13 02:09:10 +04:00
" uninterruptible %llu \n " , ( unsigned long long ) c - > nr_sleeping ,
( unsigned long long ) c - > nr_io_wait ,
( unsigned long long ) c - > nr_running ,
( unsigned long long ) c - > nr_stopped ,
( unsigned long long ) c - > nr_uninterruptible ) ;
2007-11-15 03:59:14 +03:00
}
[PATCH] io-accounting: add to getdelays
Wire up the IO accounting into getdelays.c.
Usage:
To display I/O stats for each exitting task:
vmm:/home/akpm> ./getdelays -m0,1,2,3 -i -l
cpumask 0 maskset 1
printing IO accounting
listen forever
rm: read=8192, write=0, cancelled_write=0
cvs: read=733184, write=4255744, cancelled_write=4096
make: read=217088, write=0, cancelled_write=0
cc1: read=4263936, write=12288, cancelled_write=0
as: read=811008, write=8192, cancelled_write=0
gcc: read=323584, write=0, cancelled_write=12288
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=4096
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=1011712, write=16384, cancelled_write=0
collect2: read=626688, write=0, cancelled_write=0
gcc: read=204800, write=0, cancelled_write=0
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=8192, write=16384, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
cc1: read=0, write=4096, cancelled_write=0
ld: read=4096, write=12288, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
To display I/O stats for a particular presently-running task:
vmm:/home/akpm> ./getdelays -i -p $(pidof crond)
printing IO accounting
crond: read=61440, write=0, cancelled_write=0
Cc: Jay Lan <jlan@sgi.com>
Cc: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Chris Sturtivant <csturtiv@sgi.com>
Cc: Tony Ernst <tee@sgi.com>
Cc: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
Cc: David Wright <daw@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-10 13:19:56 +03:00
void print_ioacct ( struct taskstats * t )
{
printf ( " %s: read=%llu, write=%llu, cancelled_write=%llu \n " ,
t - > ac_comm ,
( unsigned long long ) t - > read_bytes ,
( unsigned long long ) t - > write_bytes ,
( unsigned long long ) t - > cancelled_write_bytes ) ;
}
2006-07-14 11:24:42 +04:00
int main ( int argc , char * argv [ ] )
{
2006-07-14 11:24:45 +04:00
int c , rc , rep_len , aggr_len , len2 , cmd_type ;
__u16 id ;
__u32 mypid ;
struct nlattr * na ;
int nl_sd = - 1 ;
int len = 0 ;
pid_t tid = 0 ;
pid_t rtid = 0 ;
int fd = 0 ;
int count = 0 ;
int write_file = 0 ;
int maskset = 0 ;
2007-05-08 11:30:25 +04:00
char * logfile = NULL ;
2006-07-14 11:24:45 +04:00
int loop = 0 ;
2007-11-15 03:59:14 +03:00
int containerset = 0 ;
char containerpath [ 1024 ] ;
int cfd = 0 ;
2006-07-14 11:24:45 +04:00
struct msgtemplate msg ;
while ( 1 ) {
2007-11-15 03:59:14 +03:00
c = getopt ( argc , argv , " qdiw:r:m:t:p:vlC: " ) ;
2006-07-14 11:24:45 +04:00
if ( c < 0 )
break ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
switch ( c ) {
case ' d ' :
printf ( " print delayacct stats ON \n " ) ;
print_delays = 1 ;
break ;
[PATCH] io-accounting: add to getdelays
Wire up the IO accounting into getdelays.c.
Usage:
To display I/O stats for each exitting task:
vmm:/home/akpm> ./getdelays -m0,1,2,3 -i -l
cpumask 0 maskset 1
printing IO accounting
listen forever
rm: read=8192, write=0, cancelled_write=0
cvs: read=733184, write=4255744, cancelled_write=4096
make: read=217088, write=0, cancelled_write=0
cc1: read=4263936, write=12288, cancelled_write=0
as: read=811008, write=8192, cancelled_write=0
gcc: read=323584, write=0, cancelled_write=12288
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=4096
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=1011712, write=16384, cancelled_write=0
collect2: read=626688, write=0, cancelled_write=0
gcc: read=204800, write=0, cancelled_write=0
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=8192, write=16384, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
cc1: read=0, write=4096, cancelled_write=0
ld: read=4096, write=12288, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
To display I/O stats for a particular presently-running task:
vmm:/home/akpm> ./getdelays -i -p $(pidof crond)
printing IO accounting
crond: read=61440, write=0, cancelled_write=0
Cc: Jay Lan <jlan@sgi.com>
Cc: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Chris Sturtivant <csturtiv@sgi.com>
Cc: Tony Ernst <tee@sgi.com>
Cc: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
Cc: David Wright <daw@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-10 13:19:56 +03:00
case ' i ' :
printf ( " printing IO accounting \n " ) ;
print_io_accounting = 1 ;
break ;
2007-07-16 10:40:48 +04:00
case ' q ' :
printf ( " printing task/process context switch rates \n " ) ;
print_task_context_switch_counts = 1 ;
break ;
2007-11-15 03:59:14 +03:00
case ' C ' :
containerset = 1 ;
strncpy ( containerpath , optarg , strlen ( optarg ) + 1 ) ;
break ;
2006-07-14 11:24:45 +04:00
case ' w ' :
2007-05-08 11:30:25 +04:00
logfile = strdup ( optarg ) ;
2006-07-14 11:24:45 +04:00
printf ( " write to file %s \n " , logfile ) ;
write_file = 1 ;
break ;
case ' r ' :
rcvbufsz = atoi ( optarg ) ;
printf ( " receive buf size %d \n " , rcvbufsz ) ;
if ( rcvbufsz < 0 )
err ( 1 , " Invalid rcv buf size \n " ) ;
break ;
case ' m ' :
strncpy ( cpumask , optarg , sizeof ( cpumask ) ) ;
maskset = 1 ;
printf ( " cpumask %s maskset %d \n " , cpumask , maskset ) ;
break ;
case ' t ' :
tid = atoi ( optarg ) ;
if ( ! tid )
err ( 1 , " Invalid tgid \n " ) ;
cmd_type = TASKSTATS_CMD_ATTR_TGID ;
break ;
case ' p ' :
tid = atoi ( optarg ) ;
if ( ! tid )
err ( 1 , " Invalid pid \n " ) ;
cmd_type = TASKSTATS_CMD_ATTR_PID ;
break ;
case ' v ' :
printf ( " debug on \n " ) ;
dbg = 1 ;
break ;
case ' l ' :
printf ( " listen forever \n " ) ;
loop = 1 ;
break ;
default :
2007-05-08 11:30:13 +04:00
usage ( ) ;
2006-07-14 11:24:45 +04:00
exit ( - 1 ) ;
2006-07-14 11:24:42 +04:00
}
}
2006-07-14 11:24:45 +04:00
if ( write_file ) {
fd = open ( logfile , O_WRONLY | O_CREAT | O_TRUNC ,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ) ;
if ( fd = = - 1 ) {
perror ( " Cannot open output file \n " ) ;
exit ( 1 ) ;
}
}
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
if ( ( nl_sd = create_nl_socket ( NETLINK_GENERIC ) ) < 0 )
err ( 1 , " error creating Netlink socket \n " ) ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
mypid = getpid ( ) ;
id = get_family_id ( nl_sd ) ;
if ( ! id ) {
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " Error getting family id, errno %d \n " , errno ) ;
2006-07-14 11:24:45 +04:00
goto err ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
PRINTF ( " family id %d \n " , id ) ;
if ( maskset ) {
rc = send_cmd ( nl_sd , id , mypid , TASKSTATS_CMD_GET ,
TASKSTATS_CMD_ATTR_REGISTER_CPUMASK ,
2006-10-01 10:28:54 +04:00
& cpumask , strlen ( cpumask ) + 1 ) ;
2006-07-14 11:24:45 +04:00
PRINTF ( " Sent register cpumask, retval %d \n " , rc ) ;
if ( rc < 0 ) {
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " error sending register cpumask \n " ) ;
2006-07-14 11:24:45 +04:00
goto err ;
}
2006-07-14 11:24:42 +04:00
}
2007-11-15 03:59:14 +03:00
if ( tid & & containerset ) {
fprintf ( stderr , " Select either -t or -C, not both \n " ) ;
goto err ;
}
2006-07-14 11:24:45 +04:00
if ( tid ) {
rc = send_cmd ( nl_sd , id , mypid , TASKSTATS_CMD_GET ,
cmd_type , & tid , sizeof ( __u32 ) ) ;
PRINTF ( " Sent pid/tgid, retval %d \n " , rc ) ;
if ( rc < 0 ) {
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " error sending tid/tgid cmd \n " ) ;
2006-07-14 11:24:45 +04:00
goto done ;
}
2006-07-14 11:24:42 +04:00
}
2007-11-15 03:59:14 +03:00
if ( containerset ) {
cfd = open ( containerpath , O_RDONLY ) ;
if ( cfd < 0 ) {
perror ( " error opening container file " ) ;
goto err ;
}
rc = send_cmd ( nl_sd , id , mypid , CGROUPSTATS_CMD_GET ,
CGROUPSTATS_CMD_ATTR_FD , & cfd , sizeof ( __u32 ) ) ;
if ( rc < 0 ) {
perror ( " error sending cgroupstats command " ) ;
goto err ;
}
}
2006-07-14 11:24:45 +04:00
do {
int i ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
rep_len = recv ( nl_sd , & msg , sizeof ( msg ) , 0 ) ;
PRINTF ( " received %d bytes \n " , rep_len ) ;
2006-07-14 11:24:42 +04:00
2006-07-14 11:24:45 +04:00
if ( rep_len < 0 ) {
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " nonfatal reply error: errno %d \n " ,
errno ) ;
2006-07-14 11:24:45 +04:00
continue ;
}
if ( msg . n . nlmsg_type = = NLMSG_ERROR | |
! NLMSG_OK ( ( & msg . n ) , rep_len ) ) {
2006-10-01 10:28:54 +04:00
struct nlmsgerr * err = NLMSG_DATA ( & msg ) ;
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " fatal reply error, errno %d \n " ,
err - > error ) ;
2006-07-14 11:24:45 +04:00
goto done ;
}
2008-02-08 15:21:56 +03:00
PRINTF ( " nlmsghdr size=%zu, nlmsg_len=%d, rep_len=%d \n " ,
2006-07-14 11:24:45 +04:00
sizeof ( struct nlmsghdr ) , msg . n . nlmsg_len , rep_len ) ;
rep_len = GENLMSG_PAYLOAD ( & msg . n ) ;
na = ( struct nlattr * ) GENLMSG_DATA ( & msg ) ;
len = 0 ;
i = 0 ;
while ( len < rep_len ) {
len + = NLA_ALIGN ( na - > nla_len ) ;
switch ( na - > nla_type ) {
case TASKSTATS_TYPE_AGGR_TGID :
/* Fall through */
case TASKSTATS_TYPE_AGGR_PID :
aggr_len = NLA_PAYLOAD ( na - > nla_len ) ;
len2 = 0 ;
/* For nested attributes, na follows */
na = ( struct nlattr * ) NLA_DATA ( na ) ;
done = 0 ;
while ( len2 < aggr_len ) {
switch ( na - > nla_type ) {
case TASKSTATS_TYPE_PID :
rtid = * ( int * ) NLA_DATA ( na ) ;
if ( print_delays )
printf ( " PID \t %d \n " , rtid ) ;
break ;
case TASKSTATS_TYPE_TGID :
rtid = * ( int * ) NLA_DATA ( na ) ;
if ( print_delays )
printf ( " TGID \t %d \n " , rtid ) ;
break ;
case TASKSTATS_TYPE_STATS :
count + + ;
if ( print_delays )
print_delayacct ( ( struct taskstats * ) NLA_DATA ( na ) ) ;
[PATCH] io-accounting: add to getdelays
Wire up the IO accounting into getdelays.c.
Usage:
To display I/O stats for each exitting task:
vmm:/home/akpm> ./getdelays -m0,1,2,3 -i -l
cpumask 0 maskset 1
printing IO accounting
listen forever
rm: read=8192, write=0, cancelled_write=0
cvs: read=733184, write=4255744, cancelled_write=4096
make: read=217088, write=0, cancelled_write=0
cc1: read=4263936, write=12288, cancelled_write=0
as: read=811008, write=8192, cancelled_write=0
gcc: read=323584, write=0, cancelled_write=12288
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=4096
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=1011712, write=16384, cancelled_write=0
collect2: read=626688, write=0, cancelled_write=0
gcc: read=204800, write=0, cancelled_write=0
cc1: read=0, write=8192, cancelled_write=0
as: read=4096, write=4096, cancelled_write=0
gcc: read=16384, write=0, cancelled_write=8192
ld: read=8192, write=16384, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
cc1: read=0, write=4096, cancelled_write=0
ld: read=4096, write=12288, cancelled_write=0
collect2: read=49152, write=0, cancelled_write=0
gcc: read=0, write=0, cancelled_write=0
To display I/O stats for a particular presently-running task:
vmm:/home/akpm> ./getdelays -i -p $(pidof crond)
printing IO accounting
crond: read=61440, write=0, cancelled_write=0
Cc: Jay Lan <jlan@sgi.com>
Cc: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Chris Sturtivant <csturtiv@sgi.com>
Cc: Tony Ernst <tee@sgi.com>
Cc: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
Cc: David Wright <daw@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-10 13:19:56 +03:00
if ( print_io_accounting )
print_ioacct ( ( struct taskstats * ) NLA_DATA ( na ) ) ;
2007-07-16 10:40:48 +04:00
if ( print_task_context_switch_counts )
task_context_switch_counts ( ( struct taskstats * ) NLA_DATA ( na ) ) ;
2006-07-14 11:24:45 +04:00
if ( fd ) {
if ( write ( fd , NLA_DATA ( na ) , na - > nla_len ) < 0 ) {
err ( 1 , " write error \n " ) ;
}
}
if ( ! loop )
goto done ;
break ;
default :
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " Unknown nested "
" nla_type %d \n " ,
na - > nla_type ) ;
2006-07-14 11:24:45 +04:00
break ;
}
len2 + = NLA_ALIGN ( na - > nla_len ) ;
na = ( struct nlattr * ) ( ( char * ) na + len2 ) ;
}
break ;
2007-11-15 03:59:14 +03:00
case CGROUPSTATS_TYPE_CGROUP_STATS :
print_cgroupstats ( NLA_DATA ( na ) ) ;
break ;
2006-07-14 11:24:45 +04:00
default :
2006-12-10 13:19:55 +03:00
fprintf ( stderr , " Unknown nla_type %d \n " ,
na - > nla_type ) ;
2006-07-14 11:24:45 +04:00
break ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
na = ( struct nlattr * ) ( GENLMSG_DATA ( & msg ) + len ) ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
} while ( loop ) ;
done :
if ( maskset ) {
rc = send_cmd ( nl_sd , id , mypid , TASKSTATS_CMD_GET ,
TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK ,
2006-10-01 10:28:54 +04:00
& cpumask , strlen ( cpumask ) + 1 ) ;
2006-07-14 11:24:45 +04:00
printf ( " Sent deregister mask, retval %d \n " , rc ) ;
if ( rc < 0 )
err ( rc , " error sending deregister cpumask \n " ) ;
2006-07-14 11:24:42 +04:00
}
2006-07-14 11:24:45 +04:00
err :
close ( nl_sd ) ;
if ( fd )
close ( fd ) ;
2007-11-15 03:59:14 +03:00
if ( cfd )
close ( cfd ) ;
2006-07-14 11:24:45 +04:00
return 0 ;
2006-07-14 11:24:42 +04:00
}