darshan-analyzer.c 5.2 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
21
22

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

char * base = NULL;

23
int total_shared = 0;
24
25
26
27
28
29
30
31
32
33
34
35
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;
int fail    = 0;

36
int process_log(const char *fname, double *io_ratio, int *used_mpio, int *used_pnet, int *used_hdf5, int *used_shared)
37
{
38
    darshan_fd zfile;
39
40
41
42
43
44
45
46
    struct darshan_header header;
    struct darshan_job job;
    struct darshan_mod_logutil_funcs *psx_mod = mod_logutils[DARSHAN_POSIX_MOD];
    struct darshan_mod_logutil_funcs *mpiio_mod = mod_logutils[DARSHAN_MPIIO_MOD];
    struct darshan_mod_logutil_funcs *hdf5_mod = mod_logutils[DARSHAN_HDF5_MOD];
    struct darshan_mod_logutil_funcs *pnetcdf_mod = mod_logutils[DARSHAN_PNETCDF_MOD];
    struct darshan_posix_file *psx_rec;
    darshan_record_id rec_id;
47
48
49
50
51
    int ret;
    int f_count;
    double total_io_time;
    double total_job_time;

52
53
54
55
56
    assert(psx_mod);
    assert(mpiio_mod);
    assert(hdf5_mod);
    assert(pnetcdf_mod);

57
    zfile = darshan_log_open(fname, "r");
58
59
    if (zfile == NULL)
    {
60
        fprintf(stderr, "darshan_log_open() failed to open %s.\n", fname);
61
62
63
        return -1;
    }

64
65
#if 0
    ret = darshan_log_getheader(zfile, &header);
66
    if (ret < 0)
67
    {
68
        fprintf(stderr, "darshan_log_getheader() failed on file %s.\n", fname);
69
        darshan_log_close(zfile);
70
71
72
        return -1;
    }

73
    ret = darshan_log_getjob(zfile, &job);
74
    if (ret < 0)
75
    {
76
        fprintf(stderr, "darshan_log_getjob() failed on file %s.\n", fname);
77
        darshan_log_close(zfile);
78
79
80
81
82
83
        return -1;
    }

    f_count = 0;
    total_io_time = 0.0;

84
    while ((ret = psx_mod->log_get_record(zfile, (void **)&psx_rec, &rec_id)) == 1)
85
    {
86
        void *tmp_rec;
87
88
        f_count   += 1;

89
90
91
92
93
        if (psx_rec->rank == -1)
            *used_shared = 1;


        while((ret = mpiio_mod->log_get_record(
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

        *used_mpio += cp_file.counters[CP_INDEP_OPENS];
        *used_mpio += cp_file.counters[CP_COLL_OPENS];
        *used_pnet += cp_file.counters[CP_INDEP_NC_OPENS];
        *used_pnet += cp_file.counters[CP_COLL_NC_OPENS];
        *used_hdf5 += cp_file.counters[CP_HDF5_OPENS];

        total_io_time += cp_file.fcounters[CP_F_POSIX_READ_TIME];
        total_io_time += cp_file.fcounters[CP_F_POSIX_WRITE_TIME];
        total_io_time += cp_file.fcounters[CP_F_POSIX_META_TIME];
    }

    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;
    }
120
#endif
121

122
    darshan_log_close(zfile);
123
124
125
126
127
128
129
130
131
132

    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;
133
    int used_shared = 0;
134
135
136

    if (typeflag != FTW_F) return 0;

137
    process_log(fpath,&io_ratio,&used_mpio,&used_pnet,&used_hdf5,&used_shared);
138

139
    /* XXX */
140
141
142
143
144
    total_count++;

    if (used_mpio > 0) total_mpio++;
    if (used_pnet > 0) total_pnet++;
    if (used_hdf5 > 0) total_hdf5++;
145
    if (used_shared > 0) total_shared++;
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167

    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++;
    else
    {
        printf("iorat: %lf\n", io_ratio);
        fail++;
    }

    return 0;
}

int main(int argc, char **argv)
{
168
169
170
171
    int ret = 0;

    if(argc != 2)
    {
172
        fprintf(stderr, "Error: directory of Darshan logs required as argument.\n");
173
174
175
        return(-1);
    }

176
177
    base = argv[1];

178
179
180
181
182
183
    ret = ftw(base, tree_walk, 512);
    if(ret != 0)
    {
        fprintf(stderr, "Error: failed to walk path: %s\n", base);
        return(-1);
    }
184

185
186
187
188
189
190
191
    /* XXX */
    printf ("log dir: %s\n", base);
    printf ("  total: %d\n", total_count);
    printf (" single: %lf [%d]\n", (double)total_shared/(double)total_count, total_shared);
    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);
192
193
194
195
196
197
198
    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;
}
199
200
201
202
203
204
205
206
207

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