darshan-analyzer.c 5.48 KB
Newer Older
1 2 3 4 5 6
/*
 * Copyright (C) 2015 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

7 8 9
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
10
#include <assert.h>
11 12 13
#include <ftw.h>
#include <zlib.h>

14
#include "darshan-logutils.h"
15 16 17 18 19 20

#define BUCKET1 0.20
#define BUCKET2 0.40
#define BUCKET3 0.60
#define BUCKET4 0.80

21
int total_shared = 0;
22
int total_fpp    = 0;
23 24 25 26 27 28 29 30 31 32 33
int total_mpio   = 0;
int total_pnet   = 0;
int total_hdf5   = 0;
int total_count  = 0;

int bucket1 = 0;
int bucket2 = 0;
int bucket3 = 0;
int bucket4 = 0;
int bucket5 = 0;

34
int process_log(const char *fname, double *io_ratio, int *used_mpio, int *used_pnet, int *used_hdf5, int *used_shared, int *used_fpp)
35
{
36 37
    int ret;
    darshan_fd file;
38 39 40
    struct darshan_header header;
    struct darshan_job job;
    struct darshan_mod_logutil_funcs *psx_mod = mod_logutils[DARSHAN_POSIX_MOD];
41 42
    struct darshan_posix_file *psx_buf, *psx_buf_p;
    int psx_buf_sz, psx_buf_bytes_left;
43 44
    struct darshan_posix_file *psx_rec;
    darshan_record_id rec_id;
45 46 47 48
    int f_count;
    double total_io_time;
    double total_job_time;

49 50
    assert(psx_mod);

51 52
    file = darshan_log_open(fname);
    if (file == NULL)
53
    {
54
        fprintf(stderr, "darshan_log_open() failed to open %s.\n", fname);
55 56 57
        return -1;
    }

58
    ret = darshan_log_getheader(file, &header);
59
    if (ret < 0)
60
    {
61
        fprintf(stderr, "darshan_log_getheader() failed on file %s.\n", fname);
62
        darshan_log_close(file);
63 64 65
        return -1;
    }

66
    ret = darshan_log_getjob(file, &job);
67
    if (ret < 0)
68
    {
69
        fprintf(stderr, "darshan_log_getjob() failed on file %s.\n", fname);
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
        darshan_log_close(file);
        return -1;
    }

    psx_buf_sz = DARSHAN_DEF_COMP_BUF_SZ;
    psx_buf = malloc(psx_buf_sz);
    if (!psx_buf)
    {
        darshan_log_close(file);
        return -1;
    }

    ret = darshan_log_getmod(file, DARSHAN_POSIX_MOD, (void *)psx_buf, &psx_buf_sz);
    if (ret < 0)
    {
        fprintf(stderr, "darshan_log_getmod() failed on file %s.\n", fname);
        darshan_log_close(file);
87 88 89 90 91 92
        return -1;
    }

    f_count = 0;
    total_io_time = 0.0;

93 94 95
    psx_buf_bytes_left = psx_buf_sz;
    psx_buf_p = psx_buf;
    while(psx_buf_bytes_left)
96
    {
97 98 99
        ret = psx_mod->log_get_record((void **)&psx_buf_p, &psx_buf_bytes_left,
            (void **)&psx_rec, &rec_id, file->swap_flag);

100 101
        f_count   += 1;

102 103
        if (psx_rec->rank == -1)
            *used_shared = 1;
104 105
        else
            *used_fpp = 1;
106

107 108 109
        total_io_time += (psx_rec->fcounters[POSIX_F_READ_TIME] +
                         psx_rec->fcounters[POSIX_F_WRITE_TIME] +
                         psx_rec->fcounters[POSIX_F_META_TIME]);
110 111
    }

112 113 114 115 116 117 118
    if (header.mod_map[DARSHAN_MPIIO_MOD].len > 0)
        *used_mpio += 1;
    if (header.mod_map[DARSHAN_HDF5_MOD].len > 0)
        *used_hdf5 += 1;
    if (header.mod_map[DARSHAN_PNETCDF_MOD].len > 0)
        *used_pnet += 1;

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    total_job_time = (double)job.end_time - (double)job.start_time;
    if (total_job_time < 1.0)
    {
        total_job_time = 1.0;
    }

    if (f_count > 0)
    {
        *io_ratio = total_io_time/total_job_time;
    }
    else
    {
        *io_ratio = 0.0;
    }

134 135
    free(psx_buf);
    darshan_log_close(file);
136 137 138 139 140 141 142 143 144 145

    return 0;
}

int tree_walk (const char *fpath, const struct stat *sb, int typeflag)
{
    double io_ratio = 0.0;
    int used_mpio = 0;
    int used_pnet = 0;
    int used_hdf5 = 0;
146
    int used_shared = 0;
147
    int used_fpp = 0;
148 149 150

    if (typeflag != FTW_F) return 0;

151
    process_log(fpath,&io_ratio,&used_mpio,&used_pnet,&used_hdf5,&used_shared,&used_fpp);
152 153 154 155 156 157

    total_count++;

    if (used_mpio > 0) total_mpio++;
    if (used_pnet > 0) total_pnet++;
    if (used_hdf5 > 0) total_hdf5++;
158
    if (used_shared > 0) total_shared++;
159
    if (used_fpp > 0) total_fpp++;
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176

    if (io_ratio <= BUCKET1)
        bucket1++;
    else if ((io_ratio > BUCKET1) && (io_ratio <= BUCKET2))
        bucket2++;
    else if ((io_ratio > BUCKET2) && (io_ratio <= BUCKET3))
        bucket3++;
    else if ((io_ratio > BUCKET3) && (io_ratio <= BUCKET4))
        bucket4++;
    else if (io_ratio > BUCKET4)
        bucket5++;

    return 0;
}

int main(int argc, char **argv)
{
177
    char * base = NULL;
178 179 180 181
    int ret = 0;

    if(argc != 2)
    {
182
        fprintf(stderr, "Error: directory of Darshan logs required as argument.\n");
183 184 185
        return(-1);
    }

186 187
    base = argv[1];

188 189 190 191 192 193
    ret = ftw(base, tree_walk, 512);
    if(ret != 0)
    {
        fprintf(stderr, "Error: failed to walk path: %s\n", base);
        return(-1);
    }
194

195 196
    printf ("log dir: %s\n", base);
    printf ("  total: %d\n", total_count);
197 198
    printf (" shared: %lf [%d]\n", (double)total_shared/(double)total_count, total_shared);
    printf ("    fpp: %lf [%d]\n", (double)total_fpp/(double)total_count, total_fpp);
199 200 201
    printf ("   mpio: %lf [%d]\n", (double)total_mpio/(double)total_count, total_mpio);
    printf ("   pnet: %lf [%d]\n", (double)total_pnet/(double)total_count, total_pnet);
    printf ("   hdf5: %lf [%d]\n", (double)total_hdf5/(double)total_count, total_hdf5);
202 203 204 205 206 207 208
    printf ("%.2lf-%.2lf: %d\n", (double)0.0,     (double)BUCKET1, bucket1);
    printf ("%.2lf-%.2lf: %d\n", (double)BUCKET1, (double)BUCKET2, bucket2);
    printf ("%.2lf-%.2lf: %d\n", (double)BUCKET2, (double)BUCKET3, bucket3);
    printf ("%.2lf-%.2lf: %d\n", (double)BUCKET3, (double)BUCKET4, bucket4);
    printf ("%.2lf-%.2lf: %d\n", (double)BUCKET4, (double)100.0,   bucket5);
    return 0;
}
209 210 211 212 213 214 215 216 217

/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 * End:
 *
 * vim: ts=8 sts=4 sw=4 expandtab
 */