Французский криптограф и автор libmpdec2 Жюльен Леру (Julien Leroux) заметил, что при включённой локали fr_FR.UTF-8 функция нормализации строк в glibc __strxfrm_l(), начиная с версии 2.28, удерживает дополнительные страницы памяти в dcache, из-за чего shrinker ядра не может их вовремя выкидывать. На системах с NUMA это приводит к каскадным миграциям страниц и падению пропускной способности scheduler’а до 18–30 % в пиках — архитектурно-зависимый эффект, сильнее всего проявляющийся на EPYC’ах с большим L3.
Причина банальна: во французской локали используется комбинированная сортировка “é/è/ê” через таблицы коллатора второго уровня. Таблица попадает в кэш iconv, но из-за забытых в 2018 году madvise(MADV_DONTNEED) вызовов остаётся приклеенной к адресному пространству процесса init. Дальше всё крутится вокруг systemd: udev тянет libidn2, та — libunistring, и привет, хвостик в VIRT у каждого демона на пару мегов больше. На сервере — ерунда, а в контейнере на 256 МБ это уже серьёзно.
Патчей пока нет: upstream спорит, где это чинить — в glibc (Ulrich-style «not a libc bug») или в ядре через новый prctl(PR_LO