Re: numa_alloc_onnode does not allocate on node passed as argument

Elena Ufimtseva <[email protected]> Thu, 30 Oct 2014 00:33:02 -0400
Newsgroups org.kernel.vger.linux-numa
Message-ID <CAEr7rXjJQUEQOL3re1G7JbaktZnF3Nqr6ZeTrNaLotAeuMC5Lg@mail.gmail.com>
Hello Andres

I looked at the example you gave, had multiple variations running and
have same strange results.
The default local policy should be in use when there is no other policy=
 defined.
The only thing what comes to my mind its the shared library libnuma
which has its data on different node then the node I try to run
the test process on.
Can you take a look and check what node is used by libnuma in
/proc/pid/numa_maps?

I will keep searching for an answer, its rather interesting topic.
Or maybe someone else will give more details on this.

Thank you!


On Thu, Oct 23, 2014 at 1:17 PM, Andres N=C3=B6tzli <[email protected]=
du> wrote:
> Hi Elena,
>
> That would be great! I created a gist with the kernel config (cat /bo=
ot/config-$(uname -r)): https://gist.github.com/4tXJ7f/408a562abe5d4f28=
656d
>
> Please let me know if you need anything else.
>
> Thank you very much,
> Andres
>
>> On 23 Oct 2014, at 06:15, Elena Ufimtseva <[email protected]> wrot=
e:
>>
>> Hi Andres
>>
>> I will poke around this on the weekend on my NUMA machine.
>> Can you also attach your kernel config please?
>>
>> Thank you.
>>
>> On Wed, Oct 22, 2014 at 12:40 PM, Andres N=C3=B6tzli <noetzli@stanfo=
rd.edu> wrote:
>>> Hi Elena,
>>>
>>> Thank you very much for your quick reply! numa_set_strict(1) and nu=
ma_set_strict(0) both result in the wrong output. I did not change the =
default policy.
>>>
>>> numa_get_membind returns 1 for all nodes before and after numa_run_=
on_node.
>>> numa_get_interleave_mask returns 0 for all nodes.
>>> numa_get_run_node_mask is all 1s before and 0010 after numa_run_on_=
node.
>>>
>>> The machine config (the CPUs are all Intel(R) Xeon(R) CPU E5-4657L =
v2 @ 2.40GHz):
>>>
>>> $ numactl --hardware
>>> available: 4 nodes (0-3)
>>> node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 48 49 50 51 52 53 54 55 56 5=
7 58 59
>>> node 0 size: 262093 MB
>>> node 0 free: 966 MB
>>> node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 60 61 62 63 64 65 =
66 67 68 69 70 71
>>> node 1 size: 262144 MB
>>> node 1 free: 82 MB
>>> node 2 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 72 73 74 75 76 77 =
78 79 80 81 82 83
>>> node 2 size: 262144 MB
>>> node 2 free: 102 MB
>>> node 3 cpus: 36 37 38 39 40 41 42 43 44 45 46 47 84 85 86 87 88 89 =
90 91 92 93 94 95
>>> node 3 size: 262144 MB
>>> node 3 free: 113 MB
>>> node distances:
>>> node   0   1   2   3
>>>  0:  10  20  30  20
>>>  1:  20  10  20  30
>>>  2:  30  20  10  20
>>>  3:  20  30  20  10
>>>
>>> Thanks again,
>>> Andres
>>>
>>>> On 22 Oct 2014, at 06:12, Elena Ufimtseva <[email protected]> wr=
ote:
>>>>
>>>> On Tue, Oct 21, 2014 at 11:47 PM, Andres N=C3=B6tzli <noetzli@stan=
ford.edu> wrote:
>>>>> Hi everyone,
>>>>>
>>>>> I am experiencing a weird problem. When using numa_alloc_onnode r=
epeatedly to allocate memory, it does not allocate memory on the node p=
assed as an argument.
>>>>>
>>>>> Sample code:
>>>>> #include <numa.h>
>>>>> #include <numaif.h>
>>>>> #include <iostream>
>>>>> using namespace std;
>>>>>
>>>>> void find_memory_node_for_addr(void* ptr) {
>>>>>  int numa_node =3D -1;
>>>>>  if(get_mempolicy(&numa_node, NULL, 0, ptr, MPOL_F_NODE | MPOL_F_=
ADDR) < 0)
>>>>>     cout << "WARNING: get_mempolicy failed" << endl;
>>>>>  cout << numa_node << endl;
>>>>> }
>>>>>
>>>>> int main() {
>>>>>  int64_t* x;
>>>>>  int64_t n =3D 5000;
>>>>>  //numa_set_preferred(1);
>>>>>
>>>>>  numa_run_on_node(2);
>>>>>  for(int i =3D 0; i < 20; i++) {
>>>>>     size_t s =3D n * sizeof(int64_t);
>>>>>     x =3D (int64_t*)numa_alloc_onnode(s, 1);
>>>>>     for(int j =3D 0; j < n; j++)
>>>>>        x[j] =3D j + i;
>>>>>     find_memory_node_for_addr(x);
>>>>>  }
>>>>>
>>>>>  return 0;
>>>>> }
>>>>>
>>>>> Output:
>>>>> 1
>>>>> 1
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>> 1
>>>>> 2
>>>>>
>>>>> When uncommenting the line "numa_set_preferred(1);=E2=80=9D, the =
output is all 1s as expected. Am I doing something wrong? Have you seen=
 similar issues?
>>>>>
>>>>> I am running Ubuntu 12.04.5 LTS:
>>>>> $ cat /proc/version
>>>>> Linux version 3.2.0-29-generic (buildd@allspice) (gcc version 4.6=
=2E3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #46-Ubuntu SMP Fri Jul 27 17:03:2=
3 UTC 2012
>>>>>
>>>>> I am using libnuma 2.0.10 but I=E2=80=99ve had the same problem w=
ith 2.0.8~rc3-1.
>>>>>
>>>>> Thank you very much,
>>>>> Andres
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe linux-n=
uma" in
>>>>> the body of a message to [email protected]
>>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.htm=
l
>>>>
>>>> Hi Andres
>>>>
>>>> Can you try to use strict policy by calling numa_set_strict?
>>>>
>>>> If you comment out setting the preferred node, the default policy =
is
>>>> in action (I assume you did no change it, not for the process, not
>>>> system wide) which is preferred also.
>>>> But here you set preferred to a specific node and manual says, the
>>>> default for process is to allocate on the node it runs.
>>>> So I wonder what is the cpu affinity for this process looks like..=
=2E
>>>> Also maybe just to confirm you can check the policy from within yo=
ur
>>>> running code?
>>>>
>>>> Can you also post the machine NUMA config?
>>>>
>>>> --
>>>> Elena
>>>
>>>
>>
>>
>>
>> --
>> Elena
>
>



--=20
Elena