Пример #1
0
  /**
   * Executes the commands and process the results to return the memory pm data.
   *
   * @param paramlist pm parameter values list.
   * @param params the performance metrices to be monitored.
   * @param pflag parameter flags.
   * @param cmdflag command flags.
   * @param exectime time the data collected.
   * @return returns the PMData instance.
   */
  private static PMData getPMData(
      Vector paramlist, String[] params, boolean[] pflag, boolean[] cmdflag, long exectime) {

    // execute the vmstat command
    String vmstatResult = null;
    // execute the vmstat command twice for AIX to retrieve page fault information
    String vmstatResult1 = null;
    String vmstatResult2 = null;
    if (cmdflag[VMSTAT]) {
      try {
        vmstatResult = RunCommand.exec(VMSTATCMD, 10000);
      } catch (Exception e) {
        IsmMonAgentUtil.debug(e.getMessage());
      }

      if (IsmPmAgentImpl.OS == IsmMaConstants.AIX) {
        try {
          vmstatResult1 = RunCommand.exec(AIX_VMSTATCMD);
        } catch (Exception e) {
          IsmMonAgentUtil.debug(e.getMessage());
        }
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        ;
        try {
          vmstatResult2 = RunCommand.exec(AIX_VMSTATCMD);
        } catch (Exception e) {
          IsmMonAgentUtil.debug(e.getMessage());
        }
      }
    }

    // execute the vmstat command to get swap info
    // AIX does not have -S option for vmstat
    String vmstatswapResult = null;
    if (cmdflag[VMSTATSWAP] && IsmPmAgentImpl.OS != IsmMaConstants.AIX) {
      try {
        if (IsmPmAgentImpl.OS != IsmMaConstants.LINUX) {
          vmstatswapResult = RunCommand.exec(VMSTATSWAPLINUXCMD, 10000);
        } else {
          vmstatswapResult = RunCommand.exec(VMSTATSWAPCMD, 10000);
        }
      } catch (Exception e) {
        IsmMonAgentUtil.debug(e.getMessage());
      }
    }

    // process the vmstat result
    if (cmdflag[VMSTAT] && (vmstatResult != null)) {
      StringTokenizer rtokenizer = new StringTokenizer(vmstatResult, "\n");
      String line = null;
      if (rtokenizer.hasMoreTokens()) line = rtokenizer.nextToken(); // column groupings header

      if (IsmPmAgentImpl.OS == IsmMaConstants.AIX) {
        // AIX has an additional line
        if (rtokenizer.hasMoreTokens()) line = rtokenizer.nextToken(); // dashed lines
      }

      if (rtokenizer.hasMoreTokens()) line = rtokenizer.nextToken(); // column labels

      if (rtokenizer.hasMoreTokens()) line = rtokenizer.nextToken(); // first line of results;

      // Skip the first line of results and collect data from the
      // second line.
      // Only parsing a single line of data, but use a while loop
      // so that we can easily break out of the processing if we
      // don't have enough tokens.
      while (rtokenizer.hasMoreTokens()) {
        line = rtokenizer.nextToken(); // second line of results;

        StringTokenizer ltokenizer = new StringTokenizer(line, " \t");

        int cnt = ltokenizer.countTokens();

        // Need at least 14 tokens that will be needed for all OS's
        if (cnt < 14) break;

        String r = ltokenizer.nextToken();
        String b = ltokenizer.nextToken();

        // AIX and Linux does not have a w column
        if (IsmPmAgentImpl.OS == IsmMaConstants.SOLARIS
            || IsmPmAgentImpl.OS == IsmMaConstants.HPUX) {
          ltokenizer.nextToken(); // Skip w column
        }
        String swap = ltokenizer.nextToken();
        String free = "n/a";
        free = ltokenizer.nextToken();

        String re = ltokenizer.nextToken();
        if (IsmPmAgentImpl.OS == IsmMaConstants.LINUX) {
          re = "0";
        }
        String mf = null;
        if (IsmPmAgentImpl.OS == IsmMaConstants.SOLARIS
            || IsmPmAgentImpl.OS == IsmMaConstants.HPUX) {
          mf = ltokenizer.nextToken();
        } else if (IsmPmAgentImpl.OS == IsmMaConstants.LINUX) {
          mf = "0";
        } else {
          // AIX doesn't supply mf or at via vmstat, so use vmstat command twice
          // to retrieve
          /* output will look like:
          /users/donjiang>vmstat -s
                     3565041603 total address trans. faults
                       59621208 page ins
                      187195152 page outs
                          37598 paging space page ins
                         255904 paging space page outs
                              0 total reclaims
                     1162272236 zero filled pages faults
                      114011306 executable filled pages faults
                       38332962 pages examined by clock
                              8 revolutions of the clock hand
                       15545326 pages freed by the clock
                       33240616 backtracks
                              0 lock misses
                          56054 free frame waits
                              2 extend XPT waits
                       19326700 pending I/O waits
                      108413391 start I/Os
                      108420004 iodones
                     2929261290 cpu context switches
                     2842949964 device interrupts
                              0 software interrupts
                              0 traps
                    71007291963 syscalls
          */
          long total_address_trans_fault1 = 0;
          long total_address_trans_fault2 = 0;
          if (vmstatResult1 != null) {
            StringTokenizer rvmstattokenizer = new StringTokenizer(vmstatResult1, "\n");
            String vmstatline = null;
            while (rvmstattokenizer.hasMoreTokens()) {
              vmstatline = rvmstattokenizer.nextToken().trim();
              int index = vmstatline.indexOf("total address trans. faults");
              if (index >= 0) {
                total_address_trans_fault1 = Long.parseLong(vmstatline.substring(0, index).trim());
                break;
              }
            }
          }

          if (vmstatResult2 != null) {
            StringTokenizer rvmstattokenizer = new StringTokenizer(vmstatResult2, "\n");
            String vmstatline = null;
            while (rvmstattokenizer.hasMoreTokens()) {
              vmstatline = rvmstattokenizer.nextToken().trim();
              int index = vmstatline.indexOf("total address trans. faults");
              if (index >= 0) {
                total_address_trans_fault2 = Long.parseLong(vmstatline.substring(0, index).trim());
                break;
              }
            }
          }
          if (total_address_trans_fault1 != 0 && total_address_trans_fault2 != 0) {
            mf = String.valueOf(Math.abs(total_address_trans_fault2 - total_address_trans_fault1));
          }
        }
        // At this point, there should be at least 10 tokens left.
        if (ltokenizer.countTokens() < 10) break;
        String pi = ltokenizer.nextToken();
        String po = ltokenizer.nextToken();
        String fr = ltokenizer.nextToken();
        String de = null;
        if (IsmPmAgentImpl.OS == IsmMaConstants.SOLARIS
            || IsmPmAgentImpl.OS == IsmMaConstants.HPUX) {
          de = ltokenizer.nextToken();
        } else {
          // AIX doesn't support
          de = "0";
        }
        String sr = ltokenizer.nextToken();

        if (IsmPmAgentImpl.OS == IsmMaConstants.SOLARIS) {
          // Solaris has up to 4 columns for disk operations.
          // Determine if there are less than 4 disk columns.
          // int cnt2 = ltokenizer.countTokens();
          // IsmMonAgentUtil.debug("vmstat counts, cnt=" + cnt + "  cnt2=" + cnt2,
          // IsmMonAgentUtil.MAJOR);
          while (ltokenizer.countTokens() > 6) {
            ltokenizer.nextToken(); // Skip disk operations
          }
        }

        if (ltokenizer.countTokens() < 6) break;

        ltokenizer.nextToken(); // Skip in
        ltokenizer.nextToken(); // Skip sy
        ltokenizer.nextToken(); // Skip cs
        String us = ltokenizer.nextToken();
        String sy = ltokenizer.nextToken();
        String id = ltokenizer.nextToken();

        if (pflag[PAGESRECLAIMED]) {
          paramlist.addElement(new PmMeasurement(PAGESRECLAIMEDNAME, re, true, null));
        }
        if (pflag[PAGEFAULTS]) {
          paramlist.addElement(new PmMeasurement(PAGEFAULTSNAME, mf, true, null));
        }
        if (pflag[PAGESPAGEDIN]) {
          paramlist.addElement(new PmMeasurement(PAGESPAGEDINNAME, pi, true, null));
        }
        if (pflag[PAGESPAGEDOUT]) {
          paramlist.addElement(new PmMeasurement(PAGESPAGEDOUTNAME, po, true, null));
        }
        if (pflag[PAGESFREED]) {
          paramlist.addElement(new PmMeasurement(PAGESFREEDNAME, fr, true, null));
        }
        if (pflag[ANTICIPATEDMEMORYSHORTFALL]) {
          paramlist.addElement(new PmMeasurement(ANTICIPATEDMEMORYSHORTFALLNAME, de, true, null));
        }
        if (pflag[PAGESSCANRATE]) {
          paramlist.addElement(new PmMeasurement(PAGESSCANRATENAME, sr, true, null));
        }

        if (pflag[RUNQUEUE]) {
          paramlist.addElement(new PmMeasurement(RUNQUEUENAME, r, true, null));
        }
        if (pflag[BLOCKEDQUEUE]) {
          paramlist.addElement(new PmMeasurement(BLOCKEDQUEUENAME, b, true, null));
        }
        if (pflag[VMSWAP]) {
          paramlist.addElement(new PmMeasurement(VMSWAPNAME, swap, true, null));
        }
        if (pflag[VMFREE]) {
          paramlist.addElement(new PmMeasurement(VMFREENAME, free, true, null));
        }
        if (pflag[VMUSR]) {
          paramlist.addElement(new PmMeasurement(VMUSRNAME, us, true, null));
        }
        if (pflag[VMSYS]) {
          paramlist.addElement(new PmMeasurement(VMSYSNAME, sy, true, null));
        }
        if (pflag[VMIDL]) {
          paramlist.addElement(new PmMeasurement(VMIDLNAME, id, true, null));
        }

        break; // Break out of while loop.  Only want to process one line
        // of results.
      }
    }

    // process swap result
    String si = "n/a";
    String so = "n/a";
    if (cmdflag[VMSTATSWAP] && (vmstatswapResult != null)) {
      StringTokenizer rtokenizer = new StringTokenizer(vmstatswapResult, "\n");
      if (rtokenizer.countTokens() >= 4) {
        String line = rtokenizer.nextToken();
        line = rtokenizer.nextToken();
        line = rtokenizer.nextToken();
        // Skip the first line of results and collect data from the
        // second line.
        line = rtokenizer.nextToken();

        StringTokenizer ltokenizer = new StringTokenizer(line, " \t");
        if (ltokenizer.countTokens() >= 7) {
          ltokenizer.nextToken();
          ltokenizer.nextToken();
          ltokenizer.nextToken();
          ltokenizer.nextToken();
          ltokenizer.nextToken();
          if (IsmPmAgentImpl.OS == IsmMaConstants.LINUX) {
            ltokenizer.nextToken();
          }
          si = ltokenizer.nextToken();
          so = ltokenizer.nextToken();
        }
      }
    }
    if (pflag[PAGESSWAPPEDIN]) {
      paramlist.addElement(new PmMeasurement(PAGESSWAPPEDINNAME, si, true, null));
    }
    if (pflag[PAGESSWAPPEDOUT]) {
      paramlist.addElement(new PmMeasurement(PAGESSWAPPEDOUTNAME, so, true, null));
    }

    PmMeasurement[] pmlist = new PmMeasurement[paramlist.size()];
    paramlist.copyInto(pmlist);
    paramlist.removeAllElements();
    paramlist = null;

    return new PMData(
        IsmPmAgentImpl.MEMORY, -1, IsmPmConstants.LOCATION_OS, new Date(exectime), pmlist);
  }
Пример #2
0
  /**
   * Executes the commands and process the results to return the PMData.
   *
   * @return returns the PMData instance.
   */
  static PMData getPMData() {

    long exectime = System.currentTimeMillis();
    // execute df or bdf command
    String dfResult = null;
    try {
      if (IsmPmAgentImpl.OS == IsmMaConstants.SOLARIS) {
        dfResult = RunCommand.exec(SOLARIS_DFCMD, 10000);
      } else if (IsmPmAgentImpl.OS == IsmMaConstants.HPUX) {
        dfResult = RunCommand.exec(HPUX_BDFCMD, 10000);
      } else if (IsmPmAgentImpl.OS == IsmMaConstants.AIX) {
        dfResult = RunCommand.exec(AIX_DFCMD, 10000);
      }
    } catch (Exception e) {
      IsmMonAgentUtil.debug(e.getMessage());
    }

    Vector paramlist = new Vector();
    // process the df or bdf command result
    if (dfResult != null && dfResult.trim().length() > 0) {
      Vector devList = new Vector();
      StringTokenizer rtokenizer = new StringTokenizer(dfResult, "\n");
      rtokenizer.nextToken();
      while (rtokenizer.hasMoreTokens()) {
        String line = rtokenizer.nextToken();
        if (line.indexOf("Permission") != -1) {
          continue;
        }
        StringTokenizer ltokenizer = new StringTokenizer(line, " \t");
        if (ltokenizer.hasMoreTokens()) {
          // Filesystem
          String fsName = ltokenizer.nextToken();
          if (!ltokenizer.hasMoreTokens()) {
            if (!rtokenizer.hasMoreTokens()) break;
            line = rtokenizer.nextToken();
            ltokenizer = new StringTokenizer(line, " \t");
          }

          // Total
          String total = ltokenizer.nextToken();
          if (total.equals("-")) {
            continue; // AIX presented this case
          }
          if (!ltokenizer.hasMoreTokens()) {
            if (!rtokenizer.hasMoreTokens()) break;
            line = rtokenizer.nextToken();
            ltokenizer = new StringTokenizer(line, " \t");
          }
          float totalVal = ((float) Long.parseLong(total)) / 1024;

          // Used
          String used = ltokenizer.nextToken();
          if (used.equals("-")) {
            continue; // AIX presented this case
          }
          if (!ltokenizer.hasMoreTokens()) {
            if (!rtokenizer.hasMoreTokens()) break;
            line = rtokenizer.nextToken();
            ltokenizer = new StringTokenizer(line, " \t");
          }
          float usedVal = ((float) Long.parseLong(used)) / 1024;

          // Free
          String free = ltokenizer.nextToken();
          if (free.equals("-")) {
            continue; // AIX presented this case
          }
          if (!ltokenizer.hasMoreTokens()) {
            if (!rtokenizer.hasMoreTokens()) break;
            line = rtokenizer.nextToken();
            ltokenizer = new StringTokenizer(line, " \t");
          }
          float freeVal = ((float) Long.parseLong(free)) / 1024;

          // Capacity
          String capacity = ltokenizer.nextToken();
          capacity = capacity.substring(0, capacity.length() - 1);
          if (!ltokenizer.hasMoreTokens()) {
            if (!rtokenizer.hasMoreTokens()) break;
            line = rtokenizer.nextToken();
            ltokenizer = new StringTokenizer(line, " \t");
          }

          // Mounted on
          String mountFS = ltokenizer.nextToken() + "/";

          addParams(paramlist, fsName, totalVal, usedVal, freeVal, capacity, mountFS);
        }
      }
    }

    // construct the pm data
    PmMeasurement[] pmlist = new PmMeasurement[paramlist.size()];
    paramlist.copyInto(pmlist);
    paramlist.removeAllElements();
    paramlist = null;

    return new PMData(
        IsmPmAgentImpl.LOGSPACE, -1, IsmPmConstants.LOCATION_OS, new Date(exectime), pmlist);
  }