Hi
I finally solved this issue.
The problem can be re-described as follows.
I am using my desktop computer to run simulations.
I have 64 bit linux and 4GB RAM.
I run simulations which can run for tenths of minutes and use a lot of virtual
memory (a python script using numpy on large matrices).
While waiting for the simultations to finish, I would like to use the pc for
interactive tasks (such as web browsing).
The problem is that the simulation uses a lot of cpu compared to interactive
processes and accesses to the memory much more frequently.
Therefore the LRU list of active pages fills up with pages belonging to the
simulation while the pages owned by the interactive processes are swapped away.
Thus, even if I am using, say firefox, the python script gets almost all my
physical memory and the system becomes unresponsive (because X, firefox, etc
are being swapped away).
Setting nice to a higher level does not help, because almost all the cpu is
used by the script anyway.
I do not want to limit the amount of virtual memory available to the script
(e.g. using the ulimit -v argument of bash) but I would like to limit the
amount of physical memory to, say, 3GB out of 4. If I am not wrong, this would
make the script swap (I do not care if it takes a little more) more but could
avoid X to swap every time I move the mouse. The problem is that the rss max
size limit is not enforced. I asked Rik van Riel about an old patch he created
to enforce the rss limit.
He kindly answered me and pointed me out that newer kernels provide cgroups
wich can solve my issue.
Therefore, after reading some documentation about cgroups, I wrote the
following script. I also added a link in /etc/init.d and run update-rc.d to
make it start at boot.
Usage:
ungreedy start # mounts the cgroups filesystem, creates the ungreedy cgroup and
sets the rss limit to a percentage of the available RAM
ungreedy on # assigns the current bash to the ungreedy cgroup and every process
started form it (past and future)
ungreedy # same as before
ungreedy off # removes the current bash from the ungreedy cgroup
ungreedy CMD ARG1 ARG2 # executes the CMD command under the ungreedy cgroup
ungreedy stop # umounts the cgroups filesystem
######## ungreedy ##########
#! /bin/sh
PERC="0.75"
CMD=${1:-on}
case "$CMD" in
start)
if ! test -d /dev/cgroups/ungreedy ; then
if ! test -d /dev/cgroups ; then
mkdir -p /dev/cgroups
mount -t cgroup none /dev/cgroups -o memory
fi
mkdir -p /dev/cgroups/ungreedy
chmod a+w /dev/cgroups/ungreedy/memory.limit_in_bytes
/dev/cgroups/ungreedy/tasks /dev/cgroups/tasks
memlimit=$(cat /proc/meminfo | awk '/MemTotal/ {print
int($2*p)substr($3,1,1)}' p=$PERC)
/bin/echo $memlimit > /dev/cgroups/ungreedy/memory.limit_in_bytes
fi
;;
stop)
umount /dev/cgroups
rm -r /dev/cgroups
;;
on)
/bin/echo $PPID > /dev/cgroups/ungreedy/tasks
;;
off)
/bin/echo $PPID > /dev/cgroups/tasks
;;
*)
/bin/echo $$ > /dev/cgroups/ungreedy/tasks
$@
;;
esac
--
Ubuntu interface becomes unresponsive underheavy load
https://bugs.launchpad.net/bugs/289892
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs