I have some highly floating point intensive processes doing very little I/O. One is called "xspec", which calculates a numerical model and returns a floating point result back to a master process every second (via stdout). It is niced at the 19 level. I have another simple process "cpufloattest" which just does numerical computations in a tight loop. It is not niced.
I have a 4-core i7 system with hyperthreading disabled. I have started 4 of each type of process. Why is the Linux scheduler (Linux 3.4.2) not properly limiting the CPU time taken up by the niced processes?
Cpu(s): 56.2%us, 1.0%sy, 41.8%ni, 0.0%id, 0.0%wa, 0.9%hi, 0.1%si, 0.0%st
Mem: 12297620k total, 12147472k used, 150148k free, 831564k buffers
Swap: 2104508k total, 71172k used, 2033336k free, 4753956k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32399 jss 20 0 44728 32m 772 R 62.7 0.3 4:17.93 cpufloattest
32400 jss 20 0 44728 32m 744 R 53.1 0.3 4:14.17 cpufloattest
32402 jss 20 0 44728 32m 744 R 51.1 0.3 4:14.09 cpufloattest
32398 jss 20 0 44728 32m 744 R 48.8 0.3 4:15.44 cpufloattest
3989 jss 39 19 1725m 690m 7744 R 44.1 5.8 1459:59 xspec
3981 jss 39 19 1725m 689m 7744 R 42.1 5.7 1459:34 xspec
3985 jss 39 19 1725m 689m 7744 R 42.1 5.7 1460:51 xspec
3993 jss 39 19 1725m 691m 7744 R 38.8 5.8 1458:24 xspec
The scheduler does what I expect if I start 8 of the cpufloattest processes, with 4 of them niced (i.e. 4 with most of the CPU, and 4 with very little)