• 0

PHP CPU Load per page script?


Question

I was looking through my emails today and saw a email from my web host about CPU Usage, I was alarmed!

To cut a long story short, I found out that my site was using 10x the CPU Usage recommended, I have been using my host for years without any problems so want to find the source of my problem.

I was wondering if there was a script or program or something, (Thats gramatically bad in so many ways!!) which would tell me what load/usage of my CPU each script/page is using, so I can track down the source of the problem.

I have looked and cannot find anything which does this.

Any help would be appreciated!

Tim

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

You should ask your host to identify the problem for you. The told you your site uses too much CPU, so they need to tell you WHAT processes they saw running that was hogging the CPU. I'd also ask them if this is the first time it's happened or if the CPU usage has been constantly climbing.

Most scripts aren't going to help you out since majority of them are just bash scripts and/or commands to be used with root SSH, and I'm guessing you just have a shared hosting account.

#!/bin/bash
# Shell script to get uptime, disk usage, cpu usage, RAM usage,system load,etc.
# from multiple Linux servers and output the information on a single server
# in html format. Read below for usage/installation info
# *---------------------------------------------------------------------------*
# * dig_remote_linux_server_information.bash,v0.1, last updated on 25-Jul-2005*
# * Copyright (c) 2005 nixCraft project                                       *
# * Comment/bugs: http://cyberciti.biz/fb/                                    *
# * Ref url: http://cyberciti.biz/nixcraft/forum/viewtopic.php?t=97           *
# * This script is licensed under GNU GPL version 2.0 or above                *
# *---------------------------------------------------------------------------*
# *  Installation Info                                                        *
# ----------------------------------------------------------------------------*
# You need to setup ssh-keys to avoid password prompt, see url how-to setup
# ssh-keys:
# cyberciti.biz/nixcraft/vivek/blogger/2004/05/ssh-public-key-based-authentication.html
#
# [1] You need to setup correct VARIABLES script:
#
# (a) Change Q_HOST to query your host to get information
# Q_HOST="192.168.1.2 127.0.0.1 192.168.1.2"
#
# (b) Setup USR, who is used to connect via ssh and already setup to connect
# via ssh-keys
# USR="nixcraft"
#
# (c)Show warning if server load average is below the limit for last 5 minute.
# setup LOAD_WARN as per your need, default is 5.0
#
# LOAD_WARN=5.0
#
# (d) Setup your network title using MYNETINFO
# MYNETINFO="My Network Info"
#
# (e) Save the file
#
# Please refer to forum topic on this script:
# Also download the .gif files and put them in your output dir
#
# ----------------------------------------------------------------------------
# Execute script as follows (and copy .gif file in this dir) :
# this.script.name > /var/www/html/info.html
# ============================================================================
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------

# SSH SERVER HOST IPS, setup me
# Change this to query your host
Q_HOST="192.168.1.2 127.0.0.1 192.168.1.2"

# SSH USER, change me
USR="nixcraft"

# Show warning if server load average is below the limit for last 5 minute
LOAD_WARN=5.0

# Your network info
MYNETINFO="My Network Info"
#
# if it  is run as cgi we can do reload stuff too :D
PBY='Powered by <a href="http://cyberciti.biz/download/">script</a>'

# font colours
GREEN='<font color="#00ff00">'
RED='<font color="#ff0000">'
NOC='</font>'
LSTART='
<ul>
<li>'
LEND='</li>
</ul>

'
# Local path to ssh and other bins
SSH="/usr/bin/ssh"
PING="/bin/ping"
NOW="$(date)"

## functions ##
writeHead(){
 echo '<HTML><HEAD><TITLE>Network Status</TITLE></HEAD>
 <BODY alink="#0066ff" bgcolor="#000000" link="#0000ff" text="#ccddee" vlink="#0033ff">'
 echo '<CENTER><H1>'
 echo "$MYNETINFO</H1>"
 echo "Generated on $NOW"
 echo '</CENTER>'

}

writeFoot(){
 echo "<HR><center>$PBY</center>"
  echo "</BODY></HTML>"
}

## main ##

writeHead
echo '<TABLE WIDTH=100% BORDER=2 BORDERCOLOR="#000080" CELLPADDING=4 CELLSPACING=4 FRAME=HSIDES RULES=NONE" >'
echo '<TR VALIGN=TOP>'
for host in $Q_HOST
do
  #echo '<TD WIDTH=33% BGCOLOR="#0099ff">'
  echo '<TD BGCOLOR="#0099ff">'
  _CMD="$SSH $USR@$host"
  rhostname="$($_CMD hostname)"

  ruptime="$($_CMD uptime)"
  if $(echo $ruptime | grep -E "min|days" >/dev/null); then
    x=$(echo $ruptime | awk '{ print $3 $4}')
  else
    x=$(echo $ruptime | sed s/,//g| awk '{ print $3 " (hh:mm)"}')
  fi
  ruptime="$x"

  rload="$($_CMD uptime |awk -F'average:' '{ print $2}')"
  x="$(echo $rload | sed s/,//g | awk '{ print $2}')"
  y="$(echo "$x >= $LOAD_WARN" | bc)"
  [ "$y" == "1" ] && rload="$RED $rload (High) $NOC" || rload="$GREEN $rload (Ok) $NOC"

  rclock="$($_CMD date +"%r")"
  rtotalprocess="$($_CMD ps axue | grep -vE "^USER|grep|ps" | wc -l)"
  rfs="$($_CMD df -hT | grep -vE "^Filesystem|shm" \
  | awk 'BEGIN{print "
<ul>"}{w=sprintf("%d",$6);print "
<li>" $7 \
  "            " $6 \
  "(" $2 ")<BR> <img src=\"indicator.gif\" height=\"4\" width=\"" w "\"> \
  <BR><img src=\"graph.gif\"> \
  <BR>" $4"/"$3 "</li>

"}END{ print "</ul>

"}')"

  rusedram="$($_CMD free -mto | grep Mem: | awk '{ print $3 " MB" }')"
  rfreeram="$($_CMD free -mto | grep Mem: | awk '{ print $4 " MB" }')"
  rtotalram="$($_CMD free -mto | grep Mem: | awk '{ print $2 " MB" }')"

  $PING -c1  $host>/dev/null
  if [ "$?" != "0" ] ; then
    rping="$RED Failed $NOC"
  else
    rping="$GREEN Ok $NOC"
    echo "<b><u>$rhostname</u></b><BR>"
    echo "Ping status: $rping<BR>"
    echo "Time: $rclock<BR>"
    echo "Uptime: $ruptime <BR>"
    echo "Load avarage: $LSTART $rload $LEND"
    echo "Total running process: $LSTART $rtotalprocess $LEND"
    echo "Disk status:"
    echo "$rfs"
    echo "Ram/swap status:
<ul>"
    echo "
<li>Used RAM: $rusedram</li>

"
    echo "
<li>Free RAM: $rfreeram</li>

"
    echo "
<li>Total RAM: $rtotalram </li>
</ul>

"
  fi   

  echo "</td>

"
done
  echo "</tr>
</table>

"
writeFoot

That would work out if this was your own server you had access to.

Just tell your host to give you an output of the CPU usage when your account hit its peak. It's not that hard so they should be able to do this for you immediately. :)

Link to comment
Share on other sites

  • 0

FYI: I have a reseller account.

The account the high CPU usage is on is a fairly new account. They told me the script which has high CPU usage, i'm not entirely sure why its going so high - Apart from the 5+ xml parses in their, which may not be helping?

Link to comment
Share on other sites

  • 0

Ah, well a reseller account functions the same as a shared account; You just have WHM access. You're still sharing the server with other users. Basically you don't have access to root SSH and/or your own server configuration. That's what I mean. :)

Can you ask them if a single IP keeps hitting the new account and if so, which URL it keeps hitting? They should also be able to determine more info than just telling you the script.

Which by the way, what script are you using?

Link to comment
Share on other sites

  • 0

The script is my own custom made one, built using php. It basically pulls loads of xml information from numerous xml files.

Link to comment
Share on other sites

  • 0

The script is my own custom made one, built using php. It basically pulls loads of xml information from numerous xml files.

You should probably cache the page being created from the XML, if possible, using either a file on the filesystem or a memory caching extension such as APC (it's unlikely that your host has this enabled).

If you give us more information about this script, we can provide better advice.

Link to comment
Share on other sites

  • 0

I did look at caching, but the xml files update themselves, and thats where the main content for the website comes from. (http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=bbcradio1&api_key=c910b0bc1e2d4e64964ebcd2d69c255c&limit=500)

THe current.php script is the script which is parsing the XML information basically, theres around 5 simplexml and xml parsing scripts.

Would parsing by JS be any easier?

Link to comment
Share on other sites

  • 0

I did look at caching, but the xml files update themselves, and thats where the main content for the website comes from. (http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=bbcradio1&api_key=c910b0bc1e2d4e64964ebcd2d69c255c&limit=500)

THe current.php script is the script which is parsing the XML information basically, theres around 5 simplexml and xml parsing scripts.

Would parsing by JS be any easier?

That's no reason not to cache the generated pages, you could do it for something as low as 5 seconds.

Link to comment
Share on other sites

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.