> >> > So if I have 2 physical CPU's with 4 cores each and I enable SMP, I'm > >> > using > >> > 8 cores? Can NUMA be either enabled or disabled when using more than > >> > one > >> > physical CPU, or is it required? > >> > >> > >> NUMA is a hardware architecture. It's how you access memory on a > >> hardware level: NUMA = Non Uniform Memory Access vs a UMA architecture > >> of typical (old/legacy) SMP systems (UMA = Uniform Memory Access). > >> > >> In a UMA system, all the memory belongs to all the sockets. In a NUMA > >> system, each socket has it's "own" local memory. In modern (x86-64) > >> processors, each socket has it's own memory controller so each socket > >> controls its own local memory. If one socket runs out of memory it can > >> ask another socket to lend him some memory. In a UMA system, no socket > >> has to ask since memory is global and belongs to all sockets so if one > >> socket uses up all the memory ... the rest "starve". In NUMA, there's > >> more control over who uses what (be it cores or RAM). > >> > >> If you have a modern dual or quad (or higher #) socket system ... > >> you've got NUMA architecture and you can't get rid of it, it's > >> hardware, not software. > > > > So I must enable CONFIG_NUMA for more than one physical CPU, and disable it > > for only one physical CPU? > > > Yup. But ... Why would you want to disable a socket (CPU)? If you > disable a socket (CPU) ... you lose the memory attached to that socket > (CPU) not to mention you lose those cores ;)
Sure but it sounds like if my system only has one CPU socket, CONFIG_NUMA should be disabled. - Grant > A better solution would be to use cgroups or numactl tools to pin a > certain process to a set of cores and a memory region. > > If you really want to deactivate cores (but not the whole socket), you can type: > > echo 0 > /sys/devices/system/cpu/cpu1/online > > This would deactivate core #1. You can deactivate as many cores as you > wish, except for core #0. > > This can be done without rebooting your server (aka during run time). > Your memory will not be affected, but you will have less cores (and > theoretically more memory bandwidth). I say "theoretically" because > you always have to benchmark these things with YOUR application > (remember logic NEVER applies to real life ;) > > If you want to check the # of cores you've got: > > cat /proc/interrupts | grep CPU > > Other possibilities such as cat /proc/cpuinfo or dmesg, ... can be > useful too for this: your choice, FLOSS gives you options. > > If you want to activate the previously deactivated core, you can run: > > echo 1 > /sys/devices/system/cpu/cpu1/online > > Now ... be sure your core numbering is the expected core numbering. > IOW, not all server vendors follow the same numbering scheme so core > #1 in vendor A's server could be core #2 in vendor B's server. Never > trust logic ;) > > As I mentioned previously: test/benchmark YOUR software. DON'T trust > logic or generic benchmarks or web pages with results. Trust YOUR > results only. > > HTH > > Rafa