Jump to content
Science Forums

Hypography Distributed Computing Team


MortenS

Recommended Posts

just put up my third system on this

 

this one is nix, and its supposed to run transparently (shhh)

 

my biggest problem is that on nix, boinc has not provided a way to limit cpu usage, and for me, it's a big deal, when i am installing it on a future router....

 

i think i may have found a solution though

//cpulimit.c
/**
* Simple program to limit the cpu usage of a process
*
* Author: Angelo Marletta ([email protected])
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/resource.h>

//pid of the controlled process
int pid;

//SIGINT signal handler
void quit(int sig) {
//let the process continue if it's stopped
kill(pid,SIGCONT);
exit(0);
}

int main(int argc, char **argv) {

if (argc!=3) {
fprintf(stderr,"Usage: %s {pid} {max cpu percentage}n",argv[0]);
exit(1);
}
pid=atoi(argv[1]);
int limit=atoi(argv[2]);
if (limit>100 || limit<0) {
fprintf(stderr,"limit must be in the range 0-100n");
exit(1);
}
//if possible renice this process, so it has more responsiveness
if (setpriority(PRIO_PROCESS,getpid(),-20)!=0) {
printf("Warning: cannot renice.nTo work better you should run this program as root.n");
}
signal(SIGINT,quit);

//time quantum in microseconds
int period=100000;
struct timespec twork,tsleep; //time to work, and time to sleep
twork.tv_sec=0;
twork.tv_nsec=period*limit*10;
tsleep.tv_sec=0;
tsleep.tv_nsec=period*(100-limit)*10;

while(1) {
if (kill(pid,SIGSTOP)!=0) break;
nanosleep(&tsleep,NULL);
if (kill(pid,SIGCONT)!=0) break;
nanosleep(&twork,NULL);
}

perror("kill()");
exit(1);
}

Link to comment
Share on other sites

(note, for some insane reason VB blocks anything with a $ in front of it... so i HAD to not use the code tags)

 

Here's what i did so far to get limiting, working:

 

after following the normal installation steps do the following:

 

copy the code above into limiter.c file in wherever your BOINC directory is.

 

compile it:

 

gcc limiter.c -o limiter

 

now lets go and edit an init.d script:

nano -w /etc/init.d/boinc

 

first, you will see a lot of defined values. Take a moment and add one more to it

 

MAX_FREQ=60

 

now go to section that says

 

echo -n "Starting BOINC client as a daemon: "

su $BOINCUSER -c "$BOINCEXE $BOINCOPTS" >>$LOGFILE 2>>$ERRORLOG &

sleep 1

PID=`pidof -s -x -o $$ -o $PPID -o %PPID $BOINCEXE`

if [ $PID ]; then

[ -d $LOCKDIR ] && touch $LOCKDIR/boinc

 

 

 

add this just after that line

 

# rather dirty way of doing this

./limiter $PID $MAX_FREQ &

 

 

this will start the limiter when you start the service

 

now only to kill it when you are done

 

go to section that says:

 

 

cd $BOINCDIR

if [ ! -f lockfile -a ! -f $LOCKDIR/boinc ] ; then

echo -n "BOINC is not running (no lockfiles found)."

echo_success

else

echo -n "Stopping BOINC client daemon: "

killproc $BOINCEXE && echo_success || echo_failure

# clean up in any case

rm -f $BOINCDIR/lockfile

rm -f $LOCKDIR/boinc

 

 

now lets add one more line to it

 

killall limiter

 

 

save, restart service, do a ps -ef f, make sure limiter is in there, do a top, to make sure that whatever boinc is doing, it is not exceeding whatever max percent utilization, and we are in game ;)

Link to comment
Share on other sites

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...