लिनक्स में, मैं केवीएम वर्चुअल मशीन के मेमोरी पेज को एक NUMA नोड से दूसरे NUMA नोड पर रनटाइम पर माइग्रेट करना चाहता हूं। लेकिन मुझे केवीएम हाइपरवाइजर या libvirt API का उपयोग करने के लिए कोई इंटरफेस नहीं मिला। तब मैंने numa_migrate_pages
फ़ंक्शन का उपयोग करने का प्रयास किया -lnuma
, और VM प्रक्रिया के मेमोरी पेजों को माइग्रेट किया। लेकिन मैंने पाया कि numa_migrate_pages
फ़ंक्शन केवल कुछ पृष्ठों को स्थानांतरित कर सकता है, यह सभी पृष्ठों को स्थानांतरित नहीं कर सकता है। उदाहरण के लिए, नीचे दिया गया पाठ इस वीएम प्रक्रिया के मेमोरी पेज वितरण को दिखाता है:
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 में माइग्रेट नहीं किए जा सकते? यहाँ क्या समस्या है?