Auteur Sujet: [Linux] Optimisation d'un serveur pour un SSD : réduire les écritures sur le SSD  (Lu 25514 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
[Linux] Optimisation d'un serveur pour un SSD : réduire les écritures sur le SSD
« Réponse #12 le: 16 décembre 2017 à 14:56:09 »
Superviser son SSD : exemple avec le SSD BX100 de Crucial

Voici le SSD qui héberge les mises à jour d'Ubuntu http://fr.archive.ubuntu.com/ (Note: les logs Apache sont situés sur le disque dur classique, ce dernier servant également pour booter le serveur)

smartctl nous donne les informations suivantes : (les informations varient avec chaque SSd et il faut pour certains avoir la doc pour savoir quelle taille est comptabilisé - ici c'est écrit dans le nom : 32 Mio)
- Temps de fonctionnement : Power_On_Hours  = 14748 heures soit 614 jours
- Lecture : Host_Reads_32MiB = 14505213 soit 486,7 To => 793 Go /jour (le reste est en cache en ram)
- Écriture demandé : Host_Writes_32MiB = 388632 soit 13040,3 Go =>  21,2 Go /jour
- Écriture réel : Flash_Writes_32MiB = 667008 soit 22381,1 Go => 36,5 Go/jour

Flash_Writes est supérieur à Host_Writes car il n'est pas possible de modifier seulement quelques Ko sur un SSD : l'écriture peut nécessite d'effacer plus que ce qui est demandé (les données non modifiées sont ré-écrites à l'identique)


Attention, les données remontées par Smart sont bien différentes entre les maques / modèles. Ici c'est un SSD de Crucial, le BX100.

# smartctl -a /dev/sdb
smartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.10.0-42-generic] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     SiliconMotion based SSDs
Device Model:     CT1000BX100SSD1
Serial Number:    1504F0023ECA
LU WWN Device Id: 5 00a075 1f0023eca
Firmware Version: MU01
User Capacity:    1 000 204 886 016 bytes [1,00 TB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2 (minor revision not indicated)
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Sat Dec 16 14:31:33 2017 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: (    0) seconds.
Offline data collection
capabilities: (0x71) SMART execute Offline immediate.
No Auto Offline data collection support.
Suspend Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities:            (0x0002) Does not save SMART data before
entering power-saving mode.
Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: (   2) minutes.
Extended self-test routine
recommended polling time: (  10) minutes.
Conveyance self-test routine
recommended polling time: (   2) minutes.
SCT capabilities:        (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0000   100   100   000    Old_age   Offline      -       0
  5 Reallocated_Sector_Ct   0x0000   100   100   000    Old_age   Offline      -       0
  9 Power_On_Hours          0x0000   100   100   000    Old_age   Offline      -       14748
 12 Power_Cycle_Count       0x0000   100   100   000    Old_age   Offline      -       4
160 Uncorrectable_Error_Cnt 0x0000   100   100   000    Old_age   Offline      -       0
161 Valid_Spare_Block_Cnt   0x0000   100   100   000    Old_age   Offline      -       147
163 Initial_Bad_Block_Count 0x0000   100   100   000    Old_age   Offline      -       52
164 Total_Erase_Count       0x0000   100   100   000    Old_age   Offline      -       41688
165 Max_Erase_Count         0x0000   100   100   000    Old_age   Offline      -       91
166 Min_Erase_Count         0x0000   100   100   000    Old_age   Offline      -       1
167 Average_Erase_Count     0x0000   100   100   000    Old_age   Offline      -       18
168 Max_Erase_Count_of_Spec 0x0000   100   100   000    Old_age   Offline      -       2000
169 Remaining_Lifetime_Perc 0x0000   100   100   000    Old_age   Offline      -       100
175 Program_Fail_Count_Chip 0x0000   100   100   000    Old_age   Offline      -       0
176 Erase_Fail_Count_Chip   0x0000   100   100   000    Old_age   Offline      -       0
177 Wear_Leveling_Count     0x0000   100   100   050    Old_age   Offline      -       0
178 Runtime_Invalid_Blk_Cnt 0x0000   100   100   000    Old_age   Offline      -       0
181 Program_Fail_Cnt_Total  0x0000   100   100   000    Old_age   Offline      -       0
182 Erase_Fail_Count_Total  0x0000   100   100   000    Old_age   Offline      -       0
192 Power-Off_Retract_Count 0x0000   100   100   000    Old_age   Offline      -       0
194 Temperature_Celsius     0x0000   100   100   000    Old_age   Offline      -       21
195 Hardware_ECC_Recovered  0x0000   100   100   000    Old_age   Offline      -       4975
196 Reallocated_Event_Count 0x0000   100   100   016    Old_age   Offline      -       0
197 Current_Pending_Sector  0x0000   100   100   000    Old_age   Offline      -       0
198 Offline_Uncorrectable   0x0000   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0000   100   100   050    Old_age   Offline      -       3
232 Available_Reservd_Space 0x0000   100   100   000    Old_age   Offline      -       100
241 Host_Writes_32MiB       0x0000   100   100   000    Old_age   Offline      -       388632
242 Host_Reads_32MiB        0x0000   100   100   000    Old_age   Offline      -       14505213
245 Flash_Writes_32MiB      0x0000   100   100   000    Old_age   Offline      -       667008

SMART Error Log not supported

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Thornhill

  • Abonné SFR fibre FttH
  • *
  • Messages: 3 976
  • Saint-Médard-en-Jalles (33)
[Linux] Optimisation d'un serveur pour un SSD : réduire les écritures sur le SSD
« Réponse #13 le: 18 décembre 2017 à 10:29:22 »

Je passe swappiness de la valeur par défaut 60 à 10 : le swap est utilisé uniquement quand la mémoire est utilisée à plus de 90% (100-10) contre 40% par défaut (100-60). Cela diminue fortement l’utilisation du swap. Je n'ai mis que 1 Go de partition de swap sur le SSD.


Swapiness ne détermine pas le pourcentage de RAM au-delà duquel tu risques de swapper : c'est juste une pondération pour favoriser la mémoire des process (anonymous) par rapport  aux autres types de pages (pages mappées et cache filesystem).
Il faut donc plus le voir comme une probabilité de voir ses pages anonymes swappés.

Schématiquement, car ça semble en réalité plus compliqué :
Avec swapiness = 100 : tu auras en probabilité autant de pages anonymes que de pages mappées/du cache évincées de la RAM
Avec swapiness = 1 : tu auras 100 fois mois de pages anonymes que de pages mappées/du cache évincées de la RAM
Avec swapiness = 0 : tu n'auras plus de pages anonymes  évincées de la RAM, (sauf si un seuil très bas de RAM disponible est atteint)



Voici un exemple de serveur avec un /proc/sys/vm/swappiness de 10
Je suis étonné de la proportion que peut prendre le swap alors que peu de ram est utilisée (max de 395 Mo utilisé) - il y a 15 Go de cache, dont 7 Go utilisé pour un ramdisque :

C'est normal si ton cache filesystem met une grosse pression sur le VMM et que des process sont plutôt inactifs : même si tu as un swapiness à 10 , la probabilité de swapper est non nulle (juste réduite de 1/10) et donc le kernel aura tendance à pousser en swap les pages des process inactifs, plus que des pages filesystems qui sont plus actives.


vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
[Linux] Optimisation d'un serveur pour un SSD : réduire les écritures sur le SSD
« Réponse #14 le: 18 décembre 2017 à 10:57:07 »
swapiness = 1 a eu son comportement changé avec les noyaux récents, pour ne pas utiliser de swap, sauf nécessité.

swapiness = 0 est déconseillé car les demandes d’allocations peuvent être refusées.

Thornhill

  • Abonné SFR fibre FttH
  • *
  • Messages: 3 976
  • Saint-Médard-en-Jalles (33)
[Linux] Optimisation d'un serveur pour un SSD : réduire les écritures sur le SSD
« Réponse #15 le: 18 décembre 2017 à 11:07:55 »
swapiness = 0 est déconseillé car les demandes d’allocations peuvent être refusées.

C'est surtout qu'avec 0 tu risques de déclencher l'OOM Killer plus facilement en cas d'activité IO intense, ce qui est logique puisqu'il ne pourra plus libérer  des pages suffisamment vite en poussant les pages anonymes en swap.