darshan-parser.c 6.62 KB
Newer Older
1 2 3 4 5
/*
 *  (C) 2009 by Argonne National Laboratory.
 *      See COPYRIGHT in top-level directory.
 */

6 7 8 9 10 11 12 13
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <zlib.h>
#include <time.h>
14
#include <stdlib.h>
15

16
#include "darshan-logutils.h"
17 18 19 20 21 22 23 24 25

int main(int argc, char **argv)
{
    int ret;
    struct darshan_job job;
    struct darshan_file cp_file;
    char tmp_string[1024];
    int no_files_flag = 0;
    time_t tmp_time = 0;
26
    darshan_fd file;
27
    int i;
28 29 30 31
    int mount_count;
    int* devs;
    char** mnt_pts;
    char** fs_types;
32 33 34 35 36 37 38

    if(argc != 2)
    {
        fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
        return(-1);
    }

39
    file = darshan_log_open(argv[1]);
40 41
    if(!file)
    {
42
        perror("darshan_log_open");
43 44 45 46
        return(-1);
    }
   
    /* read job info */
47
    ret = darshan_log_getjob(file, &job);
48
    if(ret < 0)
49
    {
50
        fprintf(stderr, "Error: unable to read job information from log file.\n");
51
        darshan_log_close(file);
52 53 54
        return(-1);
    }

55 56 57
    /* warn user about any missing information in this log format */
    darshan_log_print_version_warnings(&job);

58
    ret = darshan_log_getexe(file, tmp_string, &no_files_flag);
59
    if(ret < 0)
60
    {
61
        fprintf(stderr, "Error: unable to read trailing job information.\n");
62
        darshan_log_close(file);
63 64 65
        return(-1);
    }

66
    /* print job summary */
67
    printf("# darshan log version: %s\n", job.version_string);
68 69 70 71 72 73 74 75 76 77 78 79
    printf("# size of file statistics: %d bytes\n", sizeof(cp_file));
    printf("# size of job statistics: %d bytes\n", sizeof(job));
    printf("# exe: %s\n", tmp_string);
    printf("# uid: %d\n", job.uid);
    printf("# start_time: %ld\n", (long)job.start_time);
    tmp_time = (time_t)job.start_time;
    printf("# start_time_asci: %s", ctime(&tmp_time));
    printf("# end_time: %ld\n", (long)job.end_time);
    tmp_time = (time_t)job.end_time;
    printf("# end_time_asci: %s", ctime(&tmp_time));
    printf("# nprocs: %d\n", job.nprocs);
    printf("# run time: %ld\n", (long)(job.end_time - job.start_time + 1));
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
 
    /* print table of mounted file systems */
    ret = darshan_log_getmounts(file, &devs, &mnt_pts, &fs_types, &mount_count,
        &no_files_flag);
    printf("\n# mounted file systems (device, fs type, and mount point)\n");
    printf("# -------------------------------------------------------\n");
    for(i=0; i<mount_count; i++)
    {
        printf("# mount entry: %d\t%s\t%s\n", devs[i], mnt_pts[i], fs_types[i]);
        free(mnt_pts[i]);
        free(fs_types[i]);
    }
    free(devs);
    free(mnt_pts);
    free(fs_types);
  
96 97 98 99
    if(no_files_flag)
    {
        /* it looks like the app didn't open any files */
        printf("# no files opened.\n");
100
        darshan_log_close(file);
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
        return(0);
    }

    printf("\n# description of columns:\n");
    printf("#   <rank>: MPI rank.  -1 indicates that the file is shared\n");
    printf("#      across all processes and statistics are aggregated.\n");
    printf("#   <file>: hash of file path.  0 indicates that statistics\n");
    printf("#      are condensed to refer to all files opened at the given\n");
    printf("#      process.\n");
    printf("#   <counter> and <value>: statistical counters.\n");
    printf("#   <name suffix>: last %d characters of file name.\n", CP_NAME_SUFFIX_LEN);
    printf("\n# description of counters:\n");
    printf("#   CP_POSIX_*: posix operation counts.\n");
    printf("#   CP_COLL_*: MPI collective operation counts.\n");
    printf("#   CP_INDEP_*: MPI independent operation counts.\n");
    printf("#   CP_SPIT_*: MPI split collective operation counts.\n");
    printf("#   CP_NB_*: MPI non blocking operation counts.\n");
    printf("#   READS,WRITES,OPENS,SEEKS,STATS, and MMAPS are types of operations.\n");
119
    printf("#   CP_*_NC_OPENS: number of indep. and collective pnetcdf opens.\n");
120
    printf("#   CP_HDF5_OPENS: number of hdf5 opens.\n");
121 122 123 124 125 126 127 128 129 130 131
    printf("#   CP_COMBINER_*: combiner counts for MPI mem and file datatypes.\n");
    printf("#   CP_HINTS: number of times MPI hints were used.\n");
    printf("#   CP_VIEWS: number of times MPI file views were used.\n");
    printf("#   CP_MODE: mode that file was opened in.\n");
    printf("#   CP_BYTES_*: total bytes read and written.\n");
    printf("#   CP_MAX_BYTE_*: highest offset byte read and written.\n");
    printf("#   CP_CONSEC_*: number of exactly adjacent reads and writes.\n");
    printf("#   CP_SEQ_*: number of reads and writes from increasing offsets.\n");
    printf("#   CP_RW_SWITCHES: number of times access alternated between read and write.\n");
    printf("#   CP_*_ALIGNMENT: memory and file alignment.\n");
    printf("#   CP_*_NOT_ALIGNED: number of reads and writes that were not aligned.\n");
132
    printf("#   CP_MAX_*_TIME_SIZE: size of the slowest read and write operations.\n");
133 134 135 136 137 138 139 140 141 142 143
    printf("#   CP_SIZE_READ_*: histogram of read access sizes.\n");
    printf("#   CP_SIZE_READ_AGG_*: histogram of MPI datatype total sizes.\n");
    printf("#   CP_EXTENT_READ_*: histogram of MPI datatype extents.\n");
    printf("#   CP_STRIDE*_STRIDE: the four most common strides detected.\n");
    printf("#   CP_STRIDE*_COUNT: count of the four most common strides.\n");
    printf("#   CP_ACCESS*_ACCESS: the four most common access sizes.\n");
    printf("#   CP_ACCESS*_COUNT: count of the four most common access sizes.\n");
    printf("#   CP_F_OPEN_TIMESTAMP: timestamp of first open (mpi or posix).\n");
    printf("#   CP_F_*_START_TIMESTAMP: timestamp of first read/write (mpi or posix).\n");
    printf("#   CP_F_*_END_TIMESTAMP: timestamp of last read/write (mpi or posix).\n");
    printf("#   CP_F_CLOSE_TIMESTAMP: timestamp of last close (mpi or posix).\n");
144 145 146 147
    printf("#   CP_F_POSIX_READ/WRITE_TIME: cumulative time spent in posix reads or writes.\n");
    printf("#   CP_F_MPI_READ/WRITE_TIME: cumulative time spent in mpi-io reads or writes.\n");
    printf("#   CP_F_POSIX_META_TIME: cumulative time spent in posix open, close, fsync, stat and seek, .\n");
    printf("#   CP_F_MPI_META_TIME: cumulative time spent in mpi-io open, close, set_view, and sync.\n");
148
    printf("#   CP_MAX_*_TIME: duration of the slowest read and write operations.\n");
149 150 151 152 153

    printf("\n");

    CP_PRINT_HEADER();

154
    while((ret = darshan_log_getfile(file, &job, &cp_file)) == 1)
155
    {
156 157 158 159 160 161 162 163
        for(i=0; i<CP_NUM_INDICES; i++)
        {
            CP_PRINT(&job, &cp_file, i);
        }
        for(i=0; i<CP_F_NUM_INDICES; i++)
        {
            CP_F_PRINT(&job, &cp_file, i);
        }
164 165
    }

166
    if(ret < 0)
167
    {
168
        fprintf(stderr, "Error: failed to parse log file.\n");
169 170 171
        return(-1);
    }

172
    darshan_log_close(file);
173 174
    return(0);
}