Page 1 of 2
Download speed and CPU
Posted: July 29th, 2011, 5:54 am
by bbaraniec
Hello,
First of all welcome everyone and thanks for SAB
I have a question according download speed and CPU usage.
I'm running SAB 0.6.5 on ReadyNas Pro with Intel 1,86 Dual Core and 2GB ram.
I have 35Mbit/s connection giving me stable 4.0 to 4.2MB/s download speed. While downloading (without setting any limitation) I've sshed to my box and check CPU usage, it's around 60-70% all the time.
What I have notice that when I limit download speed to 4096kbit/s, so exact 4MB/s CPU usage drops to 20-30%. So you see there isn't much a difference in download speed but there is huge difference in CPU usage.
Any reason why this is happening? Can anyone confirm that behavior?
Thank you in advance
Regards
Bartek
Re: Download speed and CPU
Posted: July 29th, 2011, 6:47 am
by shypike
CPU usage is an issue with SABnzbd.
We have been planning to look at this, but the to-do list is so long.
It is an interesting observation that you make and it may very well
point to some inefficiency in the way the socket handling is scheduled.
I have a Windows Home Server box with a similar CPU/memory spec,
so I'll try to reproduce this.
I assume the ReadyNas runs some Linux derivative?
Re: Download speed and CPU
Posted: July 29th, 2011, 6:55 am
by bbaraniec
Hi shypike,
Thank you for your reply.
Code: Select all
Nas:~# uname -a
Linux Nas 2.6.37.6.RNx86_64.2.1 #1 SMP Fri Jun 24 18:53:39 PDT 2011 x86_64 GNU/Linux
Nas:~# cat /proc/version
Linux version 2.6.37.6.RNx86_64.2.1 (jmaggard@calzone) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Fri Jun 24 18:53:39 PDT 2011
Running on Python 2.6.6.
Once I get some time I will check that behavior on my NB running Windows 7.
Re: Download speed and CPU
Posted: July 31st, 2011, 4:14 am
by sander
@bbaraniec
Bartek, does your NAS support the 'top' command? I think so as it's Linux.
For my (Ubuntu) Linux, I've patched SABnzbd (a few lines in the file sabnzbd/misc.py) so that it shows the CPU-load and SABnzbd's relative part therein in the SAB webinterface. See screendump (upper right corner):
So with this patch you don't have to ssh into your NAS to see the CPU-load.
If you find this useful for your NAS, let me know and I'll post the code.
Re: Download speed and CPU
Posted: July 31st, 2011, 4:40 am
by shypike
sander wrote:
For my (Ubuntu) Linux, I've patched SABnzbd (a few lines in the file sabnzbd/misc.py) so that it shows the CPU-load and SABnzbd's relative part therein in the SAB webinterface. See screendump
Interesting, can you share this?
Re: Download speed and CPU
Posted: July 31st, 2011, 5:07 am
by sander
Sure! Below is the first version (with a lot of ugly debug and useful comment stuff). I'm now writing a version that calls an external custom script in which you can put things you want to report: handy for ad-hoc debugging stuff like CPU-usage, SAB-cpu-usage, unrar-cpu-usage, ...
Output of
Code: Select all
~/SABnzbd-0.6.6/sabnzbd$ diff -u misc.py.org misc.py
is
Code: Select all
--- misc.py.org 2011-07-31 12:02:54.667851903 +0200
+++ misc.py 2011-07-31 10:47:41.777851056 +0200
@@ -913,7 +913,36 @@
if sabnzbd.WIN32 or sabnzbd.DARWIN:
return ""
try:
- return "%.2f | %.2f | %.2f" % os.getloadavg()
+
+ '''
+ $ top -bn1 | grep Cpu
+ Cpu(s): 6.5%us, 1.7%sy, 0.9%ni, 89.8%id, 0.8%wa, 0.0%hi, 0.3%si, 0.0%st
+ '''
+ command = " top -bn1 | grep Cpu | awk '{ print $2 }' | awk -F% '{ print $1 }' "
+ CPUusage = os.popen(command).readline().strip()
+ #print CPUusage
+
+ '''
+ $ top -bn1 | grep SABnzbd.py
+ 12665 sander 20 0 485m 74m 4568 S 0 2.0 0:28.02 SABnzbd.py
+
+
+ with:
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+
+ '''
+ command = " top -bn1 | grep SABnzbd.py | awk '{ print $9 }' "
+ SABpercentage = os.popen(command).readline().strip()
+ #print SABpercentage
+
+ loadavg = "%.2f | %.2f | %.2f " % os.getloadavg()
+ #print loadavg
+
+ returnstring = loadavg + " --- CPUusage: " + CPUusage + "% --- SABpercentage: " + SABpercentage + "%"
+ #print returnstring
+
+ #return "%.2f | %.2f | %.2f | %s | %s" % os.getloadavg()
+ return returnstring
except:
return ""
Re: Download speed and CPU
Posted: July 31st, 2011, 5:26 am
by sander
And here's the cleaner and more flexible version of misc.py calling an external script.
I need help with one thing, Shypike: the working directory of SABnzbd: what is it? I need to get rid of the hard coded SAB directory. Or is there a directory that is always defined, for example the pre/post processing directory?
Code: Select all
--- misc.py.org 2011-07-31 12:02:54.667851903 +0200
+++ misc.py 2011-07-31 12:20:36.957852103 +0200
@@ -912,10 +912,27 @@
"""
if sabnzbd.WIN32 or sabnzbd.DARWIN:
return ""
+
try:
- return "%.2f | %.2f | %.2f" % os.getloadavg()
+ dir = '/home/sander/SABnzbd-0.6.6'
+ #dir = '..' #### Does not work :-( What is my working directory? Or: put the script in the pre/post-processing directory?
+ scriptname = 'sysload-custom-script.sh'
+ scriptfullname = dir + '/' + scriptname
+
+ if os.path.isfile(scriptfullname):
+ # print "Yes, file exists"
+ customoutput = ''
+ for thisline in os.popen(scriptfullname).readlines() :
+ customoutput += ' --- ' + thisline.strip()
+ else:
+ customoutput = '--- no script found ' + scriptfullname # This is debug info
+
+ loadavg = "%.2f | %.2f | %.2f " % os.getloadavg()
+ returnstring = loadavg + customoutput
+ return returnstring
+
except:
- return ""
+ return "<something went wrong>" # This is debug info too
def format_time_string(seconds, days=0):
Example output of my sysload-custom-script.sh:
Code: Select all
sander@R540:~/SABnzbd-0.6.6$ ./sysload-custom-script.sh
CPUload: 6.1%
SABpercentage: 8%
sander@R540:~/SABnzbd-0.6.6$
generated by this script:
Code: Select all
#!/bin/sh
top -bn1 | grep Cpu | awk '{ print $2 }' | awk -F% '{ print "CPUload: " $1 "%" }'
top -bn1 | grep SABnzbd.py | awk '{ print "SABpercentage: " $9 "%" }'
Re: Download speed and CPU
Posted: July 31st, 2011, 5:47 am
by shypike
The current directory is whatever SABnzbd is started from, so not usable.
If you put the script in the same directory as SABnzbd.py, you can use the global sabnzbd.DIR_PROG.
BTW: I don't think running a script every few seconds is a good idea.
Isn't there some way to get this info from the /proc pseudo files?
Re: Download speed and CPU
Posted: July 31st, 2011, 7:11 am
by sander
OK, that directory works. Thanks.
I personally don't worry too much about calling a script each x (in my case: 30) seconds: that software is 20 year old technlogy, which used to run on machines with 1 MB RAM and a 10 Mhz CPU. So I don't think it will eat too much CPU or RAM.
And the 'time' command shows the real time used on the CPU: 0,04 sec:
Code: Select all
sander@R540:~/SABnzbd-0.6.6$ time ./sysload-custom-script.sh
CPUload: 5.9%
SABpercentage: 4%
real 0m1.069s
user 0m0.020s
sys 0m0.040s
sander@R540:~/SABnzbd-0.6.6$
I can have a look at /proc/, but it would mean more parsing.
Re: Download speed and CPU
Posted: July 31st, 2011, 3:09 pm
by sander
I had a look the /proc/ (procfs), and so far it's interessing:
You can only look at your own /proc/<pid>/... which you can easily access this via /proc/self/...
Example of (virtual?) memory usage:
sander@R540:~/kul$ cat /proc/self/status | grep -i -e VmPeak -e VmRss
VmPeak: 9236 kB
VmRSS: 588 kB
sander@R540:~/kul$
So that can easily be put into the sysload info line with a fopen().
The CPU usage seems to more difficult:
CPU used by your process is available in /proc/self/stat. This is an odd-looking file consisting of a single line; for example:
19340 (whatever) S 19115 19115 3084 34816 19115 4202752 118200 607 0 0 770 384 2
7 20 0 77 0 266764385 692477952 105074 4294967295 134512640 146462952 321468364
8 3214683328 4294960144 0 2147221247 268439552 1276 4294967295 0 0 17 0 0 0 0
The important data here are the 13th and 14th tokens (0 and 770 here). The 13th token is the number of jiffies that the process has executed in user mode, and the 14th is the number of jiffies that the process has executed in kernel mode. Add the two together, and you have its total CPU utilization.
So you have to count, and measure the difference ... See
http://stackoverflow.com/questions/6316 ... -a-process
I expect /proc/self/ to also give info on open pipes ... which could be interesting too.
Re: Download speed and CPU
Posted: July 31st, 2011, 3:39 pm
by sander
Here's a code snippet I wrote that prints the VmPeak (Virtual Memory Peak usage?) after reading it from /proc/self/status.
So this could be handy on the sysload line. As with sysload, it only works on *ix system. I don't know if it work on Mac.
Code: Select all
'''
sander@R540:~/kul$ cat /proc/self/status | grep -i -e VmPeak -e VmRss
VmPeak: 9236 kB
VmRSS: 588 kB
sander@R540:~/kul$
'''
f = open('/proc/self/status', "r")
for myline in f.readlines():
if(myline.strip().lower().find('vmpeak')>-1):
print myline.split()[1]
f.close()
Re: Download speed and CPU
Posted: July 31st, 2011, 3:44 pm
by sander
And here's the 'diff -u' for sabnzbd/misc.py showing the VmPeak in the sysload bar (without using an external script)
Code: Select all
--- misc.py.org 2011-07-31 12:02:54.667851903 +0200
+++ misc.py 2011-07-31 22:40:53.843213037 +0200
@@ -913,9 +913,15 @@
if sabnzbd.WIN32 or sabnzbd.DARWIN:
return ""
try:
- return "%.2f | %.2f | %.2f" % os.getloadavg()
+ f = open('/proc/self/status', "r")
+ for myline in f.readlines():
+ if(myline.strip().lower().find('vmpeak')>-1):
+ vmpeak = myline.split()[1]
+ f.close()
+ returnstring = "%.2f | %.2f | %.2f" % os.getloadavg() + ' --- ' + vmpeak + ' kB'
+ return returnstring
except:
- return ""
+ return "nope not good"
def format_time_string(seconds, days=0):
Re: Download speed and CPU
Posted: August 4th, 2011, 1:55 pm
by sander
I've played further with extending the sysload info, with interesting results: even with a slow external script (including a ping) and SAB on a refresh of 2 seconds, there is ... no delay in the screen. Fascinating.
And here's the "diff -u" for sabnzbd/misc.py which calls an external script. The nice thing of the external script method is that you can put in extra scripting output without changing the SAB code. So you can also use it ad-hoc debug monitoring purposes.
Code: Select all
--- misc.py.org 2011-08-04 18:32:46.643345168 +0200
+++ misc.py 2011-08-04 18:44:06.043345297 +0200
@@ -912,10 +912,25 @@
"""
if sabnzbd.WIN32 or sabnzbd.DARWIN:
return ""
+
try:
- return "%.2f | %.2f | %.2f" % os.getloadavg()
+ scriptfullname = sabnzbd.DIR_PROG + '/' + 'sysload-custom-script.sh' #### Or: put the script in the pre/post-processing directory?
+
+ if os.path.isfile(scriptfullname):
+ # print "Yes, file exists", scriptfullname
+ customoutput = ''
+ for thisline in os.popen(scriptfullname).readlines() :
+ customoutput += ' --- ' + thisline.strip()
+ else:
+ customoutput = '--- no script found ' # This is debug info
+
+ loadavg = "%.2f | %.2f | %.2f " % os.getloadavg()
+
+ returnstring = loadavg + customoutput + " --- END"
+ return returnstring
+
except:
- return ""
+ return "<something went wrong>" # This is debug info too
def format_time_string(seconds, days=0):
and here's the external script and it's output
Code: Select all
sander@R540:~/SABnzbd-0.6.7RC1$ cat sysload-custom-script.sh
#!/bin/sh
top -bn1 | grep Cpu | awk '{ print $2 }' | awk -F% '{ print "CPUload: " $1 "%" }'
top -bn1 | grep SABnzbd.py | awk '{ print "SAB-CPU-percentage: " $9 "%" }'
echo -n "connections to port 8080 and 9090: "; netstat -na | grep -e :8080 -e :9090 | wc -l
echo -n "ping: "; ping -c5 -i0.2 ping.xs4all.nl | grep "packet loss" | awk -F, '{ print $3 }'
sander@R540:~/SABnzbd-0.6.7RC1$ ./sysload-custom-script.sh
CPUload: 4.4%
SAB-CPU-percentage: 2%
connections to port 8080 and 9090: 20
ping: 0% packet loss
sander@R540:~/SABnzbd-0.6.7RC1$
Re: Download speed and CPU
Posted: August 10th, 2011, 11:19 am
by pmow
I've also noticed a correlation between download speed and CPU - In my case, one of my sab machines is a dedicated 100mbit server with an AMD 2600+ with 1GB ram.
Sab used to download at roughtly 8-10MB/s, but lately (in the last few months) I'm getting 5-6.5MB/s speeds, with the cpus of python hitting a max of 80% and hovering around 75% (according to top). I'm running Ubuntu and Sab 0.6.6 from packages.
Re: Download speed and CPU
Posted: August 10th, 2011, 11:36 am
by shypike
Do you see significant differences between releases or is it
that performance degrades over time?
Did you upgrade Python in the course of time?