alexander Posted May 15, 2008 Report Posted May 15, 2008 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); } Quote
alexander Posted May 15, 2008 Report Posted May 15, 2008 (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 ;) Quote
alexander Posted May 24, 2008 Report Posted May 24, 2008 just outcomputed T in the einstein project :shrug: and i have over 8000 credit pending :hihi: Hypography Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.