J'ai un serveur assez ancien qui a 4 Go de RAM et il sert à peu près les mêmes fichiers toute la journée, mais il le fait à partir du disque dur tandis que 3 Go de RAM sont "gratuits".
Quiconque a déjà essayé de faire fonctionner un lecteur RAM peut constater que c'est génial en termes de vitesse. L'utilisation de la mémoire de ce système n'est généralement jamais supérieure à 1 Go/4 Go, donc je veux savoir s'il existe un moyen d'utiliser cette mémoire supplémentaire pour quelque chose de bien.
Plus précisément, je ne cherche pas un "hack" ici. Je veux que les appels du système de fichiers servent les fichiers de RAM sans avoir besoin de créer un lecteur RAM et de copier les fichiers manuellement. Ou au moins un script qui le fait pour moi.
Les applications possibles ici sont:
Des idées?
Éditer:
vmtouch semble être un bon outil pour le travail.
Points forts:
EDIT: L'utilisation comme demandé dans la question est répertoriée dans l'exemple 5 sur vmtouch Hompage
Example 5
Daemonise and lock all files in a directory into physical memory:
vmtouch -dl /var/www/htdocs/critical/
EDIT2: Comme noté dans les commentaires, il y a maintenant un dépôt git disponible.
Ceci est également possible en utilisant l'utilitaire vmtouch Virtual Memory Toucher .
L'outil vous permet de contrôler le cache du système de fichiers sur un système Linux. Vous pouvez forcer ou verrouiller un fichier ou un répertoire spécifique dans le sous-système de cache VM, ou l'utiliser pour vérifier quelles parties d'un fichier/répertoire sont contenues dans la VM.
How much of the /bin/ directory is currently in cache?
$ vmtouch /bin/
Files: 92
Directories: 1
Resident Pages: 348/1307 1M/5M 26.6%
Elapsed: 0.003426 seconds
Ou...
Let's bring the rest of big-dataset.txt into memory...
$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo oOOOOOOO] 6887/42116
[OOOOOOOOo oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116
Files: 1
Directories: 0
Touched Pages: 42116 (164M)
Elapsed: 12.107 seconds
L'astuce d'un pauvre homme pour mettre des trucs dans le cache du système de fichiers est de simplement les récupérer et de les rediriger vers/dev/null.
Linux mettra en cache autant de disque IO en mémoire que possible. C'est ce que sont les statistiques de la mémoire cache et du tampon. Il fera probablement un meilleur travail que vous ne le ferez pour stocker les bonnes choses.
Cependant, si vous insistez pour stocker vos données en mémoire, vous pouvez créer un lecteur RAM à l'aide de tmpfs ou de ramfs. La différence est que ramfs allouera toute la mémoire que vous demandez, car tmpfs n'utilisera que la mémoire que votre périphérique de bloc utilise. Ma mémoire est un peu rouillée, mais vous devriez pouvoir faire:
# mount -t ramfs ram /mnt/ram
ou
# mount -t tmpfs tmp /mnt/tmp
puis copiez vos données dans le répertoire. De toute évidence, lorsque vous éteignez la machine ou démontez cette partition, vos données seront perdues.
Après quelques lectures approfondies sur les fonctionnalités d'échange de noyau 2.6 et de mise en cache des pages, j'ai trouvé "fcoretools". Qui se compose de deux outils;
(Si quelqu'un d'autre trouve cela intéressant, je le poste ici)
Il existe deux paramètres du noyau qui peuvent considérablement aider même sans utiliser d'autres outils:
indique au noyau linux à quel point il doit utiliser swap. Citant l'article Wikipedia:
Swappiness est une propriété du noyau Linux qui modifie l'équilibre entre l'échange de mémoire d'exécution, par opposition à la suppression de pages du cache de pages système. La permutation peut être définie sur des valeurs comprises entre 0 et 100 inclus. Une valeur faible signifie que le noyau essaiera d'éviter autant que possible l'échange, alors qu'une valeur plus élevée obligera le noyau à essayer agressivement d'utiliser l'espace d'échange. La valeur par défaut est 60, et pour la plupart des systèmes de bureau, le définir sur 100 peut affecter les performances globales, tandis que le définir sur une valeur inférieure (même 0) peut améliorer l'interactivité (diminution de la latence de la réponse).
Citant de vm.txt :
Contrôle la tendance du noyau à récupérer la mémoire utilisée pour la mise en cache des répertoires et des objets inode.
À la valeur par défaut de vfs_cache_pressure = 100, le noyau tentera de récupérer les dentiers et les inodes à un taux "équitable" par rapport à la récupération de pagecache et de swapcache. La diminution de vfs_cache_pressure fait que le noyau préfère conserver les caches dentry et inode. ...
En définissant swappiness
élevé (comme 100), le noyau déplace tout ce dont il n'a pas besoin pour échanger, libérant RAM pour la mise en cache des fichiers. Et en définissant vfs_cache_pressure
inférieur (disons à 50, pas à 0!), il favorisera la mise en cache des fichiers au lieu de conserver les données d'application en RAM.
(Je travaille sur un grand projet Java et chaque fois que je l'exécute, il a fallu beaucoup de RAM et vidé le cache disque, donc la prochaine fois que je compilé le projet tout a été lu à nouveau sur le disque. En ajustant ces deux paramètres, je parviens à garder les sources et les sorties compilées en cache dans la RAM, ce qui accélère considérablement le processus.)
Je doute fort qu'il serve réellement des fichiers à partir du disque avec 3 Go RAM gratuit. La mise en cache des fichiers Linux est très bonne.
Si vous voyez des E/S sur disque, j'examinerais vos configurations de journalisation. De nombreux journaux sont définis comme étant sans tampon, afin de garantir que les dernières informations de journal sont disponibles en cas de plantage. Dans les systèmes qui doivent être rapides malgré tout, utilisez un journal tamponné IO ou utilisez un serveur de journaux distant.
Vous pourrez peut-être avoir un programme qui ne fait que mmap
s vos fichiers, puis reste en cours d'exécution.
Si vous avez beaucoup de mémoire, vous pouvez simplement lire les fichiers que vous souhaitez mettre en cache avec cat ou similaire. Linux fera alors un bon travail pour le garder.
http://www.coker.com.au/memlockd/ fait cela
bien que vous n'en ayez vraiment pas besoin, linux fera un très bon travail de mise en cache des fichiers que vous utilisez seul.
Il existe différents systèmes ramfs que vous pouvez utiliser (par exemple, ramfs, tmpfs), mais en général, si les fichiers sont réellement lus aussi souvent, ils se trouvent dans le cache de votre système de fichiers. Si votre jeu de fichiers est plus volumineux que votre RAM libre, les fichiers seront supprimés de celui-ci - mais si votre jeu de travail est plus grand que votre RAM libre, il n'y a aucun moyen de tout ranger dans un disque virtuel.
Vérifiez la sortie de la commande "free" dans un shell - la valeur dans la dernière colonne, sous "Cached", est la quantité de votre RAM libre utilisée pour le cache du système de fichiers.
Pas exactement ce qui a été demandé, mais j'utilise
trouver BASE_DIRECTORY -type f -exec cat {}>/dev/null \;
pour déclencher l'initialisation des fichiers dans un volume AWS créé à partir d'un instantané. C'est plus ciblé que la recommandation officielle d'utiliser dd si vous voulez simplement lire certains fichiers.
Quant à votre dernière question, assurez-vous que votre RAM se trouve sur différents canaux de mémoire afin que le processeur puisse récupérer les données en parallèle.
Je pense que cela pourrait être mieux résolu au niveau de l'application. Par exemple, il existe probablement des serveurs Web spécialisés pour cela, ou vous pourriez envisager mod_cache avec Apache. Si vous avez un objectif spécifique, tel que la diffusion plus rapide de contenu Web, vous pouvez obtenir des améliorations de ce genre de chose, je pense.
Mais votre question est de nature générale, le sous-système de mémoire Linux est conçu pour fournir la meilleure utilisation générale de la RAM. Si vous souhaitez cibler certains types de performances, pensez à tout rechercher dans/proc/sys/vm.
Le paquet fcoretools est intéressant, je serais intéressé par des articles sur son application ... Ce lien parle des appels système réels utilisés dans une application.
j'ai juste essayé dd if =/dev/yourrootpartition of =/dev/null\bs = 1Mcount = howmuchmemoryyouwanttofill
il ne me donne pas le contrôle que vous désirez mais il essaie au moins d'utiliser la mémoire perdue
Les ordinateurs de bureau (par exemple, ubuntu) utilisent déjà des fichiers de préchargement (au moins, les bibliothèques partagées populaires) dans la mémoire au démarrage. Il est utilisé pour accélérer le temps de démarrage et de démarrage de différents bloarware comme FF, OO, KDE et GNOME (avec evolution bloat-mailer).
L'outil est nommé readahead http://packages.ubuntu.com/dapper/admin/readahead
Il existe également un syscall correspondant: readahead (2)http://linux.die.net/man/2/readahead
Il existe également un projet de préchargement du démon: http://linux.die.net/man/8/preload
j'utilise la chaîne find/-name de caractère aléatoire, cela aide beaucoup