網頁

2013年5月18日

[linux, apache, php] 系統效能機器人

當伺服器系統資源耗盡,接種而來的就是效能低落,為降低這狀況發生,自已使用PHP寫一個腳本程式,這個腳本程式在實體記憶體快耗盡時,會自動釋放記憶體,甚至重新啟動服務。


本程式腳本目前在作業系統Centos 5.4下,搭配PHP 5.3.6版本執行。
(應該Linux系列 + PHP 5.x 以上版本都可以正常運行。)


一、將下列腳本程式存成EfficacyRobot.php
<?php
// +-------------------------------------------------------+
// |  系統效能管理機器人                                               |
// +-------------------------------------------------------+
class EfficacyRobot{
private static $guide = null;
static private $release_level = 1;
static private $restart = false;
static private $fp;

/**
* 記憶體檢測
*
*/
private function ProcessMem()
{
//取得目前可用記憶體
$free = shell_exec("free -m | awk 'NR==2' | awk '{print $4}'");
$free = floor($free);

//低於10 MB,就進行記憶體釋放
if ($free < 10){
//進行等級1~3記憶體釋放,若記憶體都還沒有降下來,進行服務重啟
if (self::$release_level <= 3){
$command = "sync && echo ".(self::$release_level++)." > /proc/sys/vm/drop_caches";
`$command`;
//釋放完後,再檢查一次
self::ProcessMem();
}else{
//釋放三次都沒有降下來,直接進行服務重啟
self::$restart = true;
}
//寫log
fwrite(self::$fp, date("Y-m-d H:i:s")." release memory after free:".sprintf("%4s", $free)."MB\r\n");
}
}

/**
* 服務重新啟動
*
*/
private function ResetService()
{
$command = "service httpd stop"; //停止HTTPD (PHP5)
`$command`; //服務停止

`killall -9 httpd`; //強制刪除HTTPD

$command = "service httpd start"; //啟動HTTPD (PHP5)
`$command`; //服務啟動
}

static public function Entrance()
{
//預防同時執行
self::$fp = fopen("/EfficacyRobot/EfficacyRobot.log", "a+");
flock(self::$fp, LOCK_EX);

if (self::$guide == null){
self::$guide = new self;
}
//檢查記憶體
self::$guide -> ProcessMem();

//若無法處理,重啟服務
if (self::$restart){
//重啟服務
self::$guide -> ResetService();
}

flock(self::$fp, LOCK_UN);
fclose(self::$fp);
}
}

if (PHP_SAPI == 'cgi-fcgi' || PHP_SAPI == 'cli') {
EfficacyRobot::Entrance();
}
?>


二、手動執行:
/usr/bin/php /EfficacyRobot/EfficacyRobot.php

加到排程:
##每5分鐘檢查一次
*/5 * * * * /usr/bin/php /EfficacyRobot/EfficacyRobot.php > /dev/null 2>&1


若有釋放記憶體,就會寫LOG檔案,若沒有就不會寫LOG。
#cat /EfficacyRobot/EfficacyRobot.log
.....................
............................
.........
2013-05-06 13:05:56 release memory after free: 8MB
2013-05-06 13:09:47 release memory after free: 9MB
2013-05-06 13:52:48 release memory after free: 8MB
2013-05-06 14:20:10 release memory after free: 8MB
2013-05-06 14:25:10 release memory after free: 8MB
2013-05-06 14:30:05 release memory after free: 8MB
2013-05-09 13:59:50 release memory after free: 9MB