【问题标题】:Linux : Get total cpu usage by httpdLinux:通过 httpd 获取总 CPU 使用率
【发布时间】:2013-02-27 16:01:05
【问题描述】:

我需要在 php 报告中显示服务器上 httpd 进程使用的 CPU 总百分比。

我正在从 exec 中调用以下内容:

ps -e -o %mem,%cpu,cmd | grep httpd | awk ' {memory+=$1;cpu+=$2} END {printf("%05.2f ",memory);printf("%05.2f\n",cpu)}'

但是上面命令报告的CPU使用率和top命令报告的不匹配。

我需要报告 --> 如果 CPU 忙于 40%、10% 的 httpd 进程、20% 的 mysqld 进程、10% 的 perl 进程,那么我需要报告 10% 的 httpd。 (假设没有其他进程)。

我看到了这个:get apache total cpu usage in (linux)

但我知道 ps 命令返回进程消耗的 CPU 占 CPU 消耗总百分比的百分比。我知道它越来越乱了,所以下面的例子应该会有所帮助。

如果 httpd 消耗了 10% 的 CPU,而 CPU 的繁忙率为 60%,那么 httpd 对 CPU 繁忙的实际贡献是 ((100/60)*10) = 16.66 %。它是否正确?还有什么是让一组同名进程使用 cpu 的最佳方法。

【问题讨论】:

    标签: php linux unix ps


    【解决方案1】:

    在 ssh 中试试这个

    ps aux | grep "httpd"  | awk '{sum1 +=$3}; END {print sum1}'
    

    输出是:

    10.5
    

    这是内存的总和

    ps aux | grep "httpd"  | awk '{sum1 +=$4}; END {print sum1}'
    

    【讨论】:

    【解决方案2】:

    我不是 100% 确定你在问什么,但如果我是对的,这个答案可能会对你有所帮助:

    <?php
        exec('ps -aux', $processes);
        foreach($processes as $process){
            $cols = split(' ', ereg_replace(' +', ' ', $process));
            if (strpos($cols[2], '.') > -1){
                $cpuUsage += floatval($cols[2]);
            }
        }
        print($cpuUsage);
    ?>
    

    在搜索了很多表格后也找到了另一种方式:

    在论坛上搜索并尝试了很多方法但我没有尝试过:

    $stat1 = file('/proc/stat'); 
    sleep(1); 
    $stat2 = file('/proc/stat'); 
    $info1 = explode(" ", preg_replace("!cpu +!", "", $stat1[0])); 
    $info2 = explode(" ", preg_replace("!cpu +!", "", $stat2[0])); 
    $dif = array(); 
    $dif['user'] = $info2[0] - $info1[0]; 
    $dif['nice'] = $info2[1] - $info1[1]; 
    $dif['sys'] = $info2[2] - $info1[2]; 
    $dif['idle'] = $info2[3] - $info1[3]; 
    $total = array_sum($dif); 
    $cpu = array(); 
    foreach($dif as $x=>$y) $cpu[$x] = round($y / $total * 100, 1);
    

    【讨论】:

      【解决方案3】:

      这适用于我在 OSX 上:

      <?php
          exec('ps -e -o %mem,%cpu,command | grep httpd', $output);
      
          $proc_data = [];
      
          foreach($output as $key => $value) {
              // Make sure it's only path httpd and not the grep included
              if (strstr($value, '/httpd')) {
                  $info = explode(' ', trim($value), 5);
                  unset($info[1]);
                  unset($info[2]);
                  $proc_data[] = array_merge($info);
              }
          }
      
          echo '<pre>';
          print_r($proc_data);
          echo '</pre>';
      
      
      
          // Caclulate total CPU percentages
          $total_cpu = 0;
      
          foreach ($proc_data as $key => $value) {
              $total_cpu += $value[1];
          }
      
          echo $total_cpu;
      ?>
      

      这是 bash 的终端输出:

      MacBook-Pro:~ user$ ps -e -o %mem,%cpu,command | grep httpd
       0,2   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,1   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,1   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   9,0 /Applications/MAMP/Library/bin/httpd -k start
       0,0   0,0 grep httpd
      

      我注意到 ps -e -o %mem,%cpu,cmd 必须是 command,但它可能只是 OSX 的东西。希望你能用这个。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-08
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        • 2018-03-21
        • 2011-04-01
        • 2016-03-24
        相关资源
        最近更新 更多