resource_track.c revision e0ed7404719a9ddd2ba427a80db5365c8bad18c0
1e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* 2e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * resource_track.c --- resource tracking 3e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 4e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Copyright (C) 2013 by Theodore Ts'o 5e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 6e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %Begin-Header% 7e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * This file may be redistributed under the terms of the GNU Public 8e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * License. 9e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * %End-Header% 10e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 11e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 12e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 13e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include "resize2fs.h" 14e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <time.h> 15e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_MALLOC_H 16e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <malloc.h> 17e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 18e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include <sys/resource.h> 19e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 20e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid init_resource_track(struct resource_track *track, const char *desc, 21e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall io_channel channel) 22e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 23e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_GETRUSAGE 24e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct rusage r; 25e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 26e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall io_stats io_start = 0; 27e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->desc = desc; 29e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->brk_start = sbrk(0); 30e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gettimeofday(&track->time_start, 0); 31e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_GETRUSAGE 32e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef sun 33e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall memset(&r, 0, sizeof(struct rusage)); 34e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 35e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall getrusage(RUSAGE_SELF, &r); 36e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->user_start = r.ru_utime; 37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->system_start = r.ru_stime; 38e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else 39e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->user_start.tv_sec = track->user_start.tv_usec = 0; 40e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->system_start.tv_sec = track->system_start.tv_usec = 0; 41e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 42e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->bytes_read = 0; 43e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->bytes_written = 0; 44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (channel && channel->manager && channel->manager->get_stats) 45e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall channel->manager->get_stats(channel, &io_start); 46e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (io_start) { 47e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->bytes_read = io_start->bytes_read; 48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->bytes_written = io_start->bytes_written; 49e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 51e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 52e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic float timeval_subtract(struct timeval *tv1, 53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct timeval *tv2) 54e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 55e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return ((tv1->tv_sec - tv2->tv_sec) + 56e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000); 57e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 58e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid print_resource_track(ext2_resize_t rfs, struct resource_track *track, 60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall io_channel channel) 61e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_GETRUSAGE 63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct rusage r; 64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 65e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_MALLINFO 66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct mallinfo malloc_info; 67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct timeval time_end; 69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((rfs->flags & RESIZE_DEBUG_RTRACK) == 0) 71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall gettimeofday(&time_end, 0); 74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (track->desc) 76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s: ", track->desc); 77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_MALLINFO 79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define kbytes(x) (((unsigned long)(x) + 1023) / 1024) 80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall malloc_info = mallinfo(); 82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("Memory used: %luk/%luk (%luk/%luk), ", 83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall kbytes(malloc_info.arena), kbytes(malloc_info.hblkhd), 84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall kbytes(malloc_info.uordblks), kbytes(malloc_info.fordblks)); 85e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else 86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("Memory used: %lu, ", 87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (unsigned long) (((char *) sbrk(0)) - 88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((char *) track->brk_start))); 89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_GETRUSAGE 91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall getrusage(RUSAGE_SELF, &r); 92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 93e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("time: %5.2f/%5.2f/%5.2f\n", 94e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall timeval_subtract(&time_end, &track->time_start), 95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall timeval_subtract(&r.ru_utime, &track->user_start), 96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall timeval_subtract(&r.ru_stime, &track->system_start)); 97e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else 98e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("elapsed time: %6.3f\n", 99e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall timeval_subtract(&time_end, &track->time_start)); 100e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 101e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define mbytes(x) (((x) + 1048575) / 1048576) 102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (channel && channel->manager && channel->manager->get_stats) { 103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall io_stats delta = 0; 104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned long long bytes_read = 0; 105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned long long bytes_written = 0; 106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall channel->manager->get_stats(channel, &delta); 108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (delta) { 109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bytes_read = delta->bytes_read - track->bytes_read; 110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bytes_written = delta->bytes_written - 111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall track->bytes_written; 112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (bytes_read == 0 && bytes_written == 0) 113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto skip_io; 114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (track->desc) 115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s: ", track->desc); 116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("I/O read: %lluMB, write: %lluMB, " 117e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "rate: %.2fMB/s\n", 118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mbytes(bytes_read), 119e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mbytes(bytes_written), 120e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (double)mbytes(bytes_read + bytes_written) / 121e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall timeval_subtract(&time_end, &track->time_start)); 122e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 123e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 124e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallskip_io: 125e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fflush(stdout); 126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 127e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 128