Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;

Έχοντας μία εγκατάσταση SQL Server Instance μπορεί να έρθουμε αντιμέτωποι με την εξής περίεργη κατάσταση, ενώ να υπάρχει ανάγκη χρήσης του CPU να μην φτάνει ποτέ αυτό το 100%. Στο άρθρο θα δούμε που μπορεί να οφείλεται και πως το διορθώνουμε.

Η εικόνα που θα δούμε αν πάμε στο Activity Monitor στο SQL Server Management Studio είναι ότι το γράφημα δεν ξεπερνάει ποτέ όπως παρακάτω:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
1

Τρέχοντας το παρακάτω query μπορούμε να δούμε ποια CPU cores είναι διαθέσιμα:

select cpu_id,scheduler_id,status,is_online from sys.dm_os_schedulers order by scheduler_id;

Βλέπουμε ότι από τα 12 cores τα 4 φαίνονται ως offline:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
2

Πού μπορεί να οφείλεται

Affinity mask

Η πρώτη σκέψει είναι να έχει οριστεί κάποιο Affinity Mask στο οποίο να έχει οριστεί να γίνονται χρήση συγκεκριμένα μόνο CPU cores από τα threads.

Αυτό μπορούμε να το ελέγξουμε αν είναι ενεργοποιημένο με το παρακάτω query:

sp_configure 'show advanced option',1;
reconfigure;
go
sp_configure
go

Βλέπουμε ότι έχει τις default τιμές, άρα δεν είναι αυτό.

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
3

Resource Governor

Με τον Resource Governor (μόνο για enterprise edition) μπορούμε να ορίσουμε πόσους πόρους CPU,I/O να καταναλώνει μία ομάδα χρηστών.

Βλέπουμε όμως ότι και αυτό είναι disabled:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
4

SQL Server Edition

Μπορεί όμως να ευθύνεται η έκδοση του SQL Server; Ναι μπορεί!!

Ελέγχοντας την έκδοση βλέπουμε ότι είναι Standard Edition:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
5

Σύμφωνα με το manual της Microsoft, η Standard έκδοση στον SQL Server 2019 έχει τον περιορισμό των 24 cores και των έως 4 socket:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
6 (from docs.microsoft.com)

Τρέχοντας το παρακάτω query μπορούμε να δούμε πόσα sockets έχει ο Server:

select cpu_count/hyperthread_ratio from sys.dm_os_sys_info

Στην προκειμένη περίπτωση είχαμε 6 sockets με 2 cores το καθένα δηλαδή σύνολο 12 cores και λόγο έκδοσης είχε online μόνο τα 4 socket που μας άφηνε να κάνουμε χρήση τους 8 cores. Οπότε αυτός ήταν ο λόγος που το όριο του CPU έφτανε έως το 66%.

Για να λυθεί το πρόβλημα το μόνο που έχουμε να κάνουμε αν ο Server είναι ένα Virtual Machine, είναι να αλλάξουμε τον αριθμό των sockets σε έως 4 και να αυξήσουμε τον αριθμό των cores per socket π.χ. 2 sockets με 6 cores per socket που μας κάνει πάλι 12 cores.

Μετά την αλλαγή αυτή θα δούμε ότι πλέον βλέπουμε online όλα τα CPU cores:

Γιατί ο SQL Server δεν κάνει χρήση όλα τα CPU Cores;
7

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση