PHP로 손쉽게 서버 리소스 모니터링

7719 단어 PHP
웹 서비스 등을 운용함에 있어서, 장해 발생을 미연에 방지하기 위해서 서버 감시 툴을 도입하고 있는 분도 많을까 생각합니다.
검색하면 다양한 툴이 있어 선정에 고민하는 곳입니다만, 고성능일 필요가 없으면 자작으로 좋잖아!
그래서 PHP로 손쉽게 서버 리소스의 모니터링을 해보겠습니다.

환경


  • CentOS 8
  • PHP 8
  • Apache (prefork MPM)
  • MySQL

  • 로드 애버리지


    // 過去1分間のロードアベレージを取得
    $loadAverage = sys_getloadavg()[0];
    if ($loadAverage > 1) {
        // ロードアベレージが1を超えてたらアラートを飛ばす処理
    }
    

    디스크


    $diskFree = (int) disk_free_space('/') / 1024 / 1024; // 空き(MB)
    $diskTotal = (int) disk_total_space('/') / 1024 / 1024; // 合計(MB)
    if ($diskFree / $diskTotal < 0.1) {
        // ディスク使用率が90%を超えてたらアラートを飛ばす処理
    }
    

    메모리


    // freeコマンドでtotal(メモリ合計)とavailable(利用可能な空きメモリ)の値を取得
    [$memoryTotal, $memoryAvailable] = explode(' ', chop(`free -m | grep Mem | awk '{ print $2,$7 }'`));
    if ($memoryAvailable / $memoryTotal < 0.1) {
        // メモリ使用率が90%を超えてたらアラートを飛ばす処理
    }
    

    위는 free 명령으로 available 항목이 있다고 가정합니다.
    예를 들어 CentOS 6 등은 여유 메모리를 얻는 방법이 다르지만 여기에서는 할애합니다.

    메모리(MySQL)


    // psコマンドでMySQLプロセスのRSS (Resident Set Size)を取得
    $mysqlRss = chop(`ps -u mysql uh | awk '{ print $6 }'`) ?: 0;
    $mysqlRss = round($mysqlRss / 1024, 1); // MB
    

    메모리(Apache)


    // psコマンドでApache親プロセスのRSSを取得
    $apacheRss = chop(`ps -u root uh | grep httpd | grep -v grep | awk '{ print $6 }'`) ?: 0;
    $apacheRss = round($apacheRss / 1024, 1); // MB
    
    // pgrepコマンドでApache子プロセス数とUSS(Unique Set Size)合計を取得
    exec('pgrep httpd -U apache | while read p; do cat /proc/$p/smaps | awk \'BEGIN { a = 0 } /Private/ { a += $2 } END { print a }\'; done', $apacheProcesses);
    $apacheCount = count($apacheProcesses);
    $apacheUss = round(array_sum($apacheProcesses) / 1024, 1); // MB
    $apacheAverage = round($apacheUss / $apacheCount / 1024, 1); // MB
    

    위는 MPM이 prefork라고 가정합니다.
    다른 MPM이나 nginx와 같은 경우에는 그에 맞게 만들어야합니다.

    메모리(slab)


    // meminfoからslabのメモリ使用量を取得
    $slab = chop(`cat /proc/meminfo | grep Slab | awk '{ print $2 }'`);
    $slab = round($slab / 1024, 1); // MB
    

    메모리(tmpfs)


    // dfコマンドからtmpfsのメモリ使用量を取得
    $tmpfs = chop(`df -k | grep tmpfs | awk '{ a += $3 } END { print a }'`);
    $tmpfs = round($tmpfs / 1024, 1); // MB
    

    cron으로 로그 저장



    위와 같은 스크립트를 cron으로 매분 실행하여 로그 파일에 저장.



    이번에는 CSV 형식으로 로그를 남겨두고 Google Chart Tools를 사용하여 그래프화해 보았습니다.
    이어서 CPU 사용률이나 전송량 등도 표시할 수 있도록 하고 있습니다.
    CPU 사용률 등은 vmstat 명령으로부터 산출,
    전송량은/proc/net/dev의 정보를 로그에 남기면서, 전회 로그와의 차분으로부터 매분의 전송량을 산출하고 있습니다.

    사이고에게



    OSS의 감시 툴 등에는 도저히 없습니다만, 간편&초경량이므로, 흥미가 있으면 꼭 참고해 주세요.

    좋은 웹페이지 즐겨찾기