#include #include #include #include #include #include #include #include #include #include #define PATH_MAX 4096 int main(int argc, char *argv[]) { unsigned int iter; unsigned long o_read_ms, o_write_ms, o_time_ms; char path[PATH_MAX]; int fd; if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(0); } if (!snprintf(path, PATH_MAX, "/sys/block/%s/stat", argv[1])) fprintf(stderr, "Could not build path\n"), exit(1); iter = 0; for (;;) { unsigned long d_read_ms, d_write_ms, d_time_ms; unsigned long read_ms, write_ms, time_ms; struct timeval tv; int ret; char *token; char mem[1024]; fd = open(path, O_RDONLY); if (fd == -1) perror("open"), exit(1); if (gettimeofday(&tv, NULL) == -1) perror("gettimeofday"), exit(1); time_ms = tv.tv_sec * 1000 + tv.tv_usec / 1000; d_time_ms = time_ms - o_time_ms; do { ret = read(fd, mem, 1024); } while (ret == -1 && errno == EINTR); if (ret == -1) perror("read"), exit(1); if (close(fd) == -1) perror("close"), exit(1); strtok(mem, " "); strtok(NULL, " "); strtok(NULL, " "); token = strtok(NULL, " "); if (!token) fprintf(stderr, "strtok failed\n"), exit(1); errno = 0; read_ms = strtoul(token, NULL, 10); if (errno == ERANGE) fprintf(stderr, "strtoul failed\n"), exit(1); strtok(NULL, " "); strtok(NULL, " "); strtok(NULL, " "); token = strtok(NULL, " "); if (!token) fprintf(stderr, "strtok failed\n"), exit(1); errno = 0; write_ms = strtoul(token, NULL, 10); if (errno == ERANGE) fprintf(stderr, "strtoul failed\n"), exit(1); d_read_ms = read_ms - o_read_ms; d_write_ms = write_ms - o_write_ms; if (d_read_ms + d_write_ms > d_time_ms) d_time_ms = d_read_ms + d_write_ms; if (iter % 20 == 0) printf("bdev\t bi %%\t bo %%\t io %%\t id %%\n"); if (iter && d_time_ms) { printf("%s\t%6.1f\t%6.1f\t%6.1f\t%6.1f\n", argv[1], 100.0f * d_read_ms / d_time_ms, 100.0f * d_write_ms / d_time_ms, 100.0f * (d_read_ms + d_write_ms) / d_time_ms, 100.0f - 100.0f * (d_read_ms | d_write_ms) / d_time_ms); } o_read_ms = read_ms; o_write_ms = write_ms; o_time_ms = time_ms; sleep(1); iter++; } return 0; }