[PHP-users 20055]Re: PHPからCPULoadAverageの値を得る方法

NAKAMURA Takeshi 1yen @ sh.rim.or.jp
2004年 1月 26日 (月) 19:38:39 JST


仲村です

On Mon, 26 Jan 2004 01:15:23 +0900,
 yahiroml @ fbbs.ftokai-u.ac.jp (八尋剛規(ML専用)) wrote:

> PHPからWebサーバの負荷の状態(load average)を得るには、どうされていますか?
> Linuxだと、/proc/loadavg を読めばいいのでしょうが、FreeBSDの場合はどうすれば
> いいのか?です。
>
> load averageを出力する外部コマンドを system関数で呼び出して、その出力を
> 処理して値を得る方法はわかるのですが、もっとエレガントな方法をご存知でした
> ら、教えてください。


案1. /compat/linux/proc/uptime を読む (linux エミュレーション)

案2. rwhod, rpc.rstatd を起動して置いて /var/rwho/whod.<ホスト名> から読む
     (ファイルがバイナリの上、最大3分ほど古い可能性がある)

案3. rpc.rstatd を起動して socket でお話しする (参考:rup)

案4. /etc/inetd.conf へ
uptime  stream  tcp     nowait  nobody  /usr/libexec/tcpd    uptime
     /etc/services へ
uptime          33637/tcp  #uptime
 を追加し、socket で読む。(telnet ::1 uptime)

案5. cron で 'uptime > file' して、PHP からは file を読む

案6. 自分で php 関数を書く。例えばこんな風に
==============================
diff -Nur php4-STABLE-200401260630/ext/standard/basic_functions.c PHP-patched/ext/standard/basic_functions.c
--- php4-STABLE-200401260630/ext/standard/basic_functions.c	Tue Jan 20 04:10:54 2004
+++ PHP-patched/ext/standard/basic_functions.c	Mon Jan 26 19:26:29 2004
@@ -421,6 +421,7 @@
 	PHP_FE(mt_rand,															NULL)
 	PHP_FE(mt_srand,														NULL)
 	PHP_FE(mt_getrandmax,													NULL)
+	PHP_FE(getloadavg,													NULL)
 
 #if HAVE_GETSERVBYNAME
 	PHP_FE(getservbyname,													NULL)
diff -Nur php4-STABLE-200401260630/ext/standard/php_math.h PHP-patched/ext/standard/php_math.h
--- php4-STABLE-200401260630/ext/standard/php_math.h	Wed Jan  1 02:15:21 2003
+++ PHP-patched/ext/standard/php_math.h	Mon Jan 26 19:16:15 2004
@@ -61,6 +61,7 @@
 PHP_FUNCTION(fmod);
 PHP_FUNCTION(deg2rad);
 PHP_FUNCTION(rad2deg);
+PHP_FUNCTION(getloadavg);
 
    /*
    WARNING: these functions are expermental: they could change their names or 
diff -Nur php4-STABLE-200401260630/ext/standard/rand.c PHP-patched/ext/standard/rand.c
--- php4-STABLE-200401260630/ext/standard/rand.c	Mon Jan 19 13:07:15 2004
+++ PHP-patched/ext/standard/rand.c	Mon Jan 26 19:16:32 2004
@@ -39,6 +39,7 @@
 #include "php_math.h"
 #include "php_rand.h"
 #include "php_lcg.h"
+#include "php_var.h"
 
 #include "basic_functions.h"
 
@@ -412,3 +413,25 @@
  * vim600: noet sw=4 ts=4 fdm=marker
  * vim<600: noet sw=4 ts=4
  */
+
+/* {{{ proto array getloadavg(void)
+   Returns the number of processes in the system run queue
+   averaged over various periods of time. */
+PHP_FUNCTION(getloadavg)
+{
+	double loadavg[3];
+	char   load[11];
+	int i;
+
+	if (getloadavg(loadavg, 3) == -1){
+		RETURN_FALSE;
+	} else {
+		array_init(return_value);
+		for (i = 0; i < 3 ; i++) {
+			snprintf(&load[0], 10,"%f", loadavg[i]);
+			add_next_index_stringl(return_value, load, strlen(load), 1);
+		}
+	}
+	return;
+}
+/* }}} */
==============================
 関数を追加した箇所が rand なのはご愛敬。
 使い方は array (1min,5min,15min) = getloadavg(); です。
多分こんなので動くと思います...
<?php
        $a = getloadavg();

        echo " 1min: " , $a[0] , "\n" ,
             " 5min: " , $a[1] , "\n" ,
             "15min: " , $a[2] , "\n" ;
?>
 この関数がどういう場合(Windows上でとか)でも動くかどうかは分かりません。

 以上、exec を使わずに済む 思いついた方法でした。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+
 関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
 仲村 武 <1yen @ sh.rim.or.jp>



PHP-users メーリングリストの案内