Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 06-19-2009, 10:29 AM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Extremely High CPU Usage

The following cron job script has been reported to me by my host as using a lot of CPU. To the point where our site has started to return error messages while it is running. I am looking for suggestions on how to optimize any way possible.

PHP Code:
// ---------------------------------------------------
// Start Set PHP Environment
// ---------------------------------------------------

error_reporting(E_ALL & ~E_NOTICE);
if (!
is_object($vbulletin->db))
{
    echo 
"No vBulletin Found!";
    exit;
}

// ---------------------------------------------------
// Start Cronjob
// ---------------------------------------------------

global $vbulletin;
global 
$db;


$updatetime=time(); 
$usersoffline=0;
putenv("TZ=US/Eastern");
$checktime=date("h:i A"time());
$checkdate=date("m/d/y"time());

$vbulletin->db->query_write("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='checked'");

if (
$xml simplexml_load_file("http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag=outcast%20reborn")) {
    
$account=$xml->AccountStatus;
    if(
$account=="Gold") {
        
$vbulletin->db->query_write("UPDATE xblusers SET time='00:00PM', date='00/00/00' WHERE title='crashed'");
        
$logmsg "Whos on XBL Updated";

    } else {
        
$offline="true";
    }
} else {
        
$offline="true";
}

if(
$offline=="true") {

    
$grabchecked $vbulletin->db->query("SELECT time, date FROM xblusers WHERE title='crashed'");
    
$gchecked=$vbulletin->db->fetch_array($grabchecked);
    
$checkedt=$gchecked['time'];
    
    
    if(
$checkedt=="00:00PM") {
        
$vbulletin->db->query_write("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='crashed'");
    }
    
$logmsg "Whos on XBL Not Updated: Stream Down<br />";
    
log_cron_action($logmsg$nextitem0);
    die;
}


$gamertaggrab=$vbulletin->db->query("SELECT userfield.field5, userfield.field11, userfield.userid FROM userfield INNER JOIN user ON user.userid = userfield.userid AND userfield.field5 > '' WHERE usergroupid IN (6,48,52,51,26,58,60,55,46)");
while(
$userrow $vbulletin->db->fetch_array($gamertaggrab)) {    
    
$gamertag=$userrow['field5'];
        
    if (
$gamertag) {
        if (
$xml = @simplexml_load_file("http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag="urlencode($gamertag))) {
            
$coretag=$xml->Gamertag;                
            
$tagvalid=$xml->PresenceInfo->Valid;        
            
$onlinestatus=$xml->PresenceInfo->Online;        
            
$statustext=$xml->PresenceInfo->StatusText;        
            
$title=$xml->PresenceInfo->Title;        
            
$info=$xml->PresenceInfo->Info;        
            
$info2=$xml->PresenceInfo->Info2;        
            
$lastseen=$xml->PresenceInfo->LastSeen;                
                    
            
$statustext=addslashes($statustext);        
            
$title=addslashes($title);        
            
$info=addslashes($info);        
            
$info2=addslashes($info2);
            
            if (
$onlinestatus=="true") {            
                
$online=1;
                
$logmsg $logmsg "<li><a href='http://www.outcastreborn.com/member.php?u=" .$userrow['userid']. "'>" $gamertag "</a>: " " " $statustext " " $title " " $info2 " </li>";        
                
$sms_string $sms_string $gamertag " ";
            } else {            
                
$online=0;
                
$usersoffline $usersoffline 1;
            }                    
                
            foreach (
$xml->xpath('//Game') as $gameset) {  
                
$gamename=$gameset->Name;            
                
$gametile=$gameset->Image32url;                        
                
$gamename=addslashes($gamename);

                
$vbulletin->db->query_write("INSERT IGNORE INTO xblgames (name,tile) VALUES ('".$gamename."','".$gametile."')");                                        
            }    

            if (
$tagvalid=="true")    {
                
$vbulletin->db->query_write("INSERT INTO xblstatus (userid,gamertag,online,statustext,title,info,info2,lastseen,updatetime)             
                VALUES ('"
.$userrow['userid']."','$coretag','$online','$statustext','$title','$info','$info2','$lastseen',FROM_UNIXTIME($updatetime)) ON DUPLICATE KEY             
                UPDATE userid='"
.$userrow['userid']."',gamertag='$coretag',online='$online',statustext='$statustext',title='$title',info='$info',info2='$info2',
                lastseen='
$lastseen',updatetime=FROM_UNIXTIME($updatetime)");                                    
                        
                
$vbulletin->db->query_write("UPDATE userfield SET field12='$statustext',field13='$title',field14='$info2' WHERE userid=".$userrow['userid']);
            }
        }    
    }

    
$gamertag=$userrow['field11'];    
        
    if (
$gamertag) {

        if (
$xml = @simplexml_load_file("http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag="urlencode($gamertag))) {
            
$coretag=$xml->Gamertag;                
            
$tagvalid=$xml->PresenceInfo->Valid;        
            
$onlinestatus=$xml->PresenceInfo->Online;        
            
$statustext=$xml->PresenceInfo->StatusText;        
            
$title=$xml->PresenceInfo->Title;        
            
$info=$xml->PresenceInfo->Info;        
            
$info2=$xml->PresenceInfo->Info2;        
            
$lastseen=$xml->PresenceInfo->LastSeen;    
                
            
$statustext=addslashes($statustext);        
            
$title=addslashes($title);        
            
$info=addslashes($info);        
            
$info2=addslashes($info2);                            
                    
            if (
$onlinestatus=="true") {            
                
$online=1;
                
$logmsg $logmsg "<li><a href='http://www.outcastreborn.com/member.php?u=" .$userrow['userid']. "'>" $gamertag "</a>: " " " $statustext " " $title " " $info2 " </li>";        
                
$sms_string $sms_string $gamertag " ";
            } else {            
                
$online=0;
                
$usersoffline $usersoffline 1;
            }                
                        
            if (
$tagvalid=="true")    {
                
$vbulletin->db->query_write("INSERT INTO sxblstatus (userid,gamertag,online,statustext,title,info,info2,lastseen,updatetime)             
                VALUES ('"
.$userrow['userid']."','$coretag','$online','$statustext','$title','$info','$info2','$lastseen',FROM_UNIXTIME($updatetime)) ON DUPLICATE KEY             
                UPDATE userid='"
.$userrow['userid']."',gamertag='$coretag',online='$online',statustext='$statustext',title='$title',info='$info',info2='$info2',
                lastseen='
$lastseen',updatetime=FROM_UNIXTIME($updatetime)");
                    
                
$vbulletin->db->query("UPDATE userfield SET field15='$statustext',field16='$title',field17='$info2' WHERE userid=".$userrow['userid']);                                                            
            }                        
        }
    }
}
$logmsg $logmsg "<li> Users offline: " $usersoffline ."</li></ul>";
log_cron_action($logmsg$nextitem0); 
The main SQL
PHP Code:
SELECT userfield.field5userfield.field11userfield.userid FROM userfield INNER JOIN user ON user.userid userfield.userid AND userfield.field5 '' WHERE usergroupid IN (6,48,52,51,26,58,60,55,46
Returns 87 Results. The while statement runs 87 times.


I am not giving permission to reuse any of this code at this time.
Reply With Quote
  #2  
Old 06-19-2009, 10:48 AM
IdanB's Avatar
IdanB IdanB is offline
 
Join Date: May 2009
Location: Israel
Posts: 171
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

what's the current cronjob interval ? do you run it every 1m ? 1h ?
What's your current DB/table size (is it over few million of records) ?

If you are using big DB's with over millions of records, the queries can hog some high cpu if db structure not properly configured (specific lack of index / key fields)

Also, i see in your script you are fetching data off a 3rd-party website. Depands on internet traffic/connectivity to your hosting, should operation can take few seconds to perform, it might peak the cpu during it as well.

In general, if possible, try to reduce number of times this cronjob runs.
Reply With Quote
  #3  
Old 06-19-2009, 11:09 AM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It currently runs once every 15 mins.

The DB/table size isn't large enough that I would see any issues.

Do you think cURL might be better than simpleload_xml_file? At least then I can set a time out I suppose.
Reply With Quote
  #4  
Old 06-19-2009, 04:20 PM
IdanB's Avatar
IdanB IdanB is offline
 
Join Date: May 2009
Location: Israel
Posts: 171
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by OcR Envy View Post
Do you think cURL might be better than simpleload_xml_file? At least then I can set a time out I suppose.
Yea, worth trying.

Also, if you own the box it's running on, try to run "top" command, to see which process spikes up the cpu, so you'll have some basic knowledge of what's wrong in code.
If it's mysql or some other thing, etc.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 10:01 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04216 seconds
  • Memory Usage 2,277KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (2)bbcode_php
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (4)post_thanks_box
  • (4)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (4)post_thanks_postbit_info
  • (4)postbit
  • (4)postbit_onlinestatus
  • (4)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete