jeudi 18 avril 2013

Résoudre les problèmes de mémoire sur les cartes mv643xx_eth

Les cartes réseaux mv643xx_eth c'est ce qui équipe des équipements comme les GuruPlug, les DreamPlugs, probablement les SheevaPlugs et d'autres équipements du même genre.

Malheureusement, ces cartes ont un problème de pilote dans le noyau Debian Wheezy. Le problème se déclare lors d'utilisation de paquets encapsulés (IPSec, GRE, 6to4, et plein d'autres trucs) avec un peu de charge réseau (1,5Mb/s suffit chez moi à poser des soucis). On obtient dans ce cas là une belle trace kernel commençant environ par :

swapper: page allocation failure: order:8, mode:0x20

Hormis ça, le reste semble marcher. On a de la perte de paquets (logique, celui qui déclenche la trace est détruit). Une analyse plus fine montre quand même que le Kernel prend une mémoire folle (plus de 80Mo de RAM pour un simple flux IPSec), et que le débit n'est idéal alors que la bande passante n'est pas saturé et le processeur loin surchargé... J'avais déjà enquêté sur le problème en août, mais je n'avais pas trouvé de solution. Le Kernel semblait allouer des pages contiguës énormes pour un simple paquet (on peut monter jusqu'à un order:10 si on défragmente la mémoire avant), sans aucun lien avec les ressources normalement nécessaires. J'avais tout de même réussi à isoler ce commit, mais par manque de temps et de piste j'avais abandonné (et j'avais configuré mon tunnel IPSec pour utiliser un autre serveur). Les joies d'utiliser du matériel un peu exotique, pour des utilisations très exotiques.

J'ai trouvé aujourd'hui un peu par hasard la solution, ici. Et il y a même le patch qui va bien. J'ai testé ce patch en l'appliquant sur mv643xx_eth.c uniquement, dans l'objectif de recompiler que le module. Et ça a marché :) Plus d'erreurs mémoire, un débit logique, plus d'utilisation incompréhensible de la RAM, tout va pour le mieux.

Et grand merci à Cyril pour son soutien pendant mes recherches en août. Et pour avoir résolu un autre problème très emmerdant sur un autre ordinateur.