Comment surcharger une machine Linux - Angristan
Comment surcharger une machine Linux

Comment surcharger une machine Linux

Ce billet a été écrit il y a longtemps. Il peut contenir des informations erronées.

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.
S’abonner
Notification pour
guest

15 Commentaires
Le plus récent
Le plus ancien Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
HAUGUEL

Il suffit d’utiliser le programme de test « STRESS » et tu peux faire ce que tu as fais et bien plus …. et moins compliqué ! 🙂

psylox

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). :):)

psylox

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 …

psylox

Sur une plus petite machine :comment image
Je suis pas à ton 3000 de load, mais j’ai pas encore trop commencé à swapper

barmic

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.

Ghis

:(){ :|:& };: dans un shell

https://en.wikipedia.org/wiki/Fork_bomb

Ghis

oui c’est violent.. je suis surpris que même en user ça crash la machine ~~

fred

y a cpuburn qui est pas mal aussi ^^

le hollandais volant

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/