lproc_obdfilter.c
来自「lustre 1.6.5 source code」· C语言 代码 · 共 459 行 · 第 1/2 页
C
459 行
void filter_tally(struct obd_export *exp, struct page **pages, int nr_pages, unsigned long *blocks, int blocks_per_page, int wr){ struct filter_obd *filter = &exp->exp_obd->u.filter; struct filter_export_data *fed = &exp->exp_filter_data; struct page *last_page = NULL; unsigned long *last_block = NULL; unsigned long discont_pages = 0; unsigned long discont_blocks = 0; int i; if (nr_pages == 0) return; lprocfs_oh_tally_log2(&filter->fo_filter_stats.hist[BRW_R_PAGES + wr], nr_pages); lprocfs_oh_tally_log2(&fed->fed_brw_stats.hist[BRW_R_PAGES + wr], nr_pages); if (exp->exp_nid_stats && exp->exp_nid_stats->nid_brw_stats) lprocfs_oh_tally_log2(&exp->exp_nid_stats->nid_brw_stats->hist[BRW_W_PAGES + wr], nr_pages); while (nr_pages-- > 0) { if (last_page && (*pages)->index != (last_page->index + 1)) discont_pages++; last_page = *pages; pages++; for (i = 0; i < blocks_per_page; i++) { if (last_block && *blocks != (*last_block + 1)) discont_blocks++; last_block = blocks++; } } lprocfs_oh_tally(&filter->fo_filter_stats.hist[BRW_R_DISCONT_PAGES +wr], discont_pages); lprocfs_oh_tally(&fed->fed_brw_stats.hist[BRW_R_DISCONT_PAGES + wr], discont_pages); lprocfs_oh_tally(&filter->fo_filter_stats.hist[BRW_R_DISCONT_BLOCKS+wr], discont_blocks); lprocfs_oh_tally(&fed->fed_brw_stats.hist[BRW_R_DISCONT_BLOCKS + wr], discont_blocks); if (exp->exp_nid_stats && exp->exp_nid_stats->nid_brw_stats) { lprocfs_oh_tally_log2(&exp->exp_nid_stats->nid_brw_stats->hist[BRW_W_DISCONT_PAGES + wr], discont_pages); lprocfs_oh_tally_log2(&exp->exp_nid_stats->nid_brw_stats->hist[BRW_W_DISCONT_BLOCKS + wr], discont_blocks); }}#define pct(a,b) (b ? a * 100 / b : 0)static void display_brw_stats(struct seq_file *seq, char *name, char *units, struct obd_histogram *read, struct obd_histogram *write, int log2){ unsigned long read_tot, write_tot, r, w, read_cum = 0, write_cum = 0; int i; seq_printf(seq, "\n%26s read | write\n", " "); seq_printf(seq, "%-22s %-5s %% cum %% | %-5s %% cum %%\n", name, units, units); read_tot = lprocfs_oh_sum(read); write_tot = lprocfs_oh_sum(write); for (i = 0; i < OBD_HIST_MAX; i++) { r = read->oh_buckets[i]; w = write->oh_buckets[i]; read_cum += r; write_cum += w; if (read_cum == 0 && write_cum == 0) continue; if (!log2) seq_printf(seq, "%u", i); else if (i < 10) seq_printf(seq, "%u", 1<<i); else if (i < 20) seq_printf(seq, "%uK", 1<<(i-10)); else seq_printf(seq, "%uM", 1<<(i-20)); seq_printf(seq, ":\t\t%10lu %3lu %3lu | %4lu %3lu %3lu\n", r, pct(r, read_tot), pct(read_cum, read_tot), w, pct(w, write_tot), pct(write_cum, write_tot)); if (read_cum == read_tot && write_cum == write_tot) break; }}static void brw_stats_show(struct seq_file *seq, struct brw_stats *brw_stats){ struct timeval now; /* this sampling races with updates */ do_gettimeofday(&now); seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", now.tv_sec, now.tv_usec); display_brw_stats(seq, "pages per bulk r/w", "rpcs", &brw_stats->hist[BRW_R_PAGES], &brw_stats->hist[BRW_W_PAGES], 1); display_brw_stats(seq, "discontiguous pages", "rpcs", &brw_stats->hist[BRW_R_DISCONT_PAGES], &brw_stats->hist[BRW_W_DISCONT_PAGES], 0); display_brw_stats(seq, "discontiguous blocks", "rpcs", &brw_stats->hist[BRW_R_DISCONT_BLOCKS], &brw_stats->hist[BRW_W_DISCONT_BLOCKS], 0); display_brw_stats(seq, "disk fragmented I/Os", "ios", &brw_stats->hist[BRW_R_DIO_FRAGS], &brw_stats->hist[BRW_W_DIO_FRAGS], 0);#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) display_brw_stats(seq, "disk I/Os in flight", "ios", &brw_stats->hist[BRW_R_RPC_HIST], &brw_stats->hist[BRW_W_RPC_HIST], 0); { char title[24]; sprintf(title, "I/O time (1/%ds)", HZ); display_brw_stats(seq, title, "ios", &brw_stats->hist[BRW_R_IO_TIME], &brw_stats->hist[BRW_W_IO_TIME], 1); } display_brw_stats(seq, "disk I/O size", "ios", &brw_stats->hist[BRW_R_DISK_IOSIZE], &brw_stats->hist[BRW_W_DISK_IOSIZE], 1);#endif}#undef pctstatic int filter_brw_stats_seq_show(struct seq_file *seq, void *v){ struct obd_device *dev = seq->private; struct filter_obd *filter = &dev->u.filter; brw_stats_show(seq, &filter->fo_filter_stats); return 0;}static ssize_t filter_brw_stats_seq_write(struct file *file, const char *buf, size_t len, loff_t *off){ struct seq_file *seq = file->private_data; struct obd_device *dev = seq->private; struct filter_obd *filter = &dev->u.filter; int i; for (i = 0; i < BRW_LAST; i++) lprocfs_oh_clear(&filter->fo_filter_stats.hist[i]); return len;}LPROC_SEQ_FOPS(filter_brw_stats);int lproc_filter_attach_seqstat(struct obd_device *dev){ return lprocfs_obd_seq_create(dev, "brw_stats", 0444, &filter_brw_stats_fops, dev);}static int filter_per_export_stats_seq_show(struct seq_file *seq, void *v){ struct filter_export_data *fed = seq->private; brw_stats_show(seq, &fed->fed_brw_stats); return 0;}static ssize_t filter_per_export_stats_seq_write(struct file *file, const char *buf, size_t len, loff_t *off){ struct seq_file *seq = file->private_data; struct filter_export_data *fed = seq->private; int i; for (i = 0; i < BRW_LAST; i++) lprocfs_oh_clear(&fed->fed_brw_stats.hist[i]); return len;}LPROC_SEQ_FOPS(filter_per_export_stats);void lprocfs_filter_init_vars(struct lprocfs_static_vars *lvars){ lvars->module_vars = lprocfs_filter_module_vars; lvars->obd_vars = lprocfs_filter_obd_vars;}static int filter_per_nid_stats_seq_show(struct seq_file *seq, void *v){ nid_stat_t *tmp = seq->private; if (tmp->nid_brw_stats) brw_stats_show(seq, tmp->nid_brw_stats); return 0;}static ssize_t filter_per_nid_stats_seq_write(struct file *file, const char *buf, size_t len, loff_t *off){ struct seq_file *seq = file->private_data; nid_stat_t *tmp = seq->private; int i; if (tmp->nid_brw_stats) for (i = 0; i < BRW_LAST; i++) lprocfs_oh_clear(&tmp->nid_brw_stats->hist[i]); return len;}LPROC_SEQ_FOPS(filter_per_nid_stats);#endif /* LPROCFS */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?