SIONlib  1.6.2
Scalable I/O library for parallel access to task-local files
siondump.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <ctype.h>
14 
15 #include "sion.h"
16 #include "sion_internal.h"
17 #include "sion_fd.h"
18 #include "sion_filedesc.h"
19 
20 #define FILENAME_LENGTH 1024
21 
22 static void usage(char *name);
23 
24 int main(int argc, char **argv)
25 {
26  FILE *fp;
27  char infilename[FILENAME_LENGTH], fname[FILENAME_LENGTH];
28  int i, rank, blknum;
29 
30  /* options */
31  int printall = 0;
32  int printmap = 0;
33  int verbose = 0;
34  int longspec = 0;
35  int printisize = 0;
36  int printkeysstat = 0;
37  int printkeyslist = 0;
38 
39  /* for file infomation */
40  int sid, size, blocks, gblknum, ntasks;
41  sion_int32 fsblksize;
42  sion_int64 globalskip;
43  sion_int64 start_of_varheader;
44  sion_int64 *sion_chunksizes;
45  sion_int64 *sion_globalranks;
46  sion_int64 *sion_blockcount;
47  sion_int64 *sion_blocksizes;
48  sion_int64 *sion_currentpos;
49  sion_int64 *sion_currentblocknr;
50  sion_int64 *siondump_sum_bytes_per_task;
51  sion_int64 siondump_sum_bytes;
52  sion_int64 siondump_sum_chunksizes;
53  sion_int64 siondump_sum_all_fsblocks;
54  sion_int64 siondump_sum_full_fsblocks;
55  sion_int64 siondump_sum_part_fsblocks;
56  sion_int64 siondump_sum_bytes_in_part_fsblocks,blksize;
57  sion_int64 numfullchunks,numemptychunks,numpartlychunks;
58  sion_int64 fullchunkssize,emptychunkssize,partlychunkssize;
59  _sion_filedesc *sion_filedesc;
60  int mapping_size, nfiles;
61  sion_int32 *mapping;
62 
63  /* parse command line */
64  i = 1;
65  if (argc < 2)
66  usage(argv[0]);
67 
68  while (i < argc) {
69  if (argv[i][0] == '-') {
70  switch (argv[i][1]) {
71  case 'a':
72  printall = 1;
73  break;
74  case 'm':
75  printmap = 1;
76  break;
77  case 'v':
78  verbose++;
79  break;
80  case 'l':
81  longspec++;
82  break;
83  case 'k':
84  printkeysstat++;
85  break;
86  case 'K':
87  printkeyslist++;
88  break;
89  case 'S':
90  printisize++;
91  break;
92  case 'h':
93  usage(argv[0]);
94  break;
95  case 'V':
96  fprintf(stderr, "SIONlib utility %s (Version %d.%dp%d, fileformat version %d)\n", argv[0],
97  SION_MAIN_VERSION,SION_SUB_VERSION,
98  SION_VERSION_PATCHLEVEL,SION_FILEFORMAT_VERSION);
99  exit(1);
100  break;
101  default:
102  usage(argv[0]);
103  }
104  }
105  i++;
106  }
107 
108  strcpy(infilename, argv[argc - 1]);
109 
110  sid = sion_open(infilename, "rb,posix", &ntasks, &nfiles, NULL, &fsblksize, NULL, &fp);
111 
112  if (sid<0) {
113  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"could not open file, aborting %d ...\n", sid));
114  }
115 
116  /* get the sion file structure */
117  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
118  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
119  }
120 
121  printf("siondump: sid: %d\n", sid);
122  /* printf("siondump: filename: %-30s\n",infilename); */
123  printf("siondump: filename: %-30s\n", sion_filedesc->fname);
124  printf("siondump: prefix: %-30s\n", sion_filedesc->prefix);
125  printf("siondump: number of tasks: %d\n", ntasks);
126  printf("siondump: current endianness: %s\n", (sion_get_endianness())? "big" : "little");
127  printf("siondump: file endianness: %s\n", (sion_get_file_endianness(sid)) ? "big" : "little");
128  printf("siondump: filesystem blocksize: %lu bytes (%6.2f MB)\n", (unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
129  printf("siondump: file set: %s\n", (nfiles > 1) ? "Yes" : "No");
130  printf("siondump: file number: %d\n", sion_filedesc->filenumber);
131  printf("siondump: number of files: %d\n", sion_filedesc->nfiles);
132  printf("siondump: flag1: %lld (%d+%d)\n", sion_filedesc->flag1,
133  (int) ((sion_int64) sion_filedesc->flag1>>32),
134  (int) ((sion_int64) sion_filedesc->flag1 & ~((sion_int64) 1<<32) ) );
135  printf("siondump: flag2: %lld\n", sion_filedesc->flag2);
136  printf("siondump: keyval: %d (%s)\n", (int) sion_filedesc->keyvalmode, sion_keyval_type_to_str(sion_filedesc->keyvalmode));
137  printf("siondump: file format version: %d\n", sion_filedesc->fileversion);
138  printf("siondump: file SIONlib version: %d.%dp%d (current %d.%dp%d)\n",
139  (int) sion_filedesc->filesionversion/1000,sion_filedesc->filesionversion%1000,sion_filedesc->filesionpatchlevel,
140  SION_MAIN_VERSION,SION_SUB_VERSION,SION_VERSION_PATCHLEVEL);
141 
142  sion_get_locations(sid, &size, &blocks, &globalskip, &start_of_varheader, &sion_chunksizes, &sion_globalranks,
143  &sion_blockcount, &sion_blocksizes);
144  /* ToDo: data has to be extracted from multifiles */
145  /* printf("siondump: end_of_header: %10lld bytes (%6.2f MB)\n", sion_filedesc->end_of_header, sion_filedesc->end_of_header / 1024.0 / 1024.0); */
146  /* printf("siondump: start_of_data: %10lld bytes (%6.2f MB)\n", sion_filedesc->start_of_data, sion_filedesc->start_of_data / 1024.0 / 1024.0); */
147  /* printf("siondump: start_of_varheader: %10lld bytes (%6.2f MB)\n", start_of_varheader, start_of_varheader / 1024.0 / 1024.0); */
148  printf("siondump: number of blocks: %d\n", blocks);
149  if(printisize) {
150  int num_bytes, num_fds;
151  sion_get_sizeof(sid,&num_bytes, &num_fds);
152  printf("siondump: sizeof internal struct: %d bytes %d file descriptors\n", num_bytes, num_fds);
153  }
154 
155  /* analysis */
156  siondump_sum_full_fsblocks = 0;
157  siondump_sum_part_fsblocks = 0;
158  siondump_sum_bytes_in_part_fsblocks = 0;
159 
160  numfullchunks=numemptychunks=numpartlychunks=0;
161  fullchunkssize=emptychunkssize=partlychunkssize=0;
162 
163  siondump_sum_bytes_per_task = (sion_int64 *) malloc(ntasks * sizeof(sion_int64));
164  for (rank = 0; rank < size; rank++) siondump_sum_bytes_per_task[rank] = 0;
165 
166  for (rank = 0; rank < size; rank++) {
167  for (blknum = 0; blknum < sion_blockcount[rank]; blknum++) {
168  blksize=sion_blocksizes[size * blknum + rank];
169  siondump_sum_bytes_per_task[rank] += blksize;
170 
171  if(blksize==sion_chunksizes[rank]) {
172  numfullchunks++;fullchunkssize+=blksize;
173  } else {
174  if(blksize>0) {
175  numpartlychunks++;partlychunkssize+=blksize;
176  } else {
177  numemptychunks++;emptychunkssize+=sion_chunksizes[rank];
178  }
179  }
180 
181  siondump_sum_full_fsblocks += (int) ( (sion_int64) blksize / (sion_int64) fsblksize );
182  if(blksize - fsblksize * ((sion_int64) (blksize/fsblksize)) > 0) {
183  siondump_sum_bytes_in_part_fsblocks += blksize - fsblksize * ((int) (blksize/fsblksize));
184  siondump_sum_part_fsblocks++;
185  }
186  }
187 
188  numemptychunks+=(blocks-sion_blockcount[rank]);
189  emptychunkssize+=(blocks-sion_blockcount[rank])*sion_chunksizes[rank];
190  }
191  siondump_sum_all_fsblocks = siondump_sum_full_fsblocks + siondump_sum_part_fsblocks;
192 
193  siondump_sum_chunksizes = 0;
194  siondump_sum_bytes = 0;
195  for (rank = 0; rank < size; rank++) {
196  siondump_sum_bytes += siondump_sum_bytes_per_task[rank];
197  siondump_sum_chunksizes+= sion_chunksizes[rank]*sion_blockcount[rank];
198  }
199 
200  printf("siondump: size of chunks: %12lld bytes (%8.2f MB)\n",
201  siondump_sum_chunksizes,
202  siondump_sum_chunksizes / 1024.0 / 1024.0);
203 
204  printf("siondump: datasize in file (aggr.): %12lld bytes (%8.2f MB)\n",
205  siondump_sum_bytes,
206  siondump_sum_bytes / 1024.0 / 1024.0);
207 
208  printf("siondump: size of full chunks: %12lld bytes (%8.2f MB) # %6lld\n",
209  fullchunkssize,
210  fullchunkssize / 1024.0 / 1024.0, numfullchunks);
211 
212  printf("siondump: size of partly filled chunks: %12lld bytes (%8.2f MB) # %6lld\n",
213  partlychunkssize,
214  partlychunkssize / 1024.0 / 1024.0, numpartlychunks);
215 
216  printf("siondump: size of empty chunks: %12lld bytes (%8.2f MB) # %6lld\n",
217  emptychunkssize,
218  emptychunkssize / 1024.0 / 1024.0,numemptychunks);
219 
220  printf("siondump: overhead compared to task-local file: %12lld bytes (%8.2f MB)\n",
221  siondump_sum_chunksizes-siondump_sum_bytes,
222  (siondump_sum_chunksizes-siondump_sum_bytes) / 1024.0 / 1024.0);
223 
224  if (siondump_sum_chunksizes > 0) {
225  printf("siondump: file usage (user data/chunk size): %14.6f%%\n",
226  (double) siondump_sum_bytes / (double) siondump_sum_chunksizes * 100.0);
227  }
228 
229 
230  printf("siondump: fsblocks, size of used blocks: %12lld bytes (%8.2f MB, %ld blocks)\n",
231  siondump_sum_all_fsblocks * (sion_int64) fsblksize,
232  siondump_sum_all_fsblocks * (sion_int64) fsblksize / 1024.0 / 1024.0,(long) siondump_sum_all_fsblocks);
233 
234  printf("siondump: fsblocks, size of fully used locks: %12lld bytes (%8.2f MB, %ld blocks)\n",
235  siondump_sum_full_fsblocks*fsblksize,
236  siondump_sum_full_fsblocks*fsblksize / 1024.0 / 1024.0,
237  (long) siondump_sum_full_fsblocks);
238 
239  printf("siondump: fsblocks, size of partly used blocks: %12lld bytes of %12lld bytes (%6.2f MB of %6.2f MB, %ld blocks)\n",
240  siondump_sum_bytes_in_part_fsblocks,
241  siondump_sum_part_fsblocks*fsblksize,
242  siondump_sum_bytes_in_part_fsblocks / 1024.0 / 1024.0,
243  siondump_sum_part_fsblocks*fsblksize / 1024.0 / 1024.0,
244  (long) siondump_sum_part_fsblocks);
245 
246  if (siondump_sum_chunksizes > 0) {
247  printf("siondump: fsblocks, used fsblocks/chunk size: %14.6f%%\n",
248  (double) siondump_sum_all_fsblocks*fsblksize / (double) siondump_sum_chunksizes * 100.0);
249  }
250 
251  if ((siondump_sum_all_fsblocks*fsblksize) > 0) {
252  printf("siondump: fsblocks, user data/used blocks: %14.6f%%\n",
253  (double) siondump_sum_bytes / (double) (siondump_sum_all_fsblocks*fsblksize) * 100.0);
254  }
255 
256  /* detailed print of block sizes */
257  if (printall) {
258 
259  printf("\n");
260  printf
261  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
262  for (gblknum = 0; gblknum < blocks; gblknum += 10) {
263  printf("%70s", " ");
264  for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
265  printf("BLK%03d ", blknum);
266  }
267  printf("\n");
268  for (rank = 0; rank < size; rank++) {
269  if(!longspec) {
270  printf("Task %02d: size=%8.2f MB glblrnk=%4lld #blks=%2lld lsz=%8.2f MB: ", rank, siondump_sum_bytes_per_task[rank] / 1024.0 / 1024.0,
271  sion_globalranks[rank], sion_blockcount[rank], sion_chunksizes[rank] / 1024.0 / 1024.0);
272  for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
273  printf(" %6.2f MB ", (long) sion_blocksizes[size * blknum + rank] / 1024.0 / 1024.0);
274  }
275  } else {
276  printf("Task %02d: size=%10ld B glblrnk=%4lld #blks=%2lld lsz=%10ld B: ", rank, (long) siondump_sum_bytes_per_task[rank],
277  sion_globalranks[rank], sion_blockcount[rank], (long) sion_chunksizes[rank]);
278  for (blknum = gblknum + 0; ((blknum < gblknum + 10) && (blknum < blocks)); blknum++) {
279  printf("%9ld ", (long) sion_blocksizes[size * blknum + rank]);
280  }
281  }
282  printf("\n");
283  }
284  printf("\n");
285  }
286  printf
287  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
288  }
289 
290  /* detailed list of keys */
291  if (printkeysstat) {
292 
293  uint64_t key;
294  sion_key_stat_t keystat;
295  int i;
296 
297  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
298 
299  printf
300  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
301  for (rank = 0; rank < size; rank++) {
303 
304  sion_key_full_scan(sid);
306  i=0;
307  while(sion_key_list_iterator_next(sid,&key)==SION_SUCCESS) {
308  sion_key_get_stat(sid,key,&keystat);
309  printf("Task %02d: key[%02d]=%8ld: #blocks=%6d totalsize=%10ld\n",rank, i++, (long) key, (int) keystat.num_blocks, (long) keystat.total_size);
310  }
311  }
312  } else {
313  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
314  }
315  printf
316  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
317  }
318 
319  /* detailed list of keys */
320  if (printkeyslist) {
321 
322  uint64_t key;
323  size_t value_size;
324  int i;
325 
326  if((sion_filedesc->keyvalmode!=SION_KEYVAL_NONE) || (sion_filedesc->keyvalmode!=SION_KEYVAL_NONE)) {
327 
328  printf
329  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
330  for (rank = 0; rank < size; rank++) {
333  i=0;
334  printf("Task %02d:",rank);
335  while(sion_fread_key_iterator_next(sid,&key,&value_size)==SION_SUCCESS) {
336  if (((i%5)==0) && (i>0)) printf("\n :");
337  printf(" [%02d:k=<%ld>,size=%ld]",i++, (long) key, (long) value_size);
338  }
339  printf("\n");
340  }
341  } else {
342  fprintf(stderr, "on rank %d: error sid = %d\n",rank,sid);
343  }
344  printf
345  ("-----------------------------------------------------------------------------------------------------------------------------------------------------------\n");
346  }
347 
348 
349  if (sion_filedesc->nfiles > 1) {
350  printf("------------------------------------------------------------\n");
351  printf("siondump: number of files: %d\n", sion_filedesc->nfiles);
352  for (i = 0; i < sion_filedesc->nfiles; ++i) {
353  if(i>0) sprintf(fname, "%s.%06d", sion_filedesc->prefix, i);
354  else sprintf(fname, "%s", sion_filedesc->prefix);
355  printf("siondump: file %3d: %s \n", i + 1, fname);
356  }
357  printf("------------------------------------------------------------\n");
358 
359  if(printmap) {
360  sion_get_mapping(sid,&mapping_size,&mapping,&nfiles);
361  printf(" mapping: ");
362  for (i = 0; i < mapping_size; ++i) {
363  printf("[%05d -> (f%03d,t%03d)] ", i, mapping[i*2+0],mapping[i*2+1]);
364  if(i%16==15) printf("\n ");
365  }
366  printf("\n");
367  printf("------------------------------------------------------------\n");
368  }
369  }
370 
371  sion_get_current_locations(sid, &size, &sion_currentpos, &sion_currentblocknr);
372 
373  sion_close(sid);
374 
375  return (0);
376 }
377 
378 void usage(char *name)
379 {
380  fprintf(stderr, "Usage: %s options <sionfn>\n\n", name);
381 
382  fprintf(stderr, "Dump meta data information of SIONlib file <sionfn>.\n\n");
383 
384  fprintf(stderr, "Options:\n");
385  fprintf(stderr, " [-a] print all information about all blocks\n");
386  fprintf(stderr, " [-m] print all mapping information\n");
387  fprintf(stderr, " [-l] print all sizes in number of bytes\n");
388  fprintf(stderr, " [-k] print key-value statistic for each task\n");
389  fprintf(stderr, " [-K] print key-value list for each task\n");
390  fprintf(stderr, " [-S] print size of internal data structure in memory\n");
391  fprintf(stderr, " [-V] show version number of SIONlib\n");
392  fprintf(stderr, " [-v] verbose mode\n");
393  fprintf(stderr, " [-h] show this help\n");
394  exit(1);
395 }
int sion_key_list_iterator_next(int sid, uint64_t *keyptr)
Forward to next key.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:29
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:247
int sion_fread_key_iterator_next(int sid, uint64_t *key, size_t *size)
Forward to next key.
sion_int32 filesionpatchlevel
int sion_close(int sid)
Close a sion file.
Definition: sion_serial.c:113
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
int sion_get_current_locations(int sid, int *ntasks, sion_int64 **sion_currentpos, sion_int64 **sion_currentblocknr)
Returns current position in file and pointer fiels containing chunk sizes.
Definition: sion_common.c:301
int sion_get_locations(int sid, int *ntasks, int *maxchunks, sion_int64 *globalskip, sion_int64 *start_of_varheader, sion_int64 **sion_chunksizes, sion_int64 **sion_globalranks, sion_int64 **sion_blockcount, sion_int64 **sion_blocksizes)
Returns pointers to internal fields.
Definition: sion_common.c:81
#define SION_KEYVAL_NONE
Definition: sion_const.h:80
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
Definition: sion_common.c:213
char * sion_keyval_type_to_str(int type)
Returns key value mode as string.
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
Definition: sion_common.c:621
#define SION_CURRENT_POS
Definition: sion_const.h:70
int sion_fread_key_iterator_reset(int sid)
Resets key iterator.
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1044
int sion_key_list_iterator_reset(int sid)
Resets key iterator.
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
int sion_key_full_scan(int sid)
Performs a full scan of all meta data in current file.
sion_int32 filesionversion
int sion_open(char *fname, const char *file_mode, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
Open a sion file in serial mode.
Definition: sion_serial.c:61
int sion_key_get_stat(int sid, uint64_t key, sion_key_stat_t *stat)
get statistics about key
#define SION_CURRENT_CHUNK
Definition: sion_const.h:68