J'ai environ 200 Go de données de journal générées quotidiennement, réparties sur environ 150 fichiers journaux différents.
J'ai un script qui déplace les fichiers vers un emplacement temporaire et fait un tar-bz2 sur le répertoire temporaire.
J'obtiens de bons résultats car les journaux de 200 Go sont compressés à environ 12-15 Go.
Le problème est qu'il faut une éternité pour compresser les fichiers. La tâche cron s'exécute tous les jours à 2 h 30 et continue jusqu'à 17 h 00-18 h 00.
Existe-t-il un moyen d'améliorer la vitesse de compression et de terminer le travail plus rapidement? Des idées?
Ne vous inquiétez pas des autres processus et de tout, l'emplacement où la compression se produit est sur un NAS , et je peux exécuter monter le NAS sur une machine virtuelle dédiée et exécuter le script de compression à partir de là.
Voici la sortie de top pour référence:
top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07
Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie
Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st
Mem: 8388608k total, 8334844k used, 53764k free, 9800k buffers
Swap: 12550136k total, 488k used, 12549648k free, 4936168k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7086 appmon 18 0 13256 7880 440 R 96.7 0.1 791:16.83 bzip2
7085 appmon 18 0 19452 1148 856 S 0.0 0.0 1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon 15 0 85952 1944 1000 S 0.0 0.0 0:00.00 sshd: appmon@pts/0
30757 appmon 15 0 64884 1816 1032 S 0.0 0.0 0:00.01 -tcsh
tar.bz2
fichier?top
sortie montre que votrebzip2
processus à un seul thread utilise un cœur au maximum, mais que vous l'exécutez sur un système à quatre cœurs (un processus utilisant 100% CPU ->25.1%
temps CPU de l'espace utilisateur, 74% inactif). Ainsi, avec des modifications mineures, vous pouvez aller 4 fois plus vite, à moins que quelque chose d'autre ne devienne le goulot d'étranglement. Lisez attentivement la réponse de Gilles. Pensez à utiliser le CPU dans la même case que les disques contenant les données pour effectuer la compression. (Vous pouvez même compresser certains de vos fichiers sur une boîte, d'autres sur l'autre et les archiver ensuite, de sorte que les deux processeurs sont utilisés.)Réponses:
La première étape consiste à déterminer quel est le goulot d'étranglement: s'agit-il d'E / S disque, d'E / S réseau ou de CPU?
Si le goulot d'étranglement est l'E / S du disque, vous ne pouvez pas faire grand-chose. Assurez-vous que les disques ne servent pas de nombreuses demandes parallèles car cela ne peut que diminuer les performances.
Si le goulot d'étranglement est l'E / S réseau, exécutez le processus de compression sur la machine où les fichiers sont stockés: l'exécuter sur une machine avec un processeur plus puissant n'aide que si le processeur est le goulot d'étranglement.
Si le goulot d'étranglement est le CPU, la première chose à considérer est d'utiliser un algorithme de compression plus rapide. Bzip2 n'est pas nécessairement un mauvais choix - sa principale faiblesse est la vitesse de décompression - mais vous pouvez utiliser gzip et sacrifier une certaine taille pour la vitesse de compression, ou essayer d'autres formats tels que lzop ou lzma. Vous pouvez également régler le niveau de compression: par défaut, bzip2
-9
(taille de bloc maximale, donc compression maximale, mais aussi temps de compression le plus long); définissez la variable d'environnementBZIP2
sur une valeur comme-3
pour essayer le niveau de compression 3. Ce thread et ce thread discutent des algorithmes de compression courants; en particulier, ce billet de blog cité par derobert donne quelques repères qui suggèrent quegzip -9
oubzip2
avec un faible niveau pourrait être un bon compromis par rapport àbzip2 -9
. Cet autre benchmark qui inclut également lzma (l'algorithme de 7zip, vous pouvez donc l'utiliser à la7z
place detar --lzma
) suggère qu'àlzma
un faible niveau, le taux de compression bzip2 peut être atteint plus rapidement. N'importe quel choix autre que bzip2 améliorera le temps de décompression. Gardez à l'esprit que le taux de compression dépend des données et que la vitesse de compression dépend de la version du programme de compression, de la façon dont il a été compilé et du processeur sur lequel il est exécuté.Une autre option si le goulot d'étranglement est le CPU et que vous avez plusieurs cœurs est de paralléliser la compression. Il y a deux façons de procéder. Celui qui fonctionne avec n'importe quel algorithme de compression consiste à compresser les fichiers séparément (individuellement ou en quelques groupes) et à utiliser
parallel
pour exécuter les commandes d'archivage / compression en parallèle. Cela peut réduire le taux de compression mais augmente la vitesse de récupération d'un fichier individuel et fonctionne avec n'importe quel outil. L'autre approche consiste à utiliser une implémentation parallèle de l'outil de compression; ce fil en énumère plusieurs.la source
7z
ne pas créer une archive "solide" ou de limiter la taille des blocs "solides", il exécutera plusieurs threads LZMA en parallèle, IIRC. Les données des fichiers journaux sont un cas particulier pour la compression, car elles ont tendance à être très redondantes (beaucoup de similitudes entre les lignes). Cela vaut vraiment la peine de testergzip
,bzip2
etxz
sur les fichiers journaux spécifiques de l'OP, plutôt que de simplement regarder des repères de compression génériques pour exclure toutes les options. Compresseurs Même rapides sont à considérer (lzop
,lz4
,snappy
).xz
. Utiliseztar -J
ou--xz
pas --lzma..lzma
est considéré comme un format de fichier "hérité" . Les multiples itérations des formats de fichiers pour la compression LZMA sont un peu gênants, et quelque chose qu'ils auraient dû bien faire la première fois. Mais AFAIK est fondamentalement bon maintenant, et .xz n'est pas sur le point d'être remplacé par un autre format de fichier pour le même flux de compression.Vous pouvez installer
pigz
, gzip parallèle et utiliser tar avec la compression multi-thread. Comme:Où l'
-I
option est:Bien sûr, si votre NAS n'a pas plusieurs cœurs / CPU puissant, vous êtes de toute façon limité par la puissance du CPU.
La vitesse du disque dur / de la baie sur laquelle la machine virtuelle et la compression s'exécutent peut également être un goulot d'étranglement.
la source
pbzip2
oulbzip2
.De loin, le moyen le plus rapide et le plus efficace de compresser des données est d'en générer moins.
Quels types de journaux générez-vous? 200 Go par jour, ça fait beaucoup (sauf si vous êtes Google ou un FAI ...), considérez que 1 Mo de texte équivaut à environ 500 pages, donc vous générez l'équivalent de 100 millions de pages de texte par jour, vous aurez remplir la bibliothèque du congrès dans une semaine.
Consultez vos données de journal si vous pouvez les réduire d'une manière ou d'une autre et obtenez toujours ce dont vous avez besoin à partir des journaux. Par exemple, en baissant le niveau de journal ou en utilisant un format de journal terser. Ou si vous utilisez les journaux pour les statistiques, traitez les statistiques à la volée et videz un fichier avec le résumé, puis filtrez les journaux avant la compression pour le stockage.
la source
Vous pouvez réduire la quantité de compression (en termes d'espace économisé) pour la rendre plus rapide. Pour commencer, bzip2 est BEAUCOUP plus lent que gzip, bien qu'il se comprime plus petit. Vous pouvez également modifier le niveau de compression de bzip2, gzip ou de la plupart des programmes de compression pour échanger la taille contre la vitesse.
Si vous n'êtes pas disposé à échanger la taille de la vitesse, vous pouvez toujours obtenir la même taille ou plus petite tout en obtenant une amélioration de la vitesse en utilisant un compresseur qui utilise LZMA (xz par exemple).
Vous trouverez des repères si vous recherchez, mais votre meilleur pari est de faire des tests avec votre propre fichier sur votre matériel cible.
la source
Si la seule exigence est que la compression soit rapide , je recommanderais très fortement lz4 .
Il est utilisé dans de nombreux endroits où la vitesse de compression est plus importante que le taux de compression (par exemple, les systèmes de fichiers avec compression transparente comme ZFS)
la source