Ευαισθητοποίηση NUMA και CPU Pinning για αποκλειστικούς διακομιστές
16 λεπτά ανάγνωσης - 16 Ιουνίου 2026

Πώς να ελέγξετε την τοπολογία NUMA και να αντιστοιχίσετε τα φορτία εργασίας του Linux στους σωστούς πυρήνες και τη μνήμη. Καλύπτει τα numactl, taskset, systemd, τις ρυθμίσεις BIOS και τις στρατηγικές για συγκεκριμένα φορτία εργασίας.
Γνώση NUMA και CPU pinning για αποκλειστικούς διακομιστές
Σε οποιονδήποτε διακομιστή πολλαπλών υποδοχών, το πού εκτελείται μια διαδικασία και πού βρίσκεται η μνήμη της είναι δύο διαφορετικά ζητήματα, και η αποσυγχρονισή τους είναι ένας από τους ευκολότερους τρόπους για να χαθεί απόδοση. Η γνώση του NUMA και το CPU pinning είναι οι δύο ρυθμιστές που διορθώνουν αυτό το πρόβλημα. Αυτή η ανάρτηση καλύπτει τον τρόπο λειτουργίας του NUMA, τον τρόπο ελέγχου του σε Linux και τον τρόπο σωστής αντιστοίχισης φόρτων εργασίας για βάσεις δεδομένων, εκπαίδευση τεχνητής νοημοσύνης και υπηρεσίες ευαίσθητες στην καθυστέρηση.
Πώς λειτουργεί το NUMA σε διακομιστές πολλαπλών υποδοχών
Ένας κόμβος NUMA (Non-Uniform Memory Access) είναι μια ομάδα πυρήνων CPU συνδεδεμένων με ένα τοπικό μπλοκ μνήμης RAM μέσω ενός αποκλειστικού ελεγκτή μνήμης. Σε έναν διακομιστή δύο υποδοχών συνήθως υπάρχουν δύο κόμβοι. Οποιοσδήποτε πυρήνας μπορεί να διαβάσει οποιαδήποτε διεύθυνση, αλλά η τοπική πρόσβαση είναι περίπου 80 ns, ενώ μια δια-υποδοχική μετάβαση μέσω του UPI της Intel ή του Infinity Fabric της AMD είναι περίπου 130–150 ns. Σε μεγαλύτερα συστήματα με περισσότερες υποδοχές, ο κόμβος στη χειρότερη περίπτωση μπορεί να ξεπεράσει τα 250 ns.
Το εύρος ζώνης ακολουθεί το ίδιο μοτίβο. Ένα σύστημα Sapphire Rapids με δύο υποδοχές μπορεί να διατηρήσει περίπου 600 GB/s όταν οι πυρήνες προσπελάζουν την τοπική μνήμη, αλλά η σύνδεση μεταξύ των υποδοχών είναι ένα κλάσμα αυτού, οπότε η κίνηση που τη διασχίζει δημιουργεί γρήγορα σημεία συμφόρησης. Οι επεξεργαστές με πολλούς πυρήνες κάνουν αυτό το φαινόμενο πιο λεπτομερές: το Sub-NUMA Clustering (SNC) της Intel και το Nodes Per Socket (NPS) της AMD χωρίζουν κάθε υποδοχή σε πολλαπλούς τομείς NUMA, οπότε ένα κουτί «δύο υποδοχών» μπορεί εύκολα να παρουσιάσει τέσσερις ή οκτώ κόμβους στο Linux.
Χωρίς αναγνώριση NUMA, ο προγραμματιστής του Linux θα μεταφέρει ευχαρίστως ένα νήμα μεταξύ των υποδοχών, ενώ το σύνολο εργασίας του παραμένει στον αρχικό κόμβο. Κάθε επόμενη πρόσβαση γίνεται απομακρυσμένη. Το ορατό σύμπτωμα είναι η υψηλή χρήση της CPU με χαμηλή πραγματική απόδοση, επειδή οι πυρήνες ξοδεύουν το χρόνο τους περιμένοντας τη μνήμη. Οι συσκευές I/O επιδεινώνουν αυτό το φαινόμενο. Μια GPU ή μια κάρτα δικτύου (NIC) είναι συνδεδεμένη σε μια συγκεκριμένη ρίζα PCIe, η οποία ανήκει σε έναν κόμβο NUMA. Εάν η διαδικασία που την τροφοδοτεί εκτελείται στην άλλη υποδοχή, κάθε μεταφορά DMA διασχίζει τη διασύνδεση.
Επιθεώρηση της τοπολογίας NUMA σε Linux
Τέσσερα εργαλεία καλύπτουν σχεδόν όλα όσα χρειάζεστε:
lscpuγια μια γρήγορη σύνοψη των socket και των κόμβων.numactl --hardwareγια τα συνολικά μεγέθη μνήμης των κόμβων και τον πίνακα αποστάσεων μεταξύ κόμβων.numastatγια μετρητές επιτυχιών/αποτυχιών ανά διαδικασία.lstopo(από το hwloc) για την ιεραρχία της κρυφής μνήμης και την τοπικότητα των συσκευών PCIe.
Ξεκινήστε με numactl --hardware. Παραθέτει κάθε κόμβο, τους πυρήνες και τη μνήμη που του ανήκουν, καθώς και τον πίνακα αποστάσεων. Η τιμή 10 είναι τοπική, ενώ 20+ είναι απομακρυσμένη. Αν δείτε έναν μόνο κόμβο σε ένα σύστημα πολλαπλών υποδοχών, το BIOS σας έχει ενεργοποιημένη τη λειτουργία Node Interleaving και κρύβει την τοπολογία, διορθώστε το πρώτα (βλ. παρακάτω).
Για μια συγκεκριμένη διεργασία, numastat -p <PID> αναλύει πού έχει πραγματικά κατανεμηθεί η μνήμη της. Τέσσερις μετρητές έχουν σημασία:
numa_hit: μνήμη που έχει κατανεμηθεί στον προοριζόμενο κόμβο. Θέλετε αυτή η τιμή να είναι υψηλή.numa_miss: ο προοριζόμενος κόμβος ήταν γεμάτος, η κατανομή μεταφέρθηκε αλλού.numa_foreign: ένας άλλος κόμβος προσπάθησε να εκχωρήσει τοπικά και δεν μπόρεσε, υποδηλώνει πίεση μνήμης.other_node: σελίδες που έχουν κατανεμηθεί σε κόμβο διαφορετικό από αυτόν όπου εκτελείται η διαδικασία. Οι υψηλές τιμές εδώ είναι το κλασικό σημάδι κακής στερέωσης.
Για φόρτους εργασίας GPU ή NIC, εκτελέστε lstopo-no-graphics και δείτε σε ποιον κόμβο NUMA είναι συνδεδεμένη κάθε συσκευή PCIe. Εάν οι πυρήνες που οδηγούν τη συσκευή βρίσκονται στον άλλο κόμβο, αυτό είναι το πρώτο πράγμα που πρέπει να διορθώσετε.
Πολιτικές CPU pinning και μνήμης
Το CPU pinning (ή CPU affinity) συνδέει μια διαδικασία με συγκεκριμένους πυρήνες, ώστε ο προγραμματιστής να μην μπορεί να τη μεταφέρει. Αυτό από μόνο του δεν αρκεί, επειδή το Linux χρησιμοποιεί μια πολιτική μνήμης first-touch από προεπιλογή: οι σελίδες κατανέμονται στον κόμβο που γράφει πρώτος σε αυτές. Εάν ένα νήμα ξεκινήσει στον λάθος κόμβο πριν καρφωθεί, η μνήμη του παραμένει εκεί. Πρέπει να ελέγχετε ταυτόχρονα τόσο την τοποθέτηση όσο και την κατανομή.
Τρία εργαλεία καλύπτουν τις συνήθεις περιπτώσεις:
| Εργαλείο | Λειτουργίες | Χρήση για |
|---|---|---|
taskset | Μόνο πυρήνες CPU | Γρήγορη εφάπαξ σύνδεση μιας υπάρχουσας διεργασίας |
numactl | Πυρήνες CPU και μνήμη | Εκκίνηση φόρτων εργασίας με αυστηρή τοπικότητα |
| systemd | Πυρήνες CPU και μνήμη, μόνιμη | Υπηρεσίες που χρειάζονται σταθεροποίηση κατά τις επανεκκινήσεις |
numactl υποστηρίζει τέσσερις πολιτικές μνήμης:
--membind=N: εκχώρηση μόνο στον κόμβο N, αποτυχία αν είναι γεμάτος.--preferred=N: προτίμηση στον κόμβο N, επιστροφή σε άλλους αν χρειαστεί.--interleave=all: κυκλική κατανομή μεταξύ των κόμβων για ομοιόμορφη κατανομή εύρους ζώνης.--localalloc: εκχώρηση στον κόμβο στον οποίο βρίσκεται η CPU που εκτελείται.
Καθορισμός ενός φόρτου εργασίας σε έναν κόμβο
Πρώτα, προσδιορίστε ποιοι πυρήνες ανήκουν στον κόμβο-στόχο σας:
numactl --hardwareΣτη συνέχεια, εκκινήστε την εφαρμογή συνδεδεμένη με αυτόν τον κόμβο τόσο για τους πυρήνες όσο και για τη μνήμη:
numactl --cpunodebind=0 --membind=0 ./your_applicationΓια μια διαδικασία που εκτελείται ήδη, προσαρμόστε τη συγγένεια CPU με taskset:
taskset -cp 0-7 <PID>Για να διατηρηθεί μετά από επανεκκίνηση, ορίστε την στη μονάδα systemd:
[Service]
CPUAffinity=0-7
NUMAPolicy=bind
NUMAMask=0Επαναφορτώστε και επανεκκινήστε:
sudo systemctl daemon-reload && sudo systemctl restart <service>Όταν κάνετε χειροκίνητη αντιστοίχιση, απενεργοποιήστε τον αυτόματο εξισορροπητή του πυρήνα, ώστε να μην παρεμβαίνει στην τοποθέτησή σας:
sysctl -w kernel.numa_balancing=0Προσθέστε το στο /etc/sysctl.conf για να παραμείνει. Στη συνέχεια, επαληθεύστε με numastat -p <PID> για μερικά λεπτά πραγματικού φόρτου εργασίας. Εάν other_node παραμείνει κοντά στο μηδέν, η στερέωση έχει αποτέλεσμα.
Επιλογή στρατηγικής ανάλογα με το φόρτο εργασίας
Η σωστή πολιτική εξαρτάται από το αν ο φόρτος εργασίας σας ωφελείται περισσότερο από χαμηλό λανθάνοντα χρόνο ή από συνολικό εύρος ζώνης σε όλους τους κόμβους.
| Φόρτος εργασίας | Πολιτική | Γιατί |
|---|---|---|
| Βάσεις δεδομένων (PostgreSQL, MySQL, SQL Server) | --cpunodebind + --membind | Μεγάλα κοινόχρηστα buffer, διαδρομές ερωτημάτων ευαίσθητες στην καθυστέρηση |
| Προσωρινή μνήμη (Redis, Memcached) | Δέσμευση ενός κόμβου | Όλα γίνονται μέσω πρόσβασης στη μνήμη RAM, η καθυστέρηση από απόσταση εμφανίζεται αμέσως |
| Εκπαίδευση και συμπερασμός AI/ML | Σύνδεση με τον κόμβο NUMA της GPU | Αποφεύγει τις μεταφορές τανυστών που διασχίζουν ρίζες PCIe |
| Αναλυτικά στοιχεία (Spark, Elasticsearch) | --interleave=all | Τα μεγάλα σύνολα εργασίας απαιτούν εύρος ζώνης σε όλους τους κόμβους |
| API ευαίσθητα στην καθυστέρηση, συναλλαγές | Αυστηρή συγγένεια pin + IRQ | Η προβλεψιμότητα έχει μεγαλύτερη σημασία από τη μέγιστη απόδοση |
| Υψηλή χρήση δικτύου (RoCEv2, InfiniBand) | Σύνδεση με τον κόμβο NUMA της κάρτας δικτύου, αποκλειστική χρήση πυρήνων για IRQ | Διατηρεί την επεξεργασία διακοπών σε τοπικό επίπεδο και μακριά από τα νήματα των εφαρμογών |
Ειδικά για φορτία εργασίας GPU, εκτελέστε lstopo για να βρείτε σε ποιον κόμβο NUMA βρίσκεται η GPU και, στη συνέχεια, ξεκινήστε τη διαδικασία εκπαίδευσης ή συμπερασμού με numactl --cpunodebind=N --membind=N για τον ίδιο N. Αυτή είναι μία από τις ευκολότερες βελτιώσεις σε έναν διακομιστή GPU πολλαπλών υποδοχών, επειδή η προεπιλεγμένη τοποθέτηση του χρονοπρογραμματιστή είναι συχνά λανθασμένη.
Για φορτία εργασίας HPC και MPI που εκτείνονται και στις δύο υποδοχές, συνδέστε κάθε βαθμίδα σε έναν μόνο κόμβο με localalloc αντί να τα διασταυρώνετε όλα. Κάθε rank λαμβάνει τοπική μνήμη και ο παραλληλισμός πραγματοποιείται σε επίπεδο rank.
Μια πρακτική συμβουλή: αν συνδέσετε σε έναν μόνο κόμβο, αφήστε 2–4 GB ελεύθερου χώρου σε αυτόν. Ένας κόμβος που λειτουργεί σχεδόν στο όριο της χωρητικότητάς του ενεργοποιεί την ανάκτηση χώρου, κάτι που σας κοστίζει την καθυστέρηση που προσπαθούσατε να εξοικονομήσετε.
Ρυθμίσεις BIOS και πυρήνα που πρέπει να ελέγξετε
Η ακρίβεια των αποτελεσμάτων του εργαλείου εξαρτάται από την τοπολογία που παρουσιάζει το υλικολογισμικό. Μερικές ρυθμίσεις που πρέπει να επιβεβαιώσετε:
- Node Interleaving: απενεργοποιήστε το. Όταν είναι ενεργοποιημένο, το BIOS παρουσιάζει όλη τη μνήμη ως ένα ενιαίο επίπεδο pool και κρύβει εντελώς το NUMA από το λειτουργικό σύστημα.
numactl --hardwareΣε αυτή την περίπτωση, θα εμφανιστεί ένας κόμβος σε ένα σύστημα με πολλαπλές υποδοχές. - Sub-NUMA Clustering (Intel) ή Nodes Per Socket (AMD): ενεργοποιήστε το σε επεξεργαστές με πολλούς πυρήνες όταν θέλετε καλύτερη τοπικότητα. Επιβεβαιώνεται
lscpuμετά την επανεκκίνηση. vm.zone_reclaim_mode: ρυθμίστε σε 0 για τους περισσότερους διακομιστές παραγωγής. Μια τιμή διαφορετική από το μηδέν ανακτά επιθετικά την τοπική μνήμη αντί να εκχωρεί απομακρυσμένα, κάτι που μπορεί να εκδιώξει χρήσιμη προσωρινή μνήμη σελίδων.kernel.numa_balancing: αφήστε το ενεργοποιημένο για φορτία εργασίας γενικής χρήσης, απενεργοποιήστε το όταν κάνετε χειροκίνητη στερέωση. Ο αυτόματος εξισορροπητής θα μεταφέρει σελίδες και νήματα με τρόπους που έρχονται σε σύγκρουση με την πολιτική σας.
Εάν εκτελείτε ρύθμιση NUMA σε bare metal όπου ελέγχετε το BIOS, τις παραμέτρους του πυρήνα και τη συγγένεια IRQ, μπορείτε να εφαρμόσετε όλα τα παραπάνω χωρίς να παρακάμψετε τις αφαίρεσεις του υπερ-επιτηρητή. Αυτός είναι ο κύριος λόγος για τον οποίο αυτό το είδος εργασίας είναι ευκολότερο σε αποκλειστικό υλικό παρά σε εικονικές μηχανές cloud.
Για αποκλειστικούς διακομιστές πολλαπλών υποδοχών με πλήρη πρόσβαση root, ανατρέξτε στους αποκλειστικούς διακομιστές της FDC.

Συντονισμένα προφίλ για βελτιστοποίηση του φόρτου εργασίας διακομιστών Linux
Πώς να επιλέγετε, να εφαρμόζετε και να προσαρμόζετε συντονισμένα προφίλ για διακομιστές GPU, βάσεων δεδομένων και Linux με υψηλό εύρος ζώνης, με παραδείγματα και συμβουλές ανάπτυξης του Ansible.
16 λεπτά ανάγνωσης - 9 Ιουνίου 2026
Ρύθμιση του Linux OOM Killer για VPS: Ένας πρακτικός οδηγός
12 λεπτά ανάγνωσης - 8 Ιουνίου 2026

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη