Skip to content

Commit

Permalink
Merge pull request #431 from brauner/2020-09-08/diskstats
Browse files Browse the repository at this point in the history
diskstats: support new fields in 4.18+ kernels
  • Loading branch information
stgraber committed Sep 8, 2020
2 parents 86ade71 + 998cdfc commit 184fcdd
Showing 1 changed file with 83 additions and 36 deletions.
119 changes: 83 additions & 36 deletions src/proc_fuse.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,27 @@ static void get_blkio_io_value(char *str, unsigned major, unsigned minor,
}
}

struct lxcfs_diskstats {
unsigned int major; /* 1 - major number */
unsigned int minor; /* 2 - minor mumber */
char dev_name[72]; /* 3 - device name */
uint64_t read; /* 4 - reads completed successfully */
uint64_t read_merged; /* 5 - reads merged */
uint64_t read_sectors; /* 6 - sectors read */
uint64_t read_ticks; /* 7 - time spent reading (ms) */
uint64_t write; /* 8 - writes completed */
uint64_t write_merged; /* 9 - writes merged */
uint64_t write_sectors; /* 10 - sectors written */
uint64_t write_ticks; /* 11 - time spent writing (ms) */
uint64_t ios_pgr; /* 12 - I/Os currently in progress */
uint64_t total_ticks; /* 13 - time spent doing I/Os (ms) */
uint64_t rq_ticks; /* 14 - weighted time spent doing I/Os (ms) */
uint64_t discard; /* 15 - discards completed successfully (4.18+) */
uint64_t discard_merged; /* 16 - discards merged (4.18+) */
uint64_t discard_sectors; /* 17 - sectors discarded (4.18+) */
uint64_t discard_ticks; /* 18 - time spent discarding (4.18+) */
};

static int proc_diskstats_read(char *buf, size_t size, off_t offset,
struct fuse_file_info *fi)
{
Expand All @@ -459,19 +480,15 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset,
__do_fclose FILE *f = NULL;
struct fuse_context *fc = fuse_get_context();
struct file_info *d = INTTYPE_TO_PTR(fi->fh);
uint64_t read = 0, write = 0;
uint64_t read_merged = 0, write_merged = 0;
uint64_t read_sectors = 0, write_sectors = 0;
uint64_t read_ticks = 0, write_ticks = 0;
uint64_t ios_pgr = 0, tot_ticks = 0, rq_ticks = 0;
uint64_t rd_svctm = 0, wr_svctm = 0, rd_wait = 0, wr_wait = 0;
struct lxcfs_diskstats stats = {};
/* helper fields */
uint64_t read_service_time, write_service_time, discard_service_time, read_wait_time,
write_wait_time, discard_wait_time;
char *cache = d->buf;
size_t cache_size = d->buflen;
size_t linelen = 0, total_len = 0;
unsigned int major = 0, minor = 0;
int i = 0;
int ret;
char dev_name[72];

if (offset) {
int left;
Expand Down Expand Up @@ -536,39 +553,69 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset,
ssize_t l;
char lbuf[256];

i = sscanf(line, "%u %u %71s", &major, &minor, dev_name);
i = sscanf(line, "%u %u %71s", &stats.major, &stats.minor, stats.dev_name);
if (i != 3)
continue;

get_blkio_io_value(io_serviced_str, major, minor, "Read", &read);
get_blkio_io_value(io_serviced_str, major, minor, "Write", &write);
get_blkio_io_value(io_merged_str, major, minor, "Read", &read_merged);
get_blkio_io_value(io_merged_str, major, minor, "Write", &write_merged);
get_blkio_io_value(io_service_bytes_str, major, minor, "Read", &read_sectors);
read_sectors = read_sectors/512;
get_blkio_io_value(io_service_bytes_str, major, minor, "Write", &write_sectors);
write_sectors = write_sectors/512;

get_blkio_io_value(io_service_time_str, major, minor, "Read", &rd_svctm);
rd_svctm = rd_svctm/1000000;
get_blkio_io_value(io_wait_time_str, major, minor, "Read", &rd_wait);
rd_wait = rd_wait/1000000;
read_ticks = rd_svctm + rd_wait;

get_blkio_io_value(io_service_time_str, major, minor, "Write", &wr_svctm);
wr_svctm = wr_svctm/1000000;
get_blkio_io_value(io_wait_time_str, major, minor, "Write", &wr_wait);
wr_wait = wr_wait/1000000;
write_ticks = wr_svctm + wr_wait;

get_blkio_io_value(io_service_time_str, major, minor, "Total", &tot_ticks);
tot_ticks = tot_ticks/1000000;
get_blkio_io_value(io_serviced_str, stats.major, stats.minor, "Read", &stats.read);
get_blkio_io_value(io_serviced_str, stats.major, stats.minor, "Write", &stats.write);
get_blkio_io_value(io_serviced_str, stats.major, stats.minor, "Discard", &stats.discard);

get_blkio_io_value(io_merged_str, stats.major, stats.minor, "Read", &stats.read_merged);
get_blkio_io_value(io_merged_str, stats.major, stats.minor, "Write", &stats.write_merged);
get_blkio_io_value(io_merged_str, stats.major, stats.minor, "Discard", &stats.discard_merged);

get_blkio_io_value(io_service_bytes_str, stats.major, stats.minor, "Read", &stats.read_sectors);
stats.read_sectors = stats.read_sectors / 512;
get_blkio_io_value(io_service_bytes_str, stats.major, stats.minor, "Write", &stats.write_sectors);
stats.write_sectors = stats.write_sectors / 512;
get_blkio_io_value(io_service_bytes_str, stats.major, stats.minor, "Discard", &stats.discard_sectors);
stats.discard_sectors = stats.discard_sectors / 512;

get_blkio_io_value(io_service_time_str, stats.major, stats.minor, "Read", &read_service_time);
read_service_time = read_service_time / 1000000;
get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, "Read", &read_wait_time);
read_wait_time = read_wait_time / 1000000;
stats.read_ticks = read_service_time + read_wait_time;

get_blkio_io_value(io_service_time_str, stats.major, stats.minor, "Write", &write_service_time);
write_service_time = write_service_time / 1000000;
get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, "Write", &write_wait_time);
write_wait_time = write_wait_time / 1000000;
stats.write_ticks = write_service_time + write_wait_time;

get_blkio_io_value(io_service_time_str, stats.major, stats.minor, "Discard", &discard_service_time);
discard_service_time = discard_service_time / 1000000;
get_blkio_io_value(io_wait_time_str, stats.major, stats.minor, "Discard", &discard_wait_time);
discard_wait_time = discard_wait_time / 1000000;
stats.discard_ticks = discard_service_time + discard_wait_time;

get_blkio_io_value(io_service_time_str, stats.major, stats.minor, "Total", &stats.total_ticks);
stats.total_ticks = stats.total_ticks / 1000000;

memset(lbuf, 0, 256);
if (read || write || read_merged || write_merged || read_sectors || write_sectors || read_ticks || write_ticks)
snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
major, minor, dev_name, read, read_merged, read_sectors, read_ticks,
write, write_merged, write_sectors, write_ticks, ios_pgr, tot_ticks, rq_ticks);
if (stats.read || stats.write || stats.read_merged || stats.write_merged ||
stats.read_sectors || stats.write_sectors || stats.read_ticks ||
stats.write_ticks || stats.ios_pgr || stats.total_ticks || stats.rq_ticks ||
stats.discard_merged || stats.discard_sectors || stats.discard_ticks)
snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
stats.major,
stats.minor,
stats.dev_name,
stats.read,
stats.read_merged,
stats.read_sectors,
stats.read_ticks,
stats.write,
stats.write_merged,
stats.write_sectors,
stats.write_ticks,
stats.ios_pgr,
stats.total_ticks,
stats.rq_ticks,
stats.discard_merged,
stats.discard_sectors,
stats.discard_ticks);
else
continue;

Expand Down

0 comments on commit 184fcdd

Please sign in to comment.