* [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests
@ 2008-12-05 13:29 Andre Przywara
2008-12-05 14:28 ` Anthony Liguori
0 siblings, 1 reply; 10+ messages in thread
From: Andre Przywara @ 2008-12-05 13:29 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm, Daniel P. Berrange
Hi,
this patch series introduces multiple NUMA nodes support within KVM guests.
This is the second try incorporating several requests from the list:
- use the QEMU firmware configuration interface instead of CMOS-RAM
- detect presence of libnuma automatically, can be disabled with
./configure --disable-numa
This only applies to the host side, the command line and guest (BIOS)
side are always built and functional, although this configuration
is only useful for research and debugging
- use a more flexible command line interface allowing:
- specifying the distribution of memory across the guest nodes:
mem:1536M;512M
- specifying the distribution of the CPUs:
cpu:0-2;3
- specifying the host nodes the guest nodes should be pinned to:
pin:3;2
All of these options are optional, in case of mem and cpu the resources
are split equally across all guest nodes if omitted. Please note that at
least in Linux SRAT takes precedence over E820, so the total usable
memory will be the sum specified at the mem: option (although QEMU will
still allocate the amount at -m).
If pin: is omitted, the guest nodes will be pinned to those host nodes
where the threads are happen to be scheduled at on start-up time. This
requires the (v)getcpu (v)syscall to be usable, this is true for kernels
up from 2.6.19 and glibc >= 2.6 (sched_getcpu()). I have a hack if glibc
doesn't support this, tell me if you are interested.
The only non-optional argument is the number of guest nodes, a possible
command line looks like:
-numa 3,mem:1024M;512M;512M,cpu:0-1;2;3
Please note that you have to quote the semicolons on the shell.
The monitor command is left out for now and will be send later.
Please apply.
Regards,
Andre.
Signed-off-by: Andre Przywara <andre.przywara@amd.com>
--
Andre Przywara
AMD-Operating System Research Center (OSRC), Dresden, Germany
Tel: +49 351 277-84917
----to satisfy European Law for business letters:
AMD Saxony Limited Liability Company & Co. KG,
Wilschdorfer Landstr. 101, 01109 Dresden, Germany
Register Court Dresden: HRA 4896, General Partner authorized
to represent: AMD Saxony LLC (Wilmington, Delaware, US)
General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 13:29 [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests Andre Przywara @ 2008-12-05 14:28 ` Anthony Liguori 2008-12-05 15:22 ` Andre Przywara 2008-12-05 15:27 ` Avi Kivity 0 siblings, 2 replies; 10+ messages in thread From: Anthony Liguori @ 2008-12-05 14:28 UTC (permalink / raw) To: Andre Przywara; +Cc: Avi Kivity, kvm, Daniel P. Berrange Hi Andre, This patch series needs to be posted to qemu-devel. I know qemu doesn't do true SMP yet, but it will in the relatively near future. Either way, some of the design points needs review from a larger audience than present on kvm-devel. I'm not a big fan of the libnuma dependency. I'll willing to concede this if there's a wide agreement that we should support this directly in QEMU. I don't think there's such a thing as a casual NUMA user. The default NUMA policy in Linux is node-local memory. As long as a VM is smaller than a single node, everything will work out fine. In the event that the VM is larger than a single node, if a user is creating it via qemu-system-x86_64, they're going to either not care at all about NUMA, or be familiar enough with the numactl tools that they'll probably just want to use that. Once you've got your head around the fact that VCPUs are just threads and the memory is just a shared memory segment, any knowledgable sysadmin will have no problem doing whatever sort of NUMA layout they want. The other case is where management tools are creating VMs. In this case, it's probably better to use numactl as an external tool because then it keeps things consistent wrt CPU pinning. There's also a good argument for not introducing CPU pinning directly to QEMU. There are multiple ways to effectively do CPU pinning. You can use taskset, you can use cpusets or even something like libcgroup. If you refactor the series so that the libnuma patch is the very last one and submit to qemu-devel, I'll review and apply all of the first patches. We can continue to discuss the last patch independently of the first three if needed. Regards, Anthony Liguori Andre Przywara wrote: > Hi, > > this patch series introduces multiple NUMA nodes support within KVM > guests. > This is the second try incorporating several requests from the list: > - use the QEMU firmware configuration interface instead of CMOS-RAM > - detect presence of libnuma automatically, can be disabled with > ./configure --disable-numa > This only applies to the host side, the command line and guest (BIOS) > side are always built and functional, although this configuration > is only useful for research and debugging > - use a more flexible command line interface allowing: > - specifying the distribution of memory across the guest nodes: > mem:1536M;512M > - specifying the distribution of the CPUs: > cpu:0-2;3 > - specifying the host nodes the guest nodes should be pinned to: > pin:3;2 > All of these options are optional, in case of mem and cpu the > resources are split equally across all guest nodes if omitted. Please > note that at least in Linux SRAT takes precedence over E820, so the > total usable memory will be the sum specified at the mem: option > (although QEMU will still allocate the amount at -m). > If pin: is omitted, the guest nodes will be pinned to those host nodes > where the threads are happen to be scheduled at on start-up time. This > requires the (v)getcpu (v)syscall to be usable, this is true for > kernels up from 2.6.19 and glibc >= 2.6 (sched_getcpu()). I have a > hack if glibc doesn't support this, tell me if you are interested. > The only non-optional argument is the number of guest nodes, a > possible command line looks like: > -numa 3,mem:1024M;512M;512M,cpu:0-1;2;3 > Please note that you have to quote the semicolons on the shell. > > The monitor command is left out for now and will be send later. > > Please apply. > > Regards, > Andre. > > Signed-off-by: Andre Przywara <andre.przywara@amd.com> > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 14:28 ` Anthony Liguori @ 2008-12-05 15:22 ` Andre Przywara 2008-12-05 15:41 ` Anthony Liguori 2008-12-05 15:27 ` Avi Kivity 1 sibling, 1 reply; 10+ messages in thread From: Andre Przywara @ 2008-12-05 15:22 UTC (permalink / raw) To: Anthony Liguori; +Cc: Avi Kivity, kvm, Daniel P. Berrange Anthony, > This patch series needs to be posted to qemu-devel. I know qemu doesn't > do true SMP yet, but it will in the relatively near future. Either way, > some of the design points needs review from a larger audience than > present on kvm-devel. OK, I already started looking at that. The first patch applies with only some fuzz, so no problems here. The second patch could be changed to promote the values via the firmware configuration interface only, leaving the host side pinning alone (which wouldn't make much sense without true SMP anyway). The third patch is actually BOCHS BIOS, and I am confused here: I see the host side of the firmware config interface in QEMU SVN, but neither in the BOCHS CVS nor in the qemu/pc-bios/bios.diff there is any sign of usage from the BIOS side. Is the kvm-patched qemu the only user of the interface? If so I would have to introduce the interface to QEMU's bios.diff (or better send to bochs-developers?) Do you know what BOCHS version the bios.diff applies against? Is that the 2.3.7 release? > I'm not a big fan of the libnuma dependency. I'll willing to concede > this if there's a wide agreement that we should support this directly in > QEMU. As long as QEMU is not true SMP, libnuma is rather useless. One could pin the memory to the appropriate host nodes, but without the proper scheduling this doesn't make much sense. And rescheduling the qemu process each time a new VCPU is scheduled doesn't seem so smart, either. So for qemu we could just drop libnuma (at least for now) (which is also the case for the current KVM patches, if there is no libnuma, the whole host side pinning is skipped). > I don't think there's such a thing as a casual NUMA user. The default > NUMA policy in Linux is node-local memory. As long as a VM is smaller > than a single node, everything will work out fine. Almost right, but simply calling qemu-system-x86_64 can lead to bad situations. I lately saw that VCPU #0 was scheduled on one node and VCPU #1 on another. This leads to random (probably excessive) remote accesses from the VCPUs, since the guest assumes uniform memory. Of course one could cure this small guest case with numactl, but in my experience the existence of this tool isn't as well-known as one would expect. > > In the event that the VM is larger than a single node, if a user is > creating it via qemu-system-x86_64, they're going to either not care at > all about NUMA, or be familiar enough with the numactl tools that > they'll probably just want to use that. Once you've got your head > around the fact that VCPUs are just threads and the memory is just a > shared memory segment, any knowledgable sysadmin will have no problem > doing whatever sort of NUMA layout they want. Really? How do you want to assign certain _parts_ of guest memory with numactl? (Let alone the rather weird way of using -mempath, which is much easier done within QEMU). The same applies to the threads. You can assign _all_ the threads to certain nodes, but pinning single threads only requires some tedious work (QEMU monitor or top, then taskset -p). Isn't that OK if qemu would do this automatically (or at least give some support here)? > The other case is where management tools are creating VMs. In this > case, it's probably better to use numactl as an external tool because > then it keeps things consistent wrt CPU pinning. > > There's also a good argument for not introducing CPU pinning directly to > QEMU. There are multiple ways to effectively do CPU pinning. You can > use taskset, you can use cpusets or even something like libcgroup. I agree that pinning isn't the last word on the subject, but it works pretty well. But I wouldn't load the admin with the burden of pinning, but let this be done by QEMU/KVM. Maybe one could introduce a way to tell QEMU/KVM to not pin the threads. I also had the idea to start with some sort of pinning (either automatically or user-chosen) and lift the affinity later (after the thread has done something and touched some memory). In this case Linux could (but probably will not easily) move the thread to another node. One could think about triggering this from a management app: If the app detects a congestion on one node, it could first lift the affinity restriction of some VCPU threads to achieve a better load balancing. If the situation persists (and doesn't turn out to be a short time peak), the manager could migrate the memory too and pin the VCPUs to the new node. I thought the migration and temporary un-pinning could be implemented in the monitor. > If you refactor the series so that the libnuma patch is the very last > one and submit to qemu-devel, I'll review and apply all of the first > patches. We can continue to discuss the last patch independently of the > first three if needed. Sounds like a plan. I will start with this and hope for some advice on the BOCHS BIOS issue. Thanks for your ideas! Regards, Andre. > > Andre Przywara wrote: >> Hi, >> >> this patch series introduces multiple NUMA nodes support within KVM >> guests. >> This is the second try incorporating several requests from the list: >> - use the QEMU firmware configuration interface instead of CMOS-RAM >> - detect presence of libnuma automatically, can be disabled with >> ./configure --disable-numa >> This only applies to the host side, the command line and guest (BIOS) >> side are always built and functional, although this configuration >> is only useful for research and debugging >> - use a more flexible command line interface allowing: >> - specifying the distribution of memory across the guest nodes: >> mem:1536M;512M >> - specifying the distribution of the CPUs: >> cpu:0-2;3 >> - specifying the host nodes the guest nodes should be pinned to: >> pin:3;2 >> All of these options are optional, in case of mem and cpu the >> resources are split equally across all guest nodes if omitted. Please >> note that at least in Linux SRAT takes precedence over E820, so the >> total usable memory will be the sum specified at the mem: option >> (although QEMU will still allocate the amount at -m). >> If pin: is omitted, the guest nodes will be pinned to those host nodes >> where the threads are happen to be scheduled at on start-up time. This >> requires the (v)getcpu (v)syscall to be usable, this is true for >> kernels up from 2.6.19 and glibc >= 2.6 (sched_getcpu()). I have a >> hack if glibc doesn't support this, tell me if you are interested. >> The only non-optional argument is the number of guest nodes, a >> possible command line looks like: >> -numa 3,mem:1024M;512M;512M,cpu:0-1;2;3 >> Please note that you have to quote the semicolons on the shell. >> >> The monitor command is left out for now and will be send later. >> >> Please apply. >> >> Regards, >> Andre. >> >> Signed-off-by: Andre Przywara <andre.przywara@amd.com> >> > > -- Andre Przywara AMD-OSRC (Dresden) Tel: x84917 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 15:22 ` Andre Przywara @ 2008-12-05 15:41 ` Anthony Liguori 2008-12-08 21:46 ` André Przywara 0 siblings, 1 reply; 10+ messages in thread From: Anthony Liguori @ 2008-12-05 15:41 UTC (permalink / raw) To: Andre Przywara; +Cc: Avi Kivity, kvm, Daniel P. Berrange Andre Przywara wrote: > Anthony, > >> This patch series needs to be posted to qemu-devel. I know qemu >> doesn't do true SMP yet, but it will in the relatively near future. >> Either way, some of the design points needs review from a larger >> audience than present on kvm-devel. > OK, I already started looking at that. The first patch applies with > only some fuzz, so no problems here. The second patch could be changed > to promote the values via the firmware configuration interface only, > leaving the host side pinning alone (which wouldn't make much sense > without true SMP anyway). > The third patch is actually BOCHS BIOS, and I am confused here: > I see the host side of the firmware config interface in QEMU SVN, but > neither in the BOCHS CVS nor in the qemu/pc-bios/bios.diff there is > any sign of usage from the BIOS side. Really? I assumed it was there. I'll look this afternoon and if it isn't, I'll apply those patches to bios.diff and update the bios. > Is the kvm-patched qemu the only user of the interface? If so I would > have to introduce the interface to QEMU's bios.diff (or better send to > bochs-developers?) > Do you know what BOCHS version the bios.diff applies against? Is that > the 2.3.7 release? Unfortunately, we don't track what version of the BOCHS BIOS is in the tree. Usually, it's a SVN snapshot. I'm going to change this the next time I update the BIOS though. >> I'm not a big fan of the libnuma dependency. I'll willing to concede >> this if there's a wide agreement that we should support this directly >> in QEMU. > As long as QEMU is not true SMP, libnuma is rather useless. One could > pin the memory to the appropriate host nodes, but without the proper > scheduling this doesn't make much sense. And rescheduling the qemu > process each time a new VCPU is scheduled doesn't seem so smart, either. Even if it's not useful, I'd still like to add it to QEMU. That's one less thing that has to be merged from KVM into QEMU. >> I don't think there's such a thing as a casual NUMA user. The >> default NUMA policy in Linux is node-local memory. As long as a VM >> is smaller than a single node, everything will work out fine. > Almost right, but simply calling qemu-system-x86_64 can lead to bad > situations. I lately saw that VCPU #0 was scheduled on one node and > VCPU #1 on another. This leads to random (probably excessive) remote > accesses from the VCPUs, since the guest assumes uniform memory That seems like Linux is behaving badly, no? Can you describe the situation more? > Of course one could cure this small guest case with numactl, but in my > experience the existence of this tool isn't as well-known as one would > expect. NUMA systems are expensive. If a customer cares about performance (as opposed to just getting more memory), then I think tools like numactl are pretty well known. >> >> In the event that the VM is larger than a single node, if a user is >> creating it via qemu-system-x86_64, they're going to either not care >> at all about NUMA, or be familiar enough with the numactl tools that >> they'll probably just want to use that. Once you've got your head >> around the fact that VCPUs are just threads and the memory is just a >> shared memory segment, any knowledgable sysadmin will have no problem >> doing whatever sort of NUMA layout they want. > Really? How do you want to assign certain _parts_ of guest memory with > numactl? (Let alone the rather weird way of using -mempath, which is > much easier done within QEMU). I don't think -mem-path is weird at all. In fact, I'd be inclined to use shared memory by default and create a temporary file name. Then provide a monitor interface to lookup that file name so that an explicit -mem-path isn't required anymore. > The same applies to the threads. You can assign _all_ the threads to > certain nodes, but pinning single threads only requires some tedious > work (QEMU monitor or top, then taskset -p). Isn't that OK if qemu > would do this automatically (or at least give some support here)? Most VMs are going to be created through management tools so I don't think it's an issue. I'd rather provide the best mechanisms for management tools to have the most flexibility. >> The other case is where management tools are creating VMs. In this >> case, it's probably better to use numactl as an external tool because >> then it keeps things consistent wrt CPU pinning. >> >> There's also a good argument for not introducing CPU pinning directly >> to QEMU. There are multiple ways to effectively do CPU pinning. You >> can use taskset, you can use cpusets or even something like libcgroup. > I agree that pinning isn't the last word on the subject, but it works > pretty well. But I wouldn't load the admin with the burden of pinning, > but let this be done by QEMU/KVM. Maybe one could introduce a way to > tell QEMU/KVM to not pin the threads. This is where things start to get ugly... > I also had the idea to start with some sort of pinning (either > automatically or user-chosen) and lift the affinity later (after the > thread has done something and touched some memory). In this case Linux > could (but probably will not easily) move the thread to another node. > One could think about triggering this from a management app: If the > app detects a congestion on one node, it could first lift the affinity > restriction of some VCPU threads to achieve a better load balancing. > If the situation persists (and doesn't turn out to be a short time > peak), the manager could migrate the memory too and pin the VCPUs to > the new node. I thought the migration and temporary un-pinning could > be implemented in the monitor. The other issue with pinning is what happens after live migration? What about single-machine load balancing? Regardless of whether we bake in libnuma control or not, I think an interface on the command line is not terribly interesting because it's too static. I think a monitor interface is what we'd really want if we integrated with libnuma. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 15:41 ` Anthony Liguori @ 2008-12-08 21:46 ` André Przywara 2008-12-08 22:01 ` Anthony Liguori 2008-12-09 14:24 ` Avi Kivity 0 siblings, 2 replies; 10+ messages in thread From: André Przywara @ 2008-12-08 21:46 UTC (permalink / raw) To: Anthony Liguori; +Cc: Avi Kivity, kvm Hi Anthony, >>... >> The third patch is actually BOCHS BIOS, and I am confused here: >> I see the host side of the firmware config interface in QEMU SVN, but >> neither in the BOCHS CVS nor in the qemu/pc-bios/bios.diff there is >> any sign of usage from the BIOS side. > Really? I assumed it was there. I'll look this afternoon and if it > isn't, I'll apply those patches to bios.diff and update the bios. I was partly wrong, the code is in BOCHS CVS, but not in qemu. It wasn't in BOCHS 2.3.7 release, which qemu is currently based on. Could you pull the latest BIOS code from BOCHS CVS to qemu? This would give us the firmware interface for free and I could more easily port my patches. >>> I'm not a big fan of the libnuma dependency. I'll willing to concede >>> this if there's a wide agreement that we should support this directly >>> in QEMU. What's actually bothering you with libnuma dependency? I could directly use the Linux mbind syscall, but I think using a library is more sane (and probably more portable). >> As long as QEMU is not true SMP, libnuma is rather useless.... > Even if it's not useful, I'd still like to add it to QEMU. That's one > less thing that has to be merged from KVM into QEMU. OK, but since QEMU is portable, I have to use libnuma (and a configure check). If there is no libnuma (and no Linux), host pinning is disabled and you actually don't loose anything. Other QEMU host OSes could be added later (Solaris comes to mind). I would try to assign guest memory to different nodes. Although this doesn't help QEMU, this should be the same code as in KVM, so more easily mergeable. Since there are no threads (and no CPUState->threadid) I cannot add VCPU pinning here, but that is not a great loss. >> Almost right, but simply calling qemu-system-x86_64 can lead to bad >> situations. I lately saw that VCPU #0 was scheduled on one node and >> VCPU #1 on another. This leads to random (probably excessive) remote >> accesses from the VCPUs, since the guest assumes uniform memory > That seems like Linux is behaving badly, no? Can you describe the > situation more? That is just my observation. I have to do more research to get a decent explanation, but I think the problem is that in this early state the threads barely touch any memory, so Linux tries to distribute them as best as possible. Just a quick run on a quad node machine with 16 cores in total: qemu-system-x86_64 -smp 4 -S: VCPUs running on pCPUs: 5,9,13,5 after continue in the monitor: 5,9,10,6: VCPU 2 changed the node after booting has finished: 5,1,11,6: VCPU 1 changed the node copying a file over the network: 7,5,11,6: VCPU 1 changed the node again some load on the host, guest idle: 5,4,1,7: VCPU 2 changed the node starting bunzipping: 1,4,2,7: VCPU 0 changed the node bunzipping ended: 7,1,2,4: VCPU 0 and 1 changed the node make -j8 on /dev/shm: 1,2,3,4: VCPU 0 changed the node You see that Linux happily changes the assignments and even nodes, let alone the rather arbitrary assignment at the beginning. After some load (at the end) the scheduling comes closer to a single node, but the memory was actually splitted between node0 and node1 (plus a few thousand pages on node 2 & 3). > NUMA systems are expensive. If a customer cares about performance (as > opposed to just getting more memory), then I think tools like numactl > are pretty well known. Well, expensive depends, especially if I think of your employer ;-) In fact every AMD dual socket server is NUMA, and Intel will join the game next year. >> ... >> Really? How do you want to assign certain _parts_ of guest memory with >> numactl? (Let alone the rather weird way of using -mempath, which is >> much easier done within QEMU). > I don't think -mem-path is weird at all. In fact, I'd be inclined to > use shared memory by default and create a temporary file name. Then > provide a monitor interface to lookup that file name so that an explicit > -mem-path isn't required anymore. I didn't wanted to decry -mempath, what I meant was that the way of accomplishing a NUMA aware setup with -mempath seems to me quite complicated. Why not use a rather fool-proof way within QEMU? >> ... >> But I wouldn't load the admin with the burden of pinning, >> but let this be done by QEMU/KVM. Maybe one could introduce a way to >> tell QEMU/KVM to not pin the threads. > This is where things start to get ugly... Why? qemu-system-x86_64 -numa 2,pin:none and then use whatever method you prefer (taskset, monitor) to pin the VCPUs (or left them unpinned). > The other issue with pinning is what happens after live migration? What > about single-machine load balancing? Regardless of whether we bake in > libnuma control or not, I think an interface on the command line is not > terribly interesting because it's too static. I agree, but only with regards to the pinning mechanism. AFAIK the NUMA topology itself (CPU->nodes, mem->nodes) is quite static (due to it's ACPI based nature). > I think a monitor > interface is what we'd really want if we integrated with libnuma. OK, I will implement a monitor interface with emphasis on pinning to host nodes. What about this: > info numa 2 nodes node 0 cpus: 0 1 2 node 0 size: 1536 MB node 0 host: 2 node 1 cpus: 3 node 1 size: 512 MB node 1 host: * // similar to numactl --hardware, * means all nodes (no pinning) > numa pin:0;3 // static pinning: guest 0 -> host 0, guest 1 -> host 3 > numa pin:*; // guest node 0 -> all nodes, guest node 1: keep as it is // or maybe: numa pin:0-3; > numa migrate:1;2 // like pin, but moving all the memory, too Additionally one could use some kind of home node, so one temporarily could change the VCPUs affinity and later return to the optimal affinity (where the memory is located) without specifying it again. Comments are welcome. Regards, Andre. -- Andre Przywara AMD-Operating System Research Center (OSRC), Dresden, Germany Tel: +49 351 277-84917 ----to satisfy European Law for business letters: AMD Saxony Limited Liability Company & Co. KG, Wilschdorfer Landstr. 101, 01109 Dresden, Germany Register Court Dresden: HRA 4896, General Partner authorized to represent: AMD Saxony LLC (Wilmington, Delaware, US) General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-08 21:46 ` André Przywara @ 2008-12-08 22:01 ` Anthony Liguori 2008-12-09 14:24 ` Avi Kivity 1 sibling, 0 replies; 10+ messages in thread From: Anthony Liguori @ 2008-12-08 22:01 UTC (permalink / raw) To: André Przywara; +Cc: Avi Kivity, kvm André Przywara wrote: > I was partly wrong, the code is in BOCHS CVS, but not in qemu. It wasn't > in BOCHS 2.3.7 release, which qemu is currently based on. Could you pull > the latest BIOS code from BOCHS CVS to qemu? This would give us the > firmware interface for free and I could more easily port my patches. Working on that right now. BOCHS CVS has diverged a fair bit from what we have so I'm adjusting our current patches and doing regression testing. > What's actually bothering you with libnuma dependency? I > could directly use the Linux mbind syscall, but I think using a library > is more sane (and probably more portable). You're making a default policy decision (pin nodes and pin cpus). Your assuming that Linux will do the wrong thing by default and that the decision we'll be making is better. That policy decision requires more validation. We need benchmarks showing what the perf is like when not pinning vs pinning and we need to understand whether the bad performance is a Linux bug that can be fixed or whether it's something fundamental. What I'm concerned about, is that it'll make the default situation worse. I advocated punting to management tools because that at least gives the user the ability to make their own decisions which means you don't have to prove that this is the correct default decision. I don't care about a libnuma dependency. Library dependencies are fine as long as they're optional. >>> Almost right, but simply calling qemu-system-x86_64 can lead to bad >>> situations. I lately saw that VCPU #0 was scheduled on one node and >>> VCPU #1 on another. This leads to random (probably excessive) remote >>> accesses from the VCPUs, since the guest assumes uniform memory >> That seems like Linux is behaving badly, no? Can you describe the >> situation more? > That is just my observation. I have to do more research to get a decent > explanation, but I think the problem is that in this early state the > threads barely touch any memory, so Linux tries to distribute them as > best as possible. Just a quick run on a quad node machine with 16 cores > in total: How does memory migration fit into all of this though? Statistically speaking, if your NUMA guest is behaving well, it should be easy to recognize the groupings and perform the appropriate page migration. I would think even the most naive page migration tool would be able to do the right thing. >> NUMA systems are expensive. If a customer cares about performance >> (as opposed to just getting more memory), then I think tools like >> numactl are pretty well known. > Well, expensive depends, especially if I think of your employer ;-) In > fact every AMD dual socket server is NUMA, and Intel will join the > game next year. But the NUMA characteristics on an AMD system are relatively minor. I doubt that doing static pinning would be what most users wanted since it could reduce overall system performance noticably. Even with more traditional NUMA systems, the cost of remote memory access is often lost by the opportunity cost of leaving a CPU idle. That's what pinning does, it leaves CPUs potentially idle. > Additionally one could use some kind of home node, so one temporarily > could change the VCPUs affinity and later return to the optimal > affinity (where the memory is located) without specifying it again. Please resubmit with the first three patches in the front. I don't think exposing NUMA attributes to a guest is at all controversial so that's relatively easy to apply. I'm not saying that the last patch can't be applied, but I don't think it's as obvious that it's going to be a win when you start doing performance tests. Regards, Anthony Liguori > Comments are welcome. > > Regards, > Andre. > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-08 21:46 ` André Przywara 2008-12-08 22:01 ` Anthony Liguori @ 2008-12-09 14:24 ` Avi Kivity 2008-12-09 14:55 ` Anthony Liguori 1 sibling, 1 reply; 10+ messages in thread From: Avi Kivity @ 2008-12-09 14:24 UTC (permalink / raw) To: André Przywara; +Cc: Anthony Liguori, kvm André Przywara wrote: >>> But I wouldn't load the admin with the burden of pinning, but let >>> this be done by QEMU/KVM. Maybe one could introduce a way to tell >>> QEMU/KVM to not pin the threads. >> This is where things start to get ugly... > Why? qemu-system-x86_64 -numa 2,pin:none and then use whatever method > you prefer (taskset, monitor) to pin the VCPUs (or left them unpinned). I agree that for e.g. -numa 2, no host binding should occur. Pinning memory or cpus to nodes should only occur if the user explicitly requested it. Otherwise we run the risk of breaking load balancing. If the user chooses to pin, the responsibility is on them. If not, we should allow the host to do its thing. > // similar to numactl --hardware, * means all nodes (no pinning) > > numa pin:0;3 > // static pinning: guest 0 -> host 0, guest 1 -> host 3 > > numa pin:*; > // guest node 0 -> all nodes, guest node 1: keep as it is > // or maybe: numa pin:0-3; > > numa migrate:1;2 I suggest using exactly the same syntax as the command line option. Qemu would compute the difference between the current configuration and the desired configuration and migrate vcpus and memory as needed. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-09 14:24 ` Avi Kivity @ 2008-12-09 14:55 ` Anthony Liguori 0 siblings, 0 replies; 10+ messages in thread From: Anthony Liguori @ 2008-12-09 14:55 UTC (permalink / raw) To: Avi Kivity; +Cc: André Przywara, kvm Avi Kivity wrote: > André Przywara wrote: >>>> But I wouldn't load the admin with the burden of pinning, but let >>>> this be done by QEMU/KVM. Maybe one could introduce a way to tell >>>> QEMU/KVM to not pin the threads. >>> This is where things start to get ugly... >> Why? qemu-system-x86_64 -numa 2,pin:none and then use whatever method >> you prefer (taskset, monitor) to pin the VCPUs (or left them unpinned). > > I agree that for e.g. -numa 2, no host binding should occur. Pinning > memory or cpus to nodes should only occur if the user explicitly > requested it. Otherwise we run the risk of breaking load balancing. > > If the user chooses to pin, the responsibility is on them. If not, we > should allow the host to do its thing. Agreed. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 14:28 ` Anthony Liguori 2008-12-05 15:22 ` Andre Przywara @ 2008-12-05 15:27 ` Avi Kivity 2008-12-05 15:34 ` Anthony Liguori 1 sibling, 1 reply; 10+ messages in thread From: Avi Kivity @ 2008-12-05 15:27 UTC (permalink / raw) To: Anthony Liguori; +Cc: Andre Przywara, kvm, Daniel P. Berrange Anthony Liguori wrote: > > In the event that the VM is larger than a single node, if a user is > creating it via qemu-system-x86_64, they're going to either not care > at all about NUMA, or be familiar enough with the numactl tools that > they'll probably just want to use that. Once you've got your head > around the fact that VCPUs are just threads and the memory is just a > shared memory segment, any knowledgable sysadmin will have no problem > doing whatever sort of NUMA layout they want. > The vast majority of production VMs will be created by management tools. > The other case is where management tools are creating VMs. In this > case, it's probably better to use numactl as an external tool because > then it keeps things consistent wrt CPU pinning. > > There's also a good argument for not introducing CPU pinning directly > to QEMU. There are multiple ways to effectively do CPU pinning. You > can use taskset, you can use cpusets or even something like libcgroup. > > If you refactor the series so that the libnuma patch is the very last > one and submit to qemu-devel, I'll review and apply all of the first > patches. We can continue to discuss the last patch independently of > the first three if needed. We need libnuma integrated in qemu. Using numactl outside of qemu means we need to start exposing more and more qemu internals (vcpu->thread mapping, memory in /dev/shm, phys_addr->ram_addr mapping) and lose out on optimization opportunities (having multiple numa-aware iothreads, numa-aware kvm mmu). It also means we cause duplication of the numa logic in management tools instead of consolidation in qemu. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests 2008-12-05 15:27 ` Avi Kivity @ 2008-12-05 15:34 ` Anthony Liguori 0 siblings, 0 replies; 10+ messages in thread From: Anthony Liguori @ 2008-12-05 15:34 UTC (permalink / raw) To: Avi Kivity; +Cc: Andre Przywara, kvm, Daniel P. Berrange Avi Kivity wrote: > Anthony Liguori wrote: >> >> In the event that the VM is larger than a single node, if a user is >> creating it via qemu-system-x86_64, they're going to either not care >> at all about NUMA, or be familiar enough with the numactl tools that >> they'll probably just want to use that. Once you've got your head >> around the fact that VCPUs are just threads and the memory is just a >> shared memory segment, any knowledgable sysadmin will have no problem >> doing whatever sort of NUMA layout they want. >> > > The vast majority of production VMs will be created by management tools. I agree. > We need libnuma integrated in qemu. Using numactl outside of qemu > means we need to start exposing more and more qemu internals > (vcpu->thread mapping, memory in /dev/shm, phys_addr->ram_addr > mapping) and lose out on optimization opportunities (having multiple > numa-aware iothreads, numa-aware kvm mmu). It also means we cause > duplication of the numa logic in management tools instead of > consolidation in qemu. I think it's the opposite. Integrating libnuma in QEMU means duplication of numactl functionality in QEMU. What you'd really want, I think, is to be able to use numactl but say -qemu-guest-memory-offset 1G -qemu-guest-memory-size 1G. The /dev/shm approximates that pretty well. Also, the current patches don't do the most useful thing, they don't use provide an interface for dynamically changing numa attributes. But, as I said, if there's agreement that we should bake this into QEMU, then so be it. But let's make this a separate conversation than the rest of the patches. Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-12-09 14:55 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-05 13:29 [PATCH 0/3] v2: KVM-userspace: add NUMA support for guests Andre Przywara 2008-12-05 14:28 ` Anthony Liguori 2008-12-05 15:22 ` Andre Przywara 2008-12-05 15:41 ` Anthony Liguori 2008-12-08 21:46 ` André Przywara 2008-12-08 22:01 ` Anthony Liguori 2008-12-09 14:24 ` Avi Kivity 2008-12-09 14:55 ` Anthony Liguori 2008-12-05 15:27 ` Avi Kivity 2008-12-05 15:34 ` Anthony Liguori
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).