⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_genplot.c

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * rf_genplot.c * * Jim Zelenka, CMU/SCS, 11 Jun 1996 *//* * Copyright (c) 1996 Carnegie-Mellon University. * All rights reserved. * * Authors: Jim Zelenka, Dan Stodolsky * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU *  School of Computer Science *  Carnegie Mellon University *  Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. */typedef unsigned U32; /* luv, DEC */#include "rf_threadstuff.h"#include "rf_types.h"#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <sys/file.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ioctl.h>#ifdef __osf__#include <sys/utctime.h>#include <machine/hal/hal_sysinfo.h>#endif /* __osf__ */#include <sys/param.h>#include "rf_raid.h"#include "rf_dag.h"#include "rf_threadid.h"#include "rf_randmacros.h"#include "rf_parityscan.h"#include "rf_etimer.h"#include "rf_script.h"#include "rf_mcpair.h"#include "rf_configure.h"#include "rf_stripelocks.h"#include "rf_general.h"#include "rf_utils.h"#include "rf_testcode.h"#include "rf_driver.h"#include "rf_cpuutil.h"#include "rf_map.h"#include "rf_dagutils.h"#include "rf_copyback.h"#include "rf_raidframe.h"#include "rf_sys.h"#if RF_CMU_PDL > 0 && !defined(SIMULATE)#include <pdl/pdldev.h>#include <pdl/ccdvar.h>#include <sys/dkusage.h>#include <io/cam/scsi_special.h>#endif /* RF_CMU_PDL > 0 && !SIMULATE */#ifdef SIMULATE#include "rf_desc.h"#include "rf_owner.h"#include "rf_diskevent.h"#include "rf_diskthreads.h"#endif /* SIMULATE */#ifdef USEC_PER_SEC#undef USEC_PER_SEC#endif /* USEC_PER_SEC */#define USEC_PER_SEC 1000000char *rf_gp_progname;/* config params */static int doplot = 0;static int runscript = 1;static char cmd[8192];static char batch_filename[MAXPATHLEN];#define TITLELEN 512static int ncfg;static char title[TITLELEN];static char subtitle[TITLELEN];static char out_filename[MAXPATHLEN];static char out_ps_filename[MAXPATHLEN];static char out_mif_filename[MAXPATHLEN];#if RF_CMU_PDL > 0 && !defined(SIMULATE)static char out_cpu_filename[MAXPATHLEN];static char out_cpu_ps_filename[MAXPATHLEN];static char out_cpu_mif_filename[MAXPATHLEN];#endif /* RF_CMU_PDL > 0 && !SIMULATE */static double xmin, xmax, ymin, ymax;static double xtickmajor, xtickminor, ytickmajor, ytickminor;static char *kdevname = NULL;static int nokey = 0;struct graphsym {  char *symbol;  char *symbol_size;  char *symbol_fill;  char *color;  char *linestyle;};static struct graphsym gsyms[] = {  {"2", "1", "0", "1", "1"},  {"3", "1", "0", "1", "1"},  {"4", "1", "0", "1", "1"},  {"5", "1", "0", "1", "1"},  {"8", "1", "0", "1", "1"},  {"10", "1", "0", "1", "1"},  {"9", "1", "0", "1", "1"},  {"11", "1", "0", "1", "1"}};#define NUM_SYMS (sizeof(gsyms)/sizeof(struct graphsym))struct plconfig {  char  config_name[MAXPATHLEN];  char  plot_name[MAXPATHLEN];  struct plconfig *next;};struct workload {  char  script_name[MAXPATHLEN];  struct workload *next;};static void free_workload(w)  struct workload  *w;{  free(w);}static struct workload *get_workload(){  struct workload *w;  w = (struct workload *)malloc(sizeof(struct workload));  if (w == NULL) {    fprintf(stderr, "ERROR: out of memory\n");    exit(1);  }  w->next = NULL;  return(w);}static void free_plconfig(p)  struct plconfig  *p;{  free(p);}static struct plconfig *get_plconfig(){  struct plconfig *p;  p = (struct plconfig *)malloc(sizeof(struct plconfig));  if (p == NULL) {    fprintf(stderr, "ERROR: out of memory\n");    exit(1);  }  p->next = NULL;  return(p);}static int doScriptTest(raidPtr, scriptname, listp)  RF_Raid_t           *raidPtr;  char                *scriptname;  RF_ShutdownList_t  **listp;{  RF_Script_t *script;  RF_GRpair_t *grp, *fgrp;  int rc;  long nthreads;#ifndef SIMULATE  RF_Thread_t *threads, fthread;  RF_ThreadAttr_t attr;#endif /* !SIMULATE */  int status, i;  char buf[10];  grp = rf_GetGrpair(listp);  if (grp == NULL) {    RF_PANIC();  }  grp->raidPtr = raidPtr;  fgrp = rf_GetGrpair(listp);  if (fgrp == NULL) {    RF_PANIC();  }  fgrp->raidPtr = raidPtr;  nthreads =0;  script = ConfigureScript(scriptname, raidPtr->totalSectors, &nthreads);  if (script == NULL) {    printf("bad script %s\n", scriptname);    exit(1);  }  grp->script = script;  rf_testcode_degr_mode_type = 'n';  if ((rf_testcode_degr_mode_type == 'c') || (rf_testcode_degr_mode_type == '2')) {    rf_FailDisk(raidPtr, 0, 0, 0);    if (rf_testcode_degr_mode_type == '2') {      rf_FailDisk(raidPtr, 0, 1, 0);    }  }#ifdef SIMULATE  RF_INIT_RANDOM(1);  RunScriptTestFunc(grp, nthreads);#else /* SIMULATE */  grp->script = script;  RF_Malloc(threads, nthreads*sizeof(RF_Thread_t), (RF_Thread_t *));  for (i=0; i<nthreads; i++) {    if (RF_CREATE_THREAD(threads[i], ScriptTestFunc, grp)) {      RF_ERRORMSG("Unable to create ScriptTestFunc thread!\n");      exit(1);    }    RF_THREADGROUP_STARTED(&grp->group);  }  RF_THREADGROUP_WAIT_START(&grp->group);    rf_start_cpu_monitor();  if (rf_testcode_degr_mode_type == 'r' || rf_testcode_degr_mode_type == 'a' ) {    if (RF_CREATE_THREAD(fthread, DiskFailingThread, fgrp)) {      RF_ERRORMSG("Unable to create disk failing thread\n");      exit(1);    }    RF_THREADGROUP_STARTED(&fgrp->group);    RF_THREADGROUP_WAIT_START(&fgrp->group);    RF_THREADGROUP_WAIT_STOP(&fgrp->group);    rf_terminate_script_test = 1;  }  else {    rf_start_cpu_monitor();  }  RF_THREADGROUP_WAIT_STOP(&grp->group);  if (rf_testcode_degr_mode_type != 'r') {    rf_stop_cpu_monitor();    rf_print_cpu_util("script run");  }  RF_Free(threads, nthreads*sizeof(RF_Thread_t));#endif /* SIMULATE */  ShutdownScript(script);}#if RF_CMU_PDL > 0 && !defined(SIMULATE)int PDL_get_total_idle_time(int fd, struct timespec *ts){  PDL_idle_stats is;  int rc;  rc = ioctl(fd, PDL_GET_IDLE_STATS, &is);  *ts = is.idle_time;  return(rc);}/* * Striper test */static void sdo_run_script(  char       *cfg_name,  char       *script_name,  RF_uint64  *num_iosp,  double     *ios_per_secp,  double     *response_timep,  double     *cpu_utilp){  unsigned long before_rpcc, after_rpcc, ctimer_ticks_per_sec, rsec, rnsec;  double sec, before_idle_sec, after_idle_sec, idle_sec;  timespec_t before_idle_ts, after_idle_ts, idle_ts;  struct timeval before, after, total_tv, elapsed;  int dev_fd, rc, keep, i, gook;  struct ccdiotime ccdt;  struct ccddevice ccd;  dku_get_dev_t dkudev;  RF_Config_t *config;  dku_dev_t *dev;  RF_uint64 nio;  int pdl_fd;  *ios_per_secp = *response_timep = *cpu_utilp = 0.0;  *num_iosp = 0;  config = (RF_Config_t *)malloc(sizeof(RF_Config_t));  rc = rf_get_cpu_ticks_per_sec((long *)&ctimer_ticks_per_sec);  if (rc) {    perror("rf_get_cpu_ticks_per_sec");    exit(1);  }  pdl_fd = open("/dev/pdl", O_RDWR);  if (pdl_fd < 0) {    perror("pdl_fd");    exit(1);  }  dev_fd = open(kdevname, O_RDWR);  if (dev_fd < 0) {    perror(kdevname);    fprintf(stderr, "ERROR: could not open %s\n", kdevname);    exit(1);  }  rc = rf_MakeConfig(cfg_name, config);  if (rc) {    fprintf(stderr, "ERROR: rc=%d reading %s\n", rc, cfg_name);    exit(1);  }  /*   * Shut down any old config.   * Ignore return val- if it's not configged, that's   * an error, but I don't care.   */  gook = 0;  ioctl(dev_fd, CCDIOCUNCONFIG, &gook);  ccd.ccd_unit = 0;  /*   * XXX assumes 512-byte sectors   */  ccd.ccd_interleave = (config->sectPerSU << 9) >> DEV_BSHIFT;  if (config->numRow != 1) {    fprintf(stderr, "ERROR: no logical equivalent of multi-row arrays in striper\n");    exit(1);  }  for(i=0;i<config->numCol;i++) {    ccd.ccd_dev[i] = config->devs[0][i];    strcpy(ccd.ccd_devname[i], config->devnames[0][i]);    ccd.ccd_maxreq.len[i] = config->maxOutstandingDiskReqs;  }  for(;i<NCCDISKS;i++) {    ccd.ccd_dev[i] = NODEV;    ccd.ccd_devname[i][0] = '\0';    ccd.ccd_maxreq.len[i] = config->maxOutstandingDiskReqs;  }  ccd.ccd_flags = 0;  if (!strcasecmp(config->diskQueueType, "cscan")) {    ccd.ccd_flags |= CCDF_ONEWAY;  }  else if (!strcasecmp(config->diskQueueType, "fifo")) {    ccd.ccd_flags |= CCDF_FIFOQ;  }  else if (strcasecmp(config->diskQueueType, "scan")) {    fprintf(stderr, "WARNING: disk queue type \"%s\" not directly supported by the striper\n",      config->diskQueueType);    fprintf(stderr, "         striper defaults to SCAN sorting (two-way elevator)\n");    fflush(stderr);  }  rc = ioctl(dev_fd, CCDIOCCONFIG, &ccd);  if (rc) {    perror("CCDIOCCONFIG");    exit(1);  }  sync(); sync(); sync();  rc = ioctl(dev_fd, SCSI_DKU_RESET_DEV);  if (rc) {    perror("SCSI_DKU_RESET_DEV");    exit(1);  }  rc = ioctl(dev_fd, CCDIOCCIOTIME);  if (rc) {    perror("CCDIOCCIOTIME");    exit(1);  }  rc = PDL_get_total_idle_time(pdl_fd, &before_idle_ts);  if (rc < 0) {    perror("PDL_get_total_idle_time");    exit(1);  }  before_rpcc = 0xffffffff & rf_rpcc();  gettimeofday(&before, 0);  play_trace(script_name, kdevname);  after_rpcc = 0xffffffff & rf_rpcc();  gettimeofday(&after, 0);  rc = PDL_get_total_idle_time(pdl_fd, &after_idle_ts);  if (rc < 0) {    perror("PDL_get_total_idle_time");    exit(1);  }  rc = ioctl(dev_fd, SCSI_DKU_DEV, &dkudev);  if (rc) {    perror("SCSI_DKU_DEV");    exit(1);  }  rc = ioctl(dev_fd, CCDIOCGIOTIME, &ccdt);  if (rc) {    perror("CCDIOCGIOTIME");    exit(1);  }  /*   * Dan's magic timing code   */	{	unsigned long wraps;	unsigned long wrap_time = ((unsigned long)0xffffffff);		wrap_time /= (ctimer_ticks_per_sec/100);	wraps = 100 * ((unsigned long) after.tv_sec - before.tv_sec);	wraps /= wrap_time;	if (wraps && ( after_rpcc <= before_rpcc ))		wraps--;		wrap_time = wraps * ((unsigned long)0xffffffff);		rsec = wrap_time / ctimer_ticks_per_sec;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -