I. L'auteur▲
le blog : |
II. Machines de test ▲
Nos deux serveurs ont les mêmes configurations au niveau hardware :
Hewlett Packard Proliant DL 385 G7
- RAM : 32 Go
- Disques : 8 SAS 300 Go 10 Krpm
- 2 CPU AMD Opteron 6136 soit 2 nœuds NUMA 3 cœurs par nœuds (soit 12 cœurs), cadencés à 2,4 Ghz
Configuration du stockage :
- 2 partitions RAID 1 avec 2 disques
- 1 partition RAID 10 avec 4 disques
Soit 3 volumes.
II-A. Configuration OS▲
Pour Windows :
Version 2016 standard 64 bits
File Système NTFS, cluster 64 Ko
- C : 279 Go (RAID 1)
- D : 279 Go (RAID 1)
- E : 558 Go (RAID 10)
NOTA : Windows Defender installé par défaut…
Pour Linux :
Version Ubuntu 16.04.3 LTS.
Montage des volumes :
- /dev/sda : 279,4 Go (RAID1)
- /dev/sdb : 279,4 Go (RAID 1)
- /dev/sdc : 558,7 Go (RAID 10)
Tous formatés de la même façon :
- Unités : sectors of 1 * 512 = 512 octets
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
File système : ext4
Aucune couche graphique d'installée, ni antivirus.
III. Installation de SQL Server sous Linux Ubuntu ▲
Il n'y a pas d'interface graphique pour installer SQL Server sous Linux. Néanmoins, Microsoft propose une documentation fournie pour ce faire :
https://docs.microsoft.com/fr-fr/sql/linux/sql-server-linux-setup
C'est mon collègue Arian Papillon qui a installé la version Linux de SQL Server. À ce titre, il a édité un petit article intitulé « SQL Server sous Linux pour les NUL(L)S ».
Nos deux installations de SQL Server sous Windows et Linux sont strictement identiques.
Notez la différence des « builds » :
- Pour Windows : 14.0.1000.169 ;
- Pour Linux : 14.0.3006.16.
Ceci ne devrait avoir aucune importance pour nos tests.
Remarque : il n'est pas possible en l'état actuel de la version Linux de SQL Server de disposer d'instances nommées. Autrement dit, vous ne pouvez installer qu'une instance par défaut pour SQL Server, ce qui limite les possibilités de multiinstance.
IV. Modification de l'installation par défaut ▲
Nous avons modifié les fichiers de la base tempdb (objets temporaires) afin d'être en correspondance avec l'installation sous Windows. En effet, la version Linux ne propose pas de créer autant de fichiers que celle de Windows et ne crée que deux fichiers, l'un pour le journal de transaction, l'autre pour les données.
En d'autres termes, nous avons rajouté sept fichiers de données à la base tempdb. Cette multiplicité de fichiers sert à améliorer le parallélisme d'accès aux différents threads utilisant la base tempdb contenant les objets temporaires.
Nous avons aussi fait en sorte que sur les deux serveurs (Linux comme Windows) les fichiers des bases soient stockés sous E pour les données (RAID 1) et D (RAID 10) pour les transactions, ce qui correspond, dans notre installation Linux à :
REMARQUE : tous les tests ont été effectués depuis un PC tiers à l'aide de la console SSMS (SQL Server management Studio).
V. TEST 1 - Page et Extensions▲
Le but de ce test est de voir à quelle vitesse se font les écritures dans une table dont chaque ligne remplit une page.
La base est créée comme ceci :
2.
3.
4.
USE
master
;
GO
CREATE
DATABASE
DB_TEST_IO
GO
Dans les deux cas, la base est créée avec les caractéristiques suivantes au niveau du stockage :
Une table est créée de la sorte :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
USE
DB_TEST_IO
GO
SET
NOCOUNT ON
;
GO
CREATE
TABLE
TIO
(
TIO_ID INT
IDENTITY
,
TIO_DATA CHAR
(
8000
))
GO
BACKUP
DATABASE
DB_TEST_IO
TO
DISK
=
'DB_TEST_IO.bak'
;
GO
Et finalement, on effectue une sauvegarde pour initialiser le journal des transactions.
Le test proprement dit consiste à insérer huit lignes d'un coup et l'on recommence ce test 128 000 fois, soit 1 024 000 pages insérées.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--========================================================================--
--> ATTENTION : cette partie du test doit être exécutée EN UNE SEULE PHASE
--== ======================================================================--
SELECT
SYSUTCDATETIME()
AS
DH INTO
T;
GO
INSERT
INTO
TIO VALUES
(
''
)
, (
''
)
, (
''
)
,(
''
)
, (
''
)
, (
''
)
,(
''
)
, (
''
)
;
GO
128000
CHECKPOINT ;
GO
SELECT
DATEDIFF
(
millisecond, DH, SYSUTCDATETIME())
FROM
T;
SELECT
CASE
"type"
WHEN
1
THEN
'TRAN'
ELSE
'DATA'
END
AS
"Type"
,
CAST
(
mf.size/
128
.0
AS
DECIMAL
(
18
,2
))
AS
File_Size_MB,
num_of_reads, num_of_bytes_read, io_stall_read_ms,
num_of_writes, num_of_bytes_written, io_stall_write_ms,
CAST
(
fs.io_stall_read_ms/(
1
.0
+
fs.num_of_reads)
AS
NUMERIC
(
10
,1
))
AS
avg_read_stall_ms,
CAST
(
fs.io_stall_write_ms/(
1
.0
+
fs.num_of_writes)
AS
NUMERIC
(
10
,1
))
AS
avg_write_stall_ms
FROM
sys.database_files AS
mf WITH
(
NOLOCK)
CROSS
APPLY sys.dm_io_virtual_file_stats(
DB_ID()
, file_id)
AS
fs;
--========================================================================--
--> FIN DE LA PHASE
--========================================================================--
Le test durant environ 20 minutes, nous avons procédé à cinq essais et conservé toutes les mesures.
Les opérations de disque sont alors collectées uniquement pour les fichiers de cette base à l'aide de la dernière requête.
Résultats pour Linux :
Fichier |
Lecture |
Écritures |
Latences moyennes |
||||||
---|---|---|---|---|---|---|---|---|---|
Type |
Size_Mo |
Reads |
bytes_read |
stall_read_ms |
Writes |
bytes_written |
stall_write_ms |
avg_read_stall_ms |
avg_write_stall_ms |
DATA |
8008.00 |
211 |
11067392 |
392 |
9297 |
8400756736 |
252474 |
1.8 |
27.2 |
TRAN |
9480.00 |
180 |
1757184 |
96 |
257495 |
9905119232 |
1176244 |
0.5 |
4.6 |
DATA |
8008.00 |
217 |
11468800 |
330 |
9286 |
8400805888 |
262233 |
1.5 |
28.2 |
TRAN |
9480.00 |
180 |
1757184 |
98 |
257520 |
9905446912 |
1169819 |
0.5 |
4.5 |
DATA |
8008.00 |
211 |
11067392 |
271 |
9298 |
8400764928 |
259384 |
1.3 |
27.9 |
TRAN |
9480.00 |
180 |
1757184 |
124 |
257490 |
9905299456 |
1168945 |
0.7 |
4.5 |
DATA |
8008.00 |
211 |
11067392 |
304 |
9357 |
8401264640 |
239911 |
1.4 |
25.6 |
TRAN |
9480.00 |
180 |
1757184 |
96 |
257484 |
9905221632 |
1172908 |
0.5 |
4.6 |
DATA |
8008.00 |
211 |
11067392 |
346 |
9282 |
8400625664 |
253313 |
1.6 |
27.3 |
TRAN |
9480.00 |
180 |
1757184 |
123 |
257492 |
9905139712 |
1173015 |
0.7 |
4.6 |
Moyenne des latences relevées pour LINUX :
Lectures |
Écritures |
|
---|---|---|
Données |
1,34 |
27,24 |
Transactions |
0,58 |
4,56 |
Résultat pour Windows :
Fichier |
Lecture |
Écritures |
Latences moyennes |
||||||
---|---|---|---|---|---|---|---|---|---|
Type |
Size_Mo |
Reads |
bytes_read |
stall_read_ms |
Writes |
bytes_written |
stall_write_ms |
avg_read_stall_ms |
avg_write_stall_ms |
DATA |
8008.00 |
224 |
12771328 |
1069 |
10268 |
8406908928 |
300629 |
4.8 |
29.3 |
TRAN |
8712.00 |
168 |
1700352 |
67 |
257528 |
9122321408 |
1106818 |
0.4 |
4.3 |
DATA |
8008.00 |
214 |
11788288 |
873 |
10689 |
8410341376 |
386398 |
4.1 |
36.1 |
TRAN |
8712.00 |
168 |
1700352 |
92 |
257637 |
9122304512 |
1113679 |
0.5 |
4.3 |
DATA |
8008.00 |
223 |
12427264 |
830 |
10469 |
8408686592 |
386004 |
3.7 |
36.9 |
TRAN |
8712.00 |
168 |
1700352 |
72 |
257653 |
9122348544 |
1118436 |
0.4 |
4.3 |
DATA |
8008.00 |
214 |
11788288 |
806 |
10491 |
8408670208 |
404745 |
3.7 |
38.6 |
TRAN |
8712.00 |
168 |
1700352 |
74 |
257618 |
9122206208 |
1119310 |
0.4 |
4.3 |
DATA |
8008.00 |
223 |
12427264 |
935 |
11467 |
8414969856 |
267804 |
4.2 |
23.4 |
TRAN |
8712.00 |
168 |
1700352 |
71 |
258379 |
9122649600 |
1123934 |
0.4 |
4.3 |
DATA |
8008.00 |
223 |
12427264 |
1158 |
10442 |
8408580096 |
363042 |
5.2 |
34.8 |
TRAN |
8712.00 |
168 |
1700352 |
71 |
257620 |
9122288128 |
1123246 |
0.4 |
4.4 |
Moyenne des latences relevées pour WINDOWS :
Lectures |
Écritures |
|
---|---|---|
Données |
3,34 |
32,86 |
Transaction |
0,42 |
4,3 |
V-A. CONCLUSIONS▲
Lectures |
Écritures |
Gains |
||||
---|---|---|---|---|---|---|
Linux |
Windows |
Linux |
Windows |
Lecture |
Écriture |
|
Données |
1,34 |
3,34 |
27,24 |
32,86 |
2,5 x (Linux) |
1,2 x (Linux) |
Transactions |
0,58 |
0,42 |
4,56 |
4,3 |
1,4 x (Windows) |
1,06 x (Windows) |
Linux s'en sort mieux pour toutes les opérations dans les fichiers de données et en particulier pour les lectures ou le gain est important (2,5 fois plus rapide que sous Windows). En revanche, Windows s'en sort généralement mieux pour toutes les opérations portant sur le journal de transaction, bien que le gain sur les écritures soit insignifiant.
Le point critique d'une base de données est les écritures sur le journal de transaction qui sont synchronisées à la pose des verrous transactionnels. En effet, tant que les écritures du journal ne sont pas finalisées, les objets invoqués dans la requête sont verrouillés. Il en résulte donc un blocage pour les autres utilisateurs qui doivent attendre. On constate alors que la version Windows de SQL Server s'en sort mieux, mais de peu sur les écritures.
Pour les lectures, du journal, rares en pratique, la différence est peu sensible en faveur de Windows.
Il existe bien une différence importante sur les opérations portant sur le fichier de données. Or les données étant écrites de manière asynchrone (environ toutes les minutes par défaut), ceci est bien moins important que tout ce qui porte sur le journal de transaction. Néanmoins, les lectures sont beaucoup plus rapides et ce point mériterait d'être approfondi avec un test de vidage du cache et lectures physiques.
Notons enfin que les écritures transactionnelles sont plus volumineuses dans la version Linux que dans la version Windows (912 Mo contre 990), ceci expliquant peut-être la différence de vitesse observée.
En conclusion, nous dirons qu'il existe peu de différences au niveau transactionnel, mais avec un petit avantage à Windows tandis qu'au niveau « data » Linux est bien plus rapide, ne serait-ce que pour monter en cache les données.
VI. Test 2 - Spatial▲
Ce test a pour but d'exécuter des requêtes de calculs utilisant la SQL CLR (machine virtuelle .net intégrée à SQL Server) via l'appel de méthodes spatiales.
Nous avons repris l'ensemble des requêtes de notre benchmark PostGreSQL vs SQL Server pour le spatial dont vous trouverez la description dans l'article intitulé « BENCHMARK SIG : PostGreSQL vs MS SQL Server ».
La méthode de tests est restée la même que dans l'article original : 10 exécutions pour chaque requête, élimination des temps extrêmes (plus court et plus long) moyenne sur les 8 résultats restants.
Les résultats sont les suivants :
UCT : temps d'utilisation des processeurs
T : temps intrinsèque de la requête
VI-A. CONCLUSIONS▲
Dans six requêtes, Linux s'avère plus rapide que Windows. Pour trois requêtes, le gain dépasse 50 %. Globalement, au niveau des temps d'utilisation des processeurs, le gain en faveur de Linux n'est que de 7,5 % ce qui n'est guère significatif. Là aussi, cela mériterait un test plus approfondi.
En revanche, Linux s'avère plus rapide de 40 % dans la restitution des résultats. Ceci n'est pas négligeable.
VII. Linux plus rapide que Windows ? Oui, mais… ▲
S'il semble que la version Linux de SQL Server soit quelque peu plus rapide que sous Windows, il ne faudrait pas oublier certains détails importants susceptibles de remettre en cause ce résultat :
- D'abord, par défaut, Windows active beaucoup de services parfois inutiles. Sur notre OS de test, où nous n'avons effectué aucun réglage particulier, nous comptons 73 services actifs tandis que dans Linux, seuls 33 services sont actifs (voir Annexe).
- Windows Server est installé par défaut avec l'antivirus maison « Windows Defender ». Linux n'a aucun antivirus installé ni activé par défaut (ne serait-ce pas une faille de sécurité ?).
- Notre version de Windows est installée avec une couche graphique par défaut, tandis que Linux n'est accessible que par ligne de commande. Nous aurions pu installer la version « core » de Windows…
Il est probable qu'en désactivant les services inutiles de Windows, en installant un antivirus sur notre OS Linux et en utilisant une version « core » de Windows, les résultats auraient été un peu différents.
C'est pourquoi nous allons continuer nos tests et publierons régulièrement des résultats complémentaires dans les mois qui suivent !
VIII. Annexe▲
Voici comment nous avons obtenu les listes des services actifs :
Pour Windows, commande : cmd /k net start.
Services activés :
- Agent de stratégie IPsec
- Alimentation
- Appel de procédure distante (RPC)
- Assistance IP
- Assistance NetBIOS sur TCP/IP
- CDPUserSvc_3777bd
- Client de stratégie de groupe
- Client de suivi de lien distribué
- Client DHCP
- Client DNS
- Configuration des services Bureau à distance
- Connaissance des emplacements réseau
- Coordinateur de transactions distribuées
- CoreMessaging
- Découverte SSDP
- Détection matériel noyau
- Enregistreur VSS SQL Server
- Expériences des utilisateurs connectés et télémétrie
- Gestion … distance de Windows (Gestion WSM)
- Gestionnaire de comptes de sécurité
- Gestionnaire de session locale
- Gestionnaire des connexions Windows
- Gestionnaire des utilisateurs
- Gestionnaire d'informations d'identification
- Gestionnaire d'installation de périphérique
- Hôte de synchronisation_3777bd
- Informations d'application
- Infrastructure de gestion Windows
- Isolation de clé CNG
- Journal d'événements Windows
- Lanceur de processus serveur DCOM
- Mappeur de point de terminaison RPC
- Moteur de filtrage de base
- Pare-feu Windows
- Planificateur de tâches
- Plug-and-Play
- Propagation du certificat
- Redirecteur de port du mode utilisateur des services Bureau à distance
- Serveur
- Serveur de modèles de données de vignette
- Service Broker des événements système
- Service Broker pour les connexions réseau
- Service Broker pour les événements horaires
- Service de cache de police Windows
- Service de découverte automatique de Proxy Web pour les services HTTP Windows
- Service de géolocalisation
- Service de journalisation des accès utilisateur
- Service de l'Assistant Compatibilité des programmes
- Service de notification d'événements système
- Service de plateforme des appareils connectés
- Service de profil utilisateur
- Service de stratégie de diagnostic
- Service du système de notifications Push Windows
- Service d'infrastructure des tâches en arrière-plan
- Service d'énumération de périphériques de carte à puce
- Service Interface du magasin réseau
- Service Liste des réseaux
- Service State Repository (StateRepository)
- Service Windows Defender
- Services Bureau à distance
- Services de chiffrement
- Spouleur d'impression
- SQL Full-text Filter Daemon Launcher (SQLWIN17SGAN)
- SQL Server (SQLWIN17SGAN)
- SQL Server Browser
- SQL Server CEIP service (SQLWIN17SGAN)
- SQL Server Integration Services 14.0
- SQL Server Integration Services CEIP service 14.0
- Station de travail
- Système d'événement COM+
- Temps Windows
- Thèmes
- Windows Driver Foundation - Infrastructure de pilote mode-utilisateur
Pour linux : sudo service --status-all.
Services activés :
- [ + ] acpid
- [ + ] apparmor
- [ + ] apport
- [ + ] atd
- [ + ] console-setup
- [ + ] cron
- [ + ] dbus
- [ + ] grub-common
- [ + ] irqbalance
- [ + ] iscsid
- [ + ] keyboard-setup
- [ + ] kmod
- [ + ] lvm2-lvmetad
- [ + ] lvm2-lvmpolld
- [ + ] lxcfs
- [ + ] mdadm
- [ + ] networking
- [ + ] nmbd
- [ + ] ondemand
- [ + ] open-iscsi
- [ + ] procps
- [ + ] rc.local
- [ + ] resolvconf
- [ + ] rsyslog
- [ + ] samba
- [ + ] samba-ad-dc
- [ + ] smbd
- [ + ] ssh
- [ + ] udev
- [ + ] ufw
- [ + ] unattended-upgrades
- [ + ] urandom
- [ + ] winbind
NOTA : nous avons retiré de cette liste les services inactifs ( [ - ] ). Aucun service n'avait le statut [ ? ].
Remerciements▲
Nous remercions Jérôme Marsaguet pour la mise au gabarit Developpez.com, et F-Leb pour la relecture orthographique.