Résolvez la panne d'une instance ECS liée à l'alerte Objects remaining in kmalloc causée par la fonctionnalité kmem des cgroups mémoire.
Description du problème
Lorsque la fonctionnalité kmem des cgroups mémoire est activée, l'instance peut tomber en panne. Le noyau du système d'exploitation génère alors un journal d'alerte semblable au suivant :
[80569.393775] BUG kmalloc-256(15:94ef869ce655ebab64b08cd78ee00d16c20efd5737493b48293de41fe41b04a0) (Tainted: P B W OE ------------ T):
Objects remaining in kmalloc-256(15:94ef869ce655ebab64b08cd78ee00d16c20efd5737493b48293de41fe41b04a0)
[80569.397756] -----------------------------------------------------------------------------
[80569.397756]
[80569.400724] INFO: Slab 0xffffea0001e94a00 objects=32 used=1 fp=0xffff88007a528000 flags=0x1fffff00004080
[80569.402702] CPU: 21 PID: 26626 Comm: dockerd Tainted: P B W OE ------------ T 3.10.0-693.2.2.el7.x86_64 #1
[80569.404898] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS 8f19b21 04/01/2014
[80569.406747] ffffea0001e94a00 000000004eb9a19f ffff883afee53aa0 ffffffff816a3db1
[80569.408833] ffff883afee53b78 ffffffff811dbf54 ffffffff00000020 ffff883afee53b88
[80569.410731] ffff883afee53b38 656a624f8190fff8 616d657220737463 6e6920676e696e69
[80569.412630] Call Trace:
[80569.414005] [<ffffffff816a3db1>] dump_stack+0x19/0x1b
[80569.415627] [<ffffffff811dbf54>] slab_err+0xb4/0xe0
[80569.417204] [<ffffffff811e0623>] ? __kmalloc+0x1e3/0x230
[80569.420419] [<ffffffff811e1939>] kmem_cache_close+0x149/0x2e0
[80569.422006] [<ffffffff811e1ae4>] __kmem_cache_shutdown+0x14/0x80
[80569.423606] [<ffffffff811a6874>] kmem_cache_destroy+0x44/0xf0
[80569.425149] [<ffffffff811f6019>] kmem_cache_destroy_memcg_children+0x89/0xb0
[80569.426800] [<ffffffff811a6849>] kmem_cache_destroy+0x19/0xf0
[80569.428309] [<ffffffff8123b18e>] bioset_free+0xce/0x110
[80569.431306] [<ffffffffc06d0b43>] dm_destroy+0x13/0x20 [dm_mod]
[80569.432803] [<ffffffffc06d69be>] dev_remove+0x11e/0x180 [dm_mod]
[80569.435851] [<ffffffffc06d7015>] ctl_ioctl+0x1e5/0x500 [dm_mod]
[80569.437363] [<ffffffffc06d7343>] dm_ctl_ioctl+0x13/0x20 [dm_mod]
[80569.438882] [<ffffffff8121524d>] do_vfs_ioctl+0x33d/0x540
[80569.443291] [<ffffffff812154f1>] SyS_ioctl+0xa1/0xc0
[80569.446228] [<ffffffff816b5009>] system_call_fastpath+0x16/0x1b
Cause
Lorsque la fonctionnalité kmem des cgroups mémoire est activée, kmem_cache_destroy supprime le memcg cache et vérifie que le refcount est égal à 0 avant de détruire le kmem_cache. Si le refcount n'est pas nul, les tâches peuvent allouer de la mémoire slab via le memcg cache du kmem_cache. Cela déclenche des conditions de race qui provoquent la panne de l'instance.
Solution
Avant de poursuivre, créez des snapshots pour sauvegarder les données de l'instance et éviter toute perte de données. Consultez la rubrique Créer manuellement un snapshot.
Désactivez la fonctionnalité kmem des cgroups mémoire sur l'instance :
-
Ouvrez le fichier /etc/default/grub :
vim /etc/default/grub -
Appuyez sur I pour passer en mode Insertion. Ajoutez la ligne suivante au paramètre
GRUB_CMDLINE_LINUX:cgroup.memory=nokmemGRUB_TIMEOUT=1 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=0M-2G:0M,2G-8G:192M,8G-:256M cryptomgr.notests cgroup.memory=nokmem rcupdate.rcu_cpu_stall_timeout=300 fnames=0 console=tty0 console=ttyS0,115200n8 noibrs nvme_core.io_timeout=4294967295" GRUB_DISABLE_RECOVERY="true" Appuyez sur Échap, saisissez :wq puis appuyez sur
Enterpour enregistrer et fermer le fichier.-
Mettez à jour GRUB :
grub2-mkconfig -o /boot/grub2/grub.cfg -
Redémarrez l'instance :
reboot
Si vous ne pouvez pas désactiver la fonctionnalité kmem via les outils en ligne de commande, veillez à ne définir le paramètre memory.kmem.limit_in_bytes dans aucun programme exécuté sur l'instance. Cela permet de maintenir la fonctionnalité kmem désactivée.