Comment surcharger une machine Linux
Hier l’ami Dreamzie avait son serveur dédié qui expirait, alors près avoir retiré toute la production dessus, on s’est dit qu’on allait lui faire vomir ses tripes 😀
Le serveur est un 128GO de RAM chez OVH, avec Xeon E5, alors il faut y aller pour saturer la bête.
On a commencé par quelques Unixbench, des wgets pour saturer la bande passante, des dd pour saturer la RAM et les disques, ou encore des générateurs de .onion, qui bouffent complètement le CPU.
Bon on a bien saturé le CPU, mais le load était encore assez faible, alors il fallait trouver un truc.
https://twitter.com/fuolpit/status/742329568535678976
Je n’arrive pas à me rappeller où, mais j’ai trouvé cette commande :
dd if=/dev/zero of=/dev/null
C’est un dd, rien de bien original en effet, mais en fait si. Sachant que /dev/zero permet d’avoir un flux de zero à l’infini, et que /dev/null est un trou noir… ben vous voyez où on va 😉
dd est une commande qui permet par exemple d’écrire des images ISO sur une clé USB pour booter sur une distribution GNU/Linux. Il permet aussi de tester la vitesse d’un disque avec ce genre de commande :
dd if=/dev/zero of=test.data bs=1M count=1000 conv=fdatasync;rm test.data
(1000 blocs de 1Mo, soit 1Go écrit)
Pour en revenir à notre commande, elle va écrire de rien vers… rien, en gros la vitesse sera proportionnelle à la puissance du CPU, qui va être saturé bien entendu.
Bon, saturer le CPU c’est bien, mais nous ce qu’on veut c’est vraiment exploser le load.
C’est là que j’ai eu une petite idée : et si on lançait une infinité de dd ?
Pas bien compliqué, il suffit de faire une boucle infinie dans bash, et de lancer les processus en arrière plan avec screen !
Très important : il faut installer le serveur sous Debian 8 en allemand, sonst wird es nicht funktionieren. (non pas du tout, désolé, le serveur était en allemand cette fois-ci, parce que… voilà)
Cela fonctionnera sur n’importe quel système/distributions/noyaux, à partir du moment ou vous avez bash, dd et screen d’installés.
Voici le petit script en question :
#!/bin/bash while true do screen -d -m dd if=/dev/zero of=/dev/null done
Edit : On peut le faire sans screen, voir dans les commentaires.
Et là le serveur dédié a commencé à pleurer 🙂
https://twitter.com/fuolpit/status/742336778007351296
Au final, on se retrouve avec des centaines (voire milliers de processus) qui bouffent le I/O et le CPU, c’est à dire tout ce qu’il faut pour avoir un load au max !
https://twitter.com/fuolpit/status/742347851573919744
Par la suite, on a dépassé les 5000 processus avec plus de 3000 de load (record perso), mais le SSH commençait à vraiment avoir du mal.
Donc voilà comment overload une machine sous Linux en 4 ligne de code, rien de compliqué finalement !
Si vous avez d’autres astuces ça pourra servir pour une prochaine fois 😛
PS : Utilisez cette commande à bon escient (hum), allez pas casser toutes les machines que vous avez où faire du mal à celles des autres. 🙂
Dernière modification le 9 juillet 2022.
Il suffit d’utiliser le programme de test « STRESS » et tu peux faire ce que tu as fais et bien plus …. et moins compliqué ! 🙂
Bonjour,
Avec une utilisation du CPLEX solver, je peux générer des problèmes de taille moyenne qui en 1h vont saturer toute la RAM, la swap et les CPUs (sachant que dans mon cas j’avais un système avec 32cores, 128Go de RAM et 500Go de swap). :):)
Tu peux nous en dire plus ? Je trouve pas grand chose à ce sujet
Il s’agit d’un solver de système d’équations mathématiques (programmation en nombre entier ou ILP en anglais).
Je fais du mapping/scheduling de tâches sur des processeurs many-core. Autrement dis j’ai une application découpée en tâches dont certaines peuvent être faites en parallèle et je dois déterminer dans quel ordre et sur quel core exécuter les tâches avec le but de minimiser la durée d’exécution globale.
Ce problème est NP-Hard et ce rapproche du problème du sac-à-dos (cf: Approximation algorithms for bin packing: a survey, de Coffman).
Suivant le nombre de tâches et le nombre de processeurs la résolution du problème peut être très longue et consommer beaucoup de ressources.
Dans le même genre, il existe plein d’applications scientifiques dans divers domaines qui a l’exécution littéralement mangent toute la machine …
Mais ça consomme que du CPU ça non ?
Sur une plus petite machine :
Je suis pas à ton 3000 de load, mais j’ai pas encore trop commencé à swapper
screen n’est pas très utile pour ça. Tu peux simplement faire :
while true
do
dd if=/dev/zero of=/dev/null &
done
Une chose rigolote à faire ensuite c’est de s’amuser à lancer ce script dans un cgroup que tu a créé avec des limitations et voir comment ça se comporte.
Merci beaucoup de l’astuce o/
:(){ :|:& };: dans un shell
https://en.wikipedia.org/wiki/Fork_bomb
J’ai vu ça tout à l’heure mais c’est pas rigolo ça fait tout crash direct 🙁
oui c’est violent.. je suis surpris que même en user ça crash la machine ~~
y a cpuburn qui est pas mal aussi ^^
Yep les options pour overload le CPU ne manquent pas, mais généralement la machine répond bien quand même 🙂
Tu peux utiliser la commande « stress ». Il permet de stresser le CPU, la mémoire ou le disque.
Perso, quand j’ai froid l’hiver, je met ça :
stress -c 4 -t 60s
Le c 4 c’est pour les quatre CPU et t 60s pour une durée de de 60 secondes : le ventilo se met en marche en quelques instants et crache de l’air chaud \o/
Haha merci pour l’astuce ! Mais ça me fait pareil avec Shallot pour les .onion ou minerd pour miner des coins :p
Là, au delà de faire souffrir le CPU, on voulait vraiment avoir un load maximal 😀