Je ne me préoccupe ni de l'utilisation de la RAM (j'en ai assez), ni de la perte de données en cas d'arrêt accidentel (mon alimentation est sauvegardée, le système est fiable et les données ne sont pas critiques). Mais je fais beaucoup de traitement de fichiers et je pourrais utiliser un coup de pouce de performance.
C'est pourquoi j'aimerais configurer le système pour qu'il utilise davantage de RAM pour la mise en cache de lecture et d'écriture du système de fichiers, afin de pré-extraire les fichiers de manière agressive (par exemple, la lecture à l'avance de l'intégralité du fichier auquel accède une application si le fichier est de taille raisonnable ou au moins lire à l’avance un gros morceau sinon) et vider moins souvent les tampons d’écriture. Comment y parvenir (est-ce possible)?
J'utilise les systèmes de fichiers ext3 et ntfs (j'utilise beaucoup ntfs!) Avec XUbuntu 11.10 x86.
sudo mount -o ro,nobarrier /path/to/mountpoint
ou ajustez simplement/etc/fstab
pour inclurenobarrier
tout système de fichiers que vous êtes prêt à sacrifier pour améliorer les performances. Toutefois, si votre périphérique de stockage dispose d'une batterie interne telle que la série Intel 320 SSD, l'utilisationnobarrier
ne provoque aucune perte de données.Réponses:
En général, améliorer les performances du cache disque ne consiste pas simplement à augmenter la taille du cache du système de fichiers, à moins que l' ensemble de votre système ne tienne dans la RAM. Dans ce cas, vous devez utiliser un lecteur RAM (
tmpfs
c'est bien, car cela permet de recourir au disque si vous avez besoin de RAM dans certains cas). pour le stockage à l'exécution (et peut-être un script initrd pour copier le système du stockage sur le lecteur RAM au démarrage).Vous n'avez pas indiqué si votre périphérique de stockage est un disque SSD ou un disque dur. Voici ce que j'ai trouvé pour travailler pour moi (dans mon cas
sda
est un disque dur monté à/home
etsdb
est monté sur SSD/
).D'abord, optimisez la partie load-stuff-from-storage-to-cache:
Voici ma configuration pour le disque dur (assurez-vous que AHCI + NCQ est activé dans le BIOS si vous avez basculé):
Il convient de noter que le disque dur est haut
fifo_expire_async
(généralement en écriture) et longslice_sync
pour permettre à un processus unique d’obtenir un débit élevé (définislice_sync
sur nombre inférieur si vous rencontrez des situations dans lesquelles plusieurs processus attendent en parallèle des données du disque). Ilslice_idle
s’agit toujours d’un compromis pour les disques durs, mais son réglage dans la plage 3-20 devrait être correct, en fonction de l’utilisation du disque et du microprogramme du disque. Je préfère cibler les valeurs les plus basses, mais une valeur trop basse détruira votre débit. Lequantum
paramètre semble affecter beaucoup le débit, mais essayez de le maintenir aussi bas que possible pour maintenir la latence à un niveau raisonnable. Un réglagequantum
trop bas détruira le débit. Les valeurs comprises entre 3 et 8 semblent bien fonctionner avec les disques durs. La latence la plus défavorable pour une lecture est (quantum
*slice_sync
) + (slice_async_rq
*slice_async
) ms si j'ai bien compris le comportement du noyau. Le async est surtout utilisé par écrit et que vous êtes prêt à retarder l' écriture sur le disque, définir à la foisslice_async_rq
etslice_async
à un nombre très bas. Cependant, si vous définissezslice_async_rq
une valeur trop basse, les lectures seront bloquées car les écritures ne pourront plus être différées. Ma config essayera d'écrire des données sur le disque au plus après 10 secondes après que les données ont été transmis au noyau , mais puisque vous pouvez tolérer la perte de données sur la perte de puissance également misfifo_expire_async
à3600000
dire que 1 heure est correct pour le retard sur le disque. Gardez simplement le niveauslice_async
bas, car sinon, vous pouvez obtenir une latence de lecture élevée.Cette
hdparm
commande est nécessaire pour empêcher AAM de compromettre une grande partie des performances permises par AHCI + NCQ. Si votre disque fait trop de bruit, sautez ceci.Voici ma configuration pour SSD (série Intel 320):
Ici, il convient de noter les faibles valeurs pour différents paramètres de tranche. Le paramètre le plus important pour un SSD est celui
slice_idle
qui doit être défini sur 0-1. Définir cette valeur sur zéro déplace toutes les décisions de commande vers NCQ natif, tandis que la valeur 1 permet au noyau de commander des demandes (mais si le NCQ est actif, le matériel peut annuler partiellement la commande du noyau). Testez les deux valeurs pour voir si vous pouvez voir la différence. Pour la série Intel 320, il semble que le réglageslide_idle
sur0
donne le meilleur débit, mais que le réglage1
donne la meilleure latence (la plus faible).Pour plus d'informations sur ces paramètres ajustables, voir http://www.linux-mag.com/id/7572/ .
Maintenant que nous avons configuré le noyau pour charger des éléments d'un disque à un autre avec des performances raisonnables, il est temps d'ajuster le comportement du cache:
Selon les repères que j'ai faits, je ne me donnerais pas la peine de passer à lire avant
blockdev
. Les paramètres par défaut du noyau conviennent.Définissez le système pour qu'il préfère échanger les données du fichier sur le code de l'application (peu importe si vous disposez de suffisamment de RAM pour conserver le système de fichiers complet, ainsi que tout le code de l'application et toute la mémoire virtuelle allouée par les applications dans la RAM). Cela réduit la latence pour le basculement entre différentes applications sur la latence pour l'accès à des fichiers volumineux à partir d'une seule application:
Si vous préférez conserver les applications presque toujours dans la RAM, vous pouvez définir la valeur 1. Si vous définissez la valeur sur zéro, le noyau ne sera pas échangé du tout, à moins que cela ne soit absolument nécessaire pour éviter OOM. Si vous étiez limité en mémoire et travailliez avec de gros fichiers (par exemple, l'édition vidéo HD), il serait peut-être judicieux de choisir une valeur proche de 100.
De nos jours (2017), je préfère ne pas avoir d'échange du tout si vous avez assez de RAM. Le fait de ne pas permuter perdra généralement 200 à 1 000 Mo de RAM sur un ordinateur de bureau fonctionnant longtemps. Je suis prêt à sacrifier autant pour éviter la latence dans le pire des cas (remplacement du code d'application lorsque la mémoire RAM est saturée). Dans la pratique, cela signifie que je préfère le tueur OOM à l’échange. Si vous autorisez / avez besoin d’échange, vous voudrez peut-être également augmenter
/proc/sys/vm/watermark_scale_factor
pour éviter une certaine latence. Je suggérerais des valeurs comprises entre 100 et 500. Vous pouvez considérer ce paramètre comme un usage commercial du processeur pour une latence de swap inférieure. La valeur par défaut est 10 et la valeur maximale possible est 1 000. Une valeur supérieure doit (selon la documentation du noyau ) entraîner une utilisation accrue de la CPU pour leskswapd
processus et une latence de swap globale inférieure.Ensuite, dites au noyau de préférer garder la hiérarchie des répertoires en mémoire plutôt que le contenu du fichier au cas où de la RAM devrait être libérée (encore une fois, si tout tient dans la RAM, ce paramètre ne fait rien):
Réglage
vfs_cache_pressure
Une valeur faible a du sens car dans la plupart des cas, le noyau a besoin de connaître la structure des répertoires pour pouvoir utiliser le contenu des fichiers du cache et vider le cache de répertoires trop tôt, ce qui rend le cache de fichiers presque inutile. Si vous avez beaucoup de petits fichiers (envisagez environ 150 000 photos 10 mégapixels, mon système compte environ 1 000 photos) et compte comme système "beaucoup de petits fichiers". Ne le définissez jamais à zéro ou la structure de répertoire est toujours conservée en mémoire, même si le système est à court de mémoire. Définir ce paramètre sur une valeur élevée n’est judicieux que si vous ne disposez que de quelques gros fichiers qui sont constamment relus (encore une fois, l’édition de vidéos HD sans assez de RAM serait un exemple). La documentation officielle du noyau indique que "Exception: si vous avez vraiment une quantité énorme de fichiers et de répertoires et que vous touchez / lisez / listez rarement tous les fichiers dont la valeur est
vfs_cache_pressure
supérieure à 100, cela peut être judicieux. Cela ne s'applique que si vous ne disposez pas de suffisamment de RAM et que vous ne pouvez pas conserver la structure de répertoires dans celle-ci tout en conservant assez de RAM pour le cache et les processus normaux (par exemple, le serveur de fichiers de la société avec beaucoup de contenu archivistique). Si vous sentez que vous devez augmentervfs_cache_pressure
au-dessus de 100, vous exécutez sans assez de RAM. Augmentervfs_cache_pressure
peut aider, mais la seule solution est d’obtenir plus de RAM. Définirvfs_cache_pressure
un nombre élevé sacrifie les performances moyennes pour obtenir des performances globalement plus stables (vous pouvez éviter le pire comportement, mais vous devez faire face à des performances globales pires).Enfin, indiquez au noyau d'utiliser jusqu'à 99% de la RAM en cache pour les écritures et demandez au noyau d'utiliser jusqu'à 50% de la RAM avant de ralentir le processus en cours d'écriture (par défaut pour
dirty_background_ratio
is10
). Avertissement: Personnellement, je ne le ferais pas, mais vous avez prétendu disposer de suffisamment de RAM et êtes prêt à perdre les données.Et dites qu'un délai d'écriture de 1h est correct pour même commencer à écrire des éléments sur le disque (encore une fois, je ne le ferais pas):
Si vous mettez tous ces éléments dans
/etc/rc.local
et incluez ce qui suit à la fin, tout sera mis en cache dès que possible après le démarrage (ne le faites que si votre système de fichiers tient vraiment dans la RAM):Ou un peu plus simple alternative pourrait mieux fonctionner (cache seulement
/home
et/usr
, faire que si votre/home
et/usr
vraiment en forme dans la RAM):la source
Premièrement, je ne vous recommande PAS de continuer à utiliser NTFS, car la mise en œuvre de NTFS sous Linux poserait à tout moment un problème de performances et de sécurité.
Vous pouvez faire plusieurs choses:
ext4
oubtrfs
bfq
preload
systemd
pour précharger pendant le démarragePeut-être que vous voulez essayer :-)
la source
btrfs
s’agit d’un système de fichiers récemment conçu, j’éviterais cela si des performances sont nécessaires. Nous avons mis en place par ailleurs des systèmes identiques avecbtrfs
et lesext4
systèmes de fichiers etext4
gagne dans le monde réel avec une grande marge (btrfs
Semble besoin d' environ 4x temps CPU lesext4
besoins pour le même niveau de performance et provoque plusieurs opérations de disque pour une seule commande logique). Selon la charge de travail, je le suggéreraisext4
,jfs
ouxfs
pour tout travail exigeant en termes de performances.A lire d'avance:
Sur les systèmes 32 bits:
Sur les systèmes 64 bits:
Écrivez en cache:
Cela utilisera jusqu'à 100% de votre mémoire libre en tant que cache en écriture.
Ou vous pouvez tout faire et utiliser tmpfs. Ceci n'est pertinent que si vous avez assez de RAM. Mettez ceci dans
/etc/fstab
. Remplacez 100 G par la quantité de RAM physique.Ensuite:
Ensuite, utilisez / mnt / tmpfs.
la source
Vous pouvez définir la taille de lecture anticipée avec
blockdev --setra sectors /dev/sda1
, où secteurs est la taille souhaitée dans des secteurs de 512 octets.la source
Mon réglage de tueur est très simple et très efficace:
L'explication de la documentation du noyau :
vfs_cache_pressure
À 2000, la plupart des opérations informatiques sont effectuées dans la RAM et les écritures très tardives sur disque.la source
vfs_cache_pressure
trop élevé (à mon avis2000
trop élevé) entraînera un accès inutile au disque, même pour des choses simples telles que les listes de répertoires qui devraient facilement tenir dans le cache. Combien de RAM avez-vous et que faites-vous avec le système? Comme je l'ai écrit dans ma réponse, l'utilisation de valeurs élevées pour ce paramètre est utile, par exemple, pour l'édition vidéo HD avec une RAM limitée.Pas lié à la mise en cache d'écriture, mais lié à l'écriture:
Pour un système ext4, vous pouvez désactiver entièrement la journalisation.
Cela réduira le nombre d'écritures sur disque pour une mise à jour particulière, mais risque de laisser le système de fichiers incohérent après un arrêt inattendu, nécessitant un fsck ou pire.
Pour empêcher les lectures de disque de déclencher des écritures sur disque:
Monter avec l' option relatime ou noatime
Lorsque vous lisez un fichier, les métadonnées de "dernière heure d'accès" pour ce fichier sont généralement mises à jour. L'
noatime
option désactivera ce comportement. Cela réduit les écritures inutiles sur le disque, mais vous ne disposerez plus de ces métadonnées. Certaines distributions (Manjaro, par exemple) ont adopté cette option par défaut sur toutes les partitions (probablement pour augmenter la durée de vie des modèles SSD précédents).relatime
met à jour le temps d'accès moins fréquemment, selon des méthodes heuristiques permettant de prendre en charge les applications utilisant atime. C'est la valeur par défaut sous Red Hat Enterprise Linux.Autres options:
la source