【问题标题】:Php showing 97% of CPU usagephp 显示 97% 的 CPU 使用率
【发布时间】:2009-12-16 14:11:26
【问题描述】:

我有一个使用 flash 和 php 开发的游戏网站。 php 代码包含 4000 行,它将作为 cron 运行。在代码内部,有一个 while 循环将无限地 运行以检查是否写入了套接字中的任何数据,并相应地调用不同的函数并将结果发送回套接字。从 flash 中,它会得到结果并显示出来。

我面临的问题是,在 php 代码的某个地方,它正在泄漏内存。由于它非常大,我无法找到它发生在哪里。此外,它只能作为 cron 运行。有什么工具可以找出内存泄漏吗?我听说过 xdebug 但我没有使用。还有其他的吗?

check.php(作为 cron)

$sock = fsockopen(IP_ADDRESS, PORT, $sock_error_code, $sock_error_string, 10); if (!$sock){
      $message = "Server was down, restarting...\n\n";  
      $last_line = system("php -q gameserver/server.php", $retval);} else {
         $message = "Server is up...";
         $message .= $sock_error_string." (".$sock_error_code.")\n\n";}

server.php(仅部分)

class gameserver {
var $server_running = true;
function gameserver() {
    global $cfg, $db;

    $this->max_connections = $cfg["server"]["max-connections"];

    $this->start_socket();

    echo "Gameserver initialized\n";
    while ($this->server_running) {
        $read = $this->get_socket_list();
        $temp = socket_select($read, $null, $null, 0, 15);
        if (!empty($read)) {
            $this->read_sockets($read);
        }
        $db->reconnection();
        $this->update_DB_records();
        $this->check_games_progress();

        if ($this->soft_shutdown && $this->active_games == 0) {
            $this->server_running = false;
            echo "soft shutdown complete\n";
        }
    }

    $this->stop_socket();

    echo "Server shut down\n";
}}        $server = new gameserver();

【问题讨论】:

  • 发布您的一些代码会有所帮助;否则,它主要是一个猜谜游戏。
  • CPU 使用率?内存泄漏?是哪个?
  • 在问题中发布代码会更有帮助。

标签: php


【解决方案1】:

两件事,第一,确保你在循环中至少睡眠一次,以确保你不使用 97% 的 cpu。

其次,我发现的一个技巧是,如果有任何数据库活动,调用 mysql_free_result(或其他 DBMS 的等效项)来释放用于存储查询结果的内存。

【讨论】:

  • 我在循环中添加了 sleep(1),所以现在它没有使用 97% 的 CPU。希望这不会导致以后出现任何其他瓶颈问题..感谢您的回复..
  • 您可能需要考虑您的客户端轮询服务器的频率,以及您是否可以调整睡眠时间以进一步减少运行脚本所花费的时间。
【解决方案2】:

您是否正在从 CRON 开始永无止境的程序? Cron 将根据您指定的计划启动一个新实例,最终您将有几个正在运行的程序做同样的事情。这可能是您的问题吗?

【讨论】:

  • 这完全有道理...看起来像 * * * * * 如果是这样,您将尝试每分钟运行一次该 cron,每次调用一个无限循环!
  • 不..我确定它只发生一次..请看看我的代码
【解决方案3】:

我假设您不是每分钟都使用 cron 启动一个新实例,并且每个实例都运行一个无限循环:

XDebug 可能是您最好的选择。除此之外,您可以使用memory_get_usage() 并在循环的特定点记录内存使用情况。

是否仅仅是因为您的脚本会累积数据并且在每个循环结束时没有正确清理它?

【讨论】:

  • 不..我确定它只发生一次......是的,它可能在某处积累数据,但很难从 4000 行中找出来
  • ok.. 如果我从命令提示符运行,即使下面的程序显示 97% 的 CPU 使用率.. 有什么办法经常释放 CPU 使用率?
  • 可能值得一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多