2010/2/4 Ted Unangst <ted.unan...@gmail.com>:
> I haven't really solved the problem I want to solve, but was able to whip
> this up pretty quickly.  Basically, it's just a wrapper that runs a
> command and then starves it from running.  disknice is a misnomer, it also
> gets starved from cpu, but at the current time the only way to slow down a
> process's io is to stop it.  Not a complete solution, but it will slow
> down a large tar job to the point where other programs have plenty of time
> to get their requests in.  The sleep ratios should be tunable, aren't.
>
>
>> time disknice md5 -t
> MD5 time trial.  Processing 10000 10000-byte blocks...
> Digest = 52e5f9c9e6f656f3e1800dfa5579d089
> Time   = 3.339803 seconds
> Speed  = 29941885.793863 bytes/second
>    0m3.50s real     0m0.30s user     0m0.00s system
>
>
> #include <sys/types.h>
> #include <sys/wait.h>
>
> #include <signal.h>
> #include <stdlib.h>
> #include <unistd.h>
>
> int
> main(int argc, char **argv)
> {
>        int i;
>        char **nargv;
>        pid_t pid;
>        int status;
>        const int onesec = 1000000;
>
>        nargv = malloc((sizeof(*nargv) * argc + 1));
>        for (i = 1; i < argc; i++) {
>                nargv[i-1] = argv[i];
>        }
>        nargv[i-1] = NULL;
>
>        pid = fork();
>        if (pid == -1)
>                err(127, "fork");
>        if (!pid) {
>                execvp(nargv[0], nargv);
>                write(2, "failed to exec\n", 15);
>                _exit(127);
>        }
>        usleep(10);
>        while (!waitpid(pid, &status, WNOHANG)) {
>                kill(pid, SIGSTOP);
>                usleep(onesec / 2);
>                kill(pid, SIGCONT);
>                usleep(onesec / 10);
>        }
>        return WEXITSTATUS(status);
> }
>
>

I really like this idea, is there any way we could watch how much IO a
process is doing ?

We could then decide to SIGSTOP it, I know it's still not a solution
but I could use that.

Reply via email to