한 NUMA 노드에서 다른 노드로 프로세스의 모든 메모리 페이지를 마이그레이션하는 방법은 무엇입니까?

한 NUMA 노드에서 다른 노드로 프로세스의 모든 메모리 페이지를 마이그레이션하는 방법은 무엇입니까?

Linux에서는 런타임 시 KVM 가상 머신의 메모리 페이지를 한 NUMA 노드에서 다른 노드로 마이그레이션하고 싶습니다. 하지만 KVM 하이퍼바이저나 libvirt API를 사용하여 이 작업을 수행할 수 있는 인터페이스를 찾을 수 없습니다. 그런 다음 VM 프로세스의 메모리 페이지 numa_migrate_pages에서 기능을 사용하고 마이그레이션해 보았습니다 . 하지만 이 기능은 전체 페이지가 아닌 일부 페이지만 마이그레이션할 수 있다는 -lnuma것을 발견했습니다 . numa_migrate_pages예를 들어 다음 텍스트는 이 VM 프로세스의 메모리 페이지 배포를 보여줍니다.

Node0:  0             pages
Node1:  1538          pages
Node2:  270641        pages
Node3:  552           pages

Node2의 모든 페이지를 Node0으로 마이그레이션하고 싶습니다. 그러나 이 기능을 사용한 후에는 numa_migrate_pages아래와 같이 일부 페이지만 마이그레이션됩니다.

Node0:  7952          pages
Node1:  1538          pages
Node2:  262113        pages
Node3:  552           pages

그런 다음 파일을 열었고 Node2에 남아 있는 대부분의 페이지가 익명 페이지와 더티 페이지라는 것을 발견했습니다./proc/[pid of VM process]/numa_maps

7f572c000000 default anon=262143 dirty=262143 N2=262113 ...

그렇다면 Node2의 모든 페이지를 Node0으로 마이그레이션할 수 없는 이유는 무엇입니까? 여기서 문제가 무엇입니까?

답변1

migratepages패키지 에 바이너리가 필요합니다 numactl.

사용법 및 예시

sudo migratepages $VM_PID $SRC_NODE $DEST_NODE
sudo migratepages 12345 2 0

한정

가상 머신 하드웨어

페이지는 노드에 잠길 수 있습니다. 하드웨어 패스스루와 관련되어 있고 특정 노드에 있는 하드웨어를 나타내는 경우.

사용 가능한 메모리 및 페이지 크기

분명히 대상 노드에 사용 가능한 메모리가 충분해야 하지만 큰 페이지를 이동하기에는 너무 조각화되어서도 안 됩니다. 페이지 중 하나가 대규모 순차 할당이고 대상 노드의 사용 가능한 메모리에 여유 공간이 충분하지 않은 경우 대규모 페이지 이동이 실패할 수 있습니다(트리거링 및 성공적인 압축에 따라 다름).

관련 정보